Mercurial > projects > dang
annotate sema/TypeCheck.d @ 191:e799db8d9cb0
Fixed a small bug. Passes two more tests now.
author | Anders Johnsen <skabet@gmail.com> |
---|---|
date | Fri, 25 Jul 2008 14:44:50 +0200 |
parents | 86a2ede00e9a |
children | 658178183018 |
rev | line source |
---|---|
92
771ac63898e2
A few better parser errors plus renaming most of the sema classes to match that they do now. Some have changes a lot.
Anders Johnsen <skabet@gmail.com>
parents:
88
diff
changeset
|
1 module sema.TypeCheck; |
70
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
2 |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
3 import sema.Visitor, |
158
57b0b4464a0b
Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents:
126
diff
changeset
|
4 sema.Symbol, |
70
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
5 sema.DType; |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
6 |
158
57b0b4464a0b
Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents:
126
diff
changeset
|
7 import tango.io.Stdout, |
57b0b4464a0b
Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents:
126
diff
changeset
|
8 Integer = tango.text.convert.Integer; |
70
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
9 |
114
3a0cd42de9cc
Removed misc/Error.d and is now using the error system all way through.
Anders Johnsen <skabet@gmail.com>
parents:
107
diff
changeset
|
10 import basic.SourceLocation, |
3a0cd42de9cc
Removed misc/Error.d and is now using the error system all way through.
Anders Johnsen <skabet@gmail.com>
parents:
107
diff
changeset
|
11 basic.Message; |
70
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
12 |
92
771ac63898e2
A few better parser errors plus renaming most of the sema classes to match that they do now. Some have changes a lot.
Anders Johnsen <skabet@gmail.com>
parents:
88
diff
changeset
|
13 class TypeCheck : Visitor!(void) |
70
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
14 { |
114
3a0cd42de9cc
Removed misc/Error.d and is now using the error system all way through.
Anders Johnsen <skabet@gmail.com>
parents:
107
diff
changeset
|
15 this(MessageHandler messages) |
70
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
16 { |
114
3a0cd42de9cc
Removed misc/Error.d and is now using the error system all way through.
Anders Johnsen <skabet@gmail.com>
parents:
107
diff
changeset
|
17 this.messages = messages; |
70
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
18 } |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
19 |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
20 override void visitBinaryExp(BinaryExp exp) |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
21 { |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
22 super.visitBinaryExp(exp); |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
23 |
126
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
24 if(!(exp.left.type is exp.right.type)) |
70
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
25 { |
126
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
26 if (!exp.right.type.hasImplicitConversionTo(exp.left.type) && |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
27 !exp.left.type.hasImplicitConversionTo(exp.right.type)) |
114
3a0cd42de9cc
Removed misc/Error.d and is now using the error system all way through.
Anders Johnsen <skabet@gmail.com>
parents:
107
diff
changeset
|
28 messages.report(InvalidImplicitCast, exp.loc) |
3a0cd42de9cc
Removed misc/Error.d and is now using the error system all way through.
Anders Johnsen <skabet@gmail.com>
parents:
107
diff
changeset
|
29 .arg(exp.right.type.toString) |
3a0cd42de9cc
Removed misc/Error.d and is now using the error system all way through.
Anders Johnsen <skabet@gmail.com>
parents:
107
diff
changeset
|
30 .arg(exp.left.type.toString); |
126
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
31 else |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
32 { |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
33 CastExp castExp; |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
34 if(exp.left.type.isReal && exp.right.type.isReal) |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
35 if(exp.left.type.byteSize > exp.right.type.byteSize) |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
36 castExp = new CastExp( |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
37 SLoc.Invalid, |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
38 new Identifier(exp.left.type.name), |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
39 exp.right); |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
40 else |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
41 castExp = new CastExp( |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
42 SLoc.Invalid, |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
43 new Identifier(exp.right.type.name), |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
44 exp.left); |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
45 else if(exp.left.type.isReal || exp.right.type.isReal) |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
46 if(exp.left.type.isReal) |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
47 castExp = new CastExp( |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
48 SLoc.Invalid, |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
49 new Identifier(exp.left.type.name), |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
50 exp.right); |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
51 else |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
52 castExp = new CastExp( |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
53 SLoc.Invalid, |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
54 new Identifier(exp.right.type.name), |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
55 exp.left); |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
56 else |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
57 if(exp.left.type.byteSize > exp.right.type.byteSize) |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
58 castExp = new CastExp( |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
59 SLoc.Invalid, |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
60 new Identifier(exp.left.type.name), |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
61 exp.right); |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
62 else if(exp.left.type.byteSize > exp.right.type.byteSize) |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
63 castExp = new CastExp( |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
64 SLoc.Invalid, |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
65 new Identifier(exp.right.type.name), |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
66 exp.left); |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
67 else |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
68 castExp = new CastExp( |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
69 SLoc.Invalid, |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
70 new Identifier(exp.left.type.name), |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
71 exp.right); |
70
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
72 |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
73 |
126
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
74 if(castExp) |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
75 { |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
76 castExp.env = exp.env; |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
77 if(castExp.exp == exp.right) |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
78 exp.right = castExp; |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
79 else |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
80 exp.left = castExp; |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
81 |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
82 } |
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
83 } |
70
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
84 } |
184
86a2ede00e9a
Oops, compile breaking commit.
Anders Johnsen <skabet@gmail.com>
parents:
183
diff
changeset
|
85 if (exp.op >= BinaryExp.Operator.LeftShift && |
86a2ede00e9a
Oops, compile breaking commit.
Anders Johnsen <skabet@gmail.com>
parents:
183
diff
changeset
|
86 exp.op <= BinaryExp.Operator.UnsignedRightShift) |
183
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
87 {} // FIXME: When we have const-system we need to check for |
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
88 // right site being larger then the bitsize of the |
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
89 // left |
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
90 } |
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
91 |
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
92 override void visitDerefExp(DerefExp exp) |
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
93 { |
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
94 if (!exp.exp.type.isPointer) |
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
95 { |
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
96 messages.report(CanOnlyDerefPointers, |
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
97 [exp.exp.sourceRange][], |
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
98 [exp.loc]) |
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
99 .arg(exp.exp.type.toString); |
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
100 |
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
101 exp._type = DType.Int; |
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
102 } |
70
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
103 } |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
104 |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
105 override void visitCallExp(CallExp exp) |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
106 { |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
107 super.visitCallExp(exp); |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
108 |
174
20ff3c31f600
Putting symbol on MemberRef -calls.
Anders Johnsen <skabet@gmail.com>
parents:
168
diff
changeset
|
109 if (auto iden = cast(MemberReference)exp.exp) |
20ff3c31f600
Putting symbol on MemberRef -calls.
Anders Johnsen <skabet@gmail.com>
parents:
168
diff
changeset
|
110 { |
20ff3c31f600
Putting symbol on MemberRef -calls.
Anders Johnsen <skabet@gmail.com>
parents:
168
diff
changeset
|
111 Symbol[] internalVisitMemberRef(MemberReference m) |
20ff3c31f600
Putting symbol on MemberRef -calls.
Anders Johnsen <skabet@gmail.com>
parents:
168
diff
changeset
|
112 { |
20ff3c31f600
Putting symbol on MemberRef -calls.
Anders Johnsen <skabet@gmail.com>
parents:
168
diff
changeset
|
113 Symbol[] visitRef(MemberReference m, Identifier target, Symbol st) |
20ff3c31f600
Putting symbol on MemberRef -calls.
Anders Johnsen <skabet@gmail.com>
parents:
168
diff
changeset
|
114 { |
20ff3c31f600
Putting symbol on MemberRef -calls.
Anders Johnsen <skabet@gmail.com>
parents:
168
diff
changeset
|
115 auto child = m.child; |
20ff3c31f600
Putting symbol on MemberRef -calls.
Anders Johnsen <skabet@gmail.com>
parents:
168
diff
changeset
|
116 auto res = st.findMembers(child.get); |
20ff3c31f600
Putting symbol on MemberRef -calls.
Anders Johnsen <skabet@gmail.com>
parents:
168
diff
changeset
|
117 return res; |
20ff3c31f600
Putting symbol on MemberRef -calls.
Anders Johnsen <skabet@gmail.com>
parents:
168
diff
changeset
|
118 } |
20ff3c31f600
Putting symbol on MemberRef -calls.
Anders Johnsen <skabet@gmail.com>
parents:
168
diff
changeset
|
119 switch(m.target.expType) |
20ff3c31f600
Putting symbol on MemberRef -calls.
Anders Johnsen <skabet@gmail.com>
parents:
168
diff
changeset
|
120 { |
20ff3c31f600
Putting symbol on MemberRef -calls.
Anders Johnsen <skabet@gmail.com>
parents:
168
diff
changeset
|
121 case ExpType.Identifier: |
20ff3c31f600
Putting symbol on MemberRef -calls.
Anders Johnsen <skabet@gmail.com>
parents:
168
diff
changeset
|
122 return visitRef(m, cast(Identifier)m.target, |
20ff3c31f600
Putting symbol on MemberRef -calls.
Anders Johnsen <skabet@gmail.com>
parents:
168
diff
changeset
|
123 (cast(Identifier)m.target).getSymbol); |
20ff3c31f600
Putting symbol on MemberRef -calls.
Anders Johnsen <skabet@gmail.com>
parents:
168
diff
changeset
|
124 case ExpType.MemberReference: |
20ff3c31f600
Putting symbol on MemberRef -calls.
Anders Johnsen <skabet@gmail.com>
parents:
168
diff
changeset
|
125 Symbol[] s = internalVisitMemberRef(cast(MemberReference)m.target); |
20ff3c31f600
Putting symbol on MemberRef -calls.
Anders Johnsen <skabet@gmail.com>
parents:
168
diff
changeset
|
126 if(s.length) |
20ff3c31f600
Putting symbol on MemberRef -calls.
Anders Johnsen <skabet@gmail.com>
parents:
168
diff
changeset
|
127 return s; |
20ff3c31f600
Putting symbol on MemberRef -calls.
Anders Johnsen <skabet@gmail.com>
parents:
168
diff
changeset
|
128 return visitRef(m, cast(Identifier)m.target, s[0]); |
20ff3c31f600
Putting symbol on MemberRef -calls.
Anders Johnsen <skabet@gmail.com>
parents:
168
diff
changeset
|
129 } |
20ff3c31f600
Putting symbol on MemberRef -calls.
Anders Johnsen <skabet@gmail.com>
parents:
168
diff
changeset
|
130 } |
20ff3c31f600
Putting symbol on MemberRef -calls.
Anders Johnsen <skabet@gmail.com>
parents:
168
diff
changeset
|
131 |
20ff3c31f600
Putting symbol on MemberRef -calls.
Anders Johnsen <skabet@gmail.com>
parents:
168
diff
changeset
|
132 Exp[] newArgs; |
20ff3c31f600
Putting symbol on MemberRef -calls.
Anders Johnsen <skabet@gmail.com>
parents:
168
diff
changeset
|
133 |
181
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
134 DFunction function_type; |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
135 if (iden.type.isFunction()) |
174
20ff3c31f600
Putting symbol on MemberRef -calls.
Anders Johnsen <skabet@gmail.com>
parents:
168
diff
changeset
|
136 { |
181
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
137 Symbol[] methods = internalVisitMemberRef(iden); |
174
20ff3c31f600
Putting symbol on MemberRef -calls.
Anders Johnsen <skabet@gmail.com>
parents:
168
diff
changeset
|
138 |
181
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
139 if (!methods.length) |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
140 { |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
141 messages.report(NoMethodByName, iden.loc); |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
142 return; |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
143 } |
174
20ff3c31f600
Putting symbol on MemberRef -calls.
Anders Johnsen <skabet@gmail.com>
parents:
168
diff
changeset
|
144 |
181
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
145 Symbol sel = getBestMatch(exp.args, methods); |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
146 exp.callSym = sel; |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
147 if (sel) |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
148 function_type = sel.type.asFunction(); |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
149 else |
174
20ff3c31f600
Putting symbol on MemberRef -calls.
Anders Johnsen <skabet@gmail.com>
parents:
168
diff
changeset
|
150 { |
181
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
151 messages.report(NoMachingMethod, exp.loc); |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
152 foreach ( i, s ; methods ) |
174
20ff3c31f600
Putting symbol on MemberRef -calls.
Anders Johnsen <skabet@gmail.com>
parents:
168
diff
changeset
|
153 { |
181
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
154 messages.report(CandidateNr, |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
155 (cast(FuncDecl)s.decl).identifier.loc) |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
156 .arg(Integer.toString(i+1)); |
174
20ff3c31f600
Putting symbol on MemberRef -calls.
Anders Johnsen <skabet@gmail.com>
parents:
168
diff
changeset
|
157 } |
20ff3c31f600
Putting symbol on MemberRef -calls.
Anders Johnsen <skabet@gmail.com>
parents:
168
diff
changeset
|
158 } |
20ff3c31f600
Putting symbol on MemberRef -calls.
Anders Johnsen <skabet@gmail.com>
parents:
168
diff
changeset
|
159 } |
181
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
160 else if (iden.type.isCallable) |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
161 function_type = iden.type.asCallable(); |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
162 else assert(0, "Should not happen"); |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
163 |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
164 foreach (i, arg; exp.args) |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
165 { |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
166 auto argType = function_type.params[i]; |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
167 auto expType = arg.type; |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
168 if (argType.isSame(expType)) |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
169 { |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
170 if (!expType.hasImplicitConversionTo(argType)) |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
171 messages.report(InvalidImplicitCast, exp.loc) |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
172 .arg(expType.toString) |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
173 .arg(argType.toString); |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
174 |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
175 auto castExp = new CastExp( |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
176 SLoc.Invalid, |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
177 new Identifier(argType.name), |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
178 arg); |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
179 castExp.env = iden.env; |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
180 newArgs ~= castExp; |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
181 } |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
182 else |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
183 newArgs ~= arg; |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
184 } |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
185 exp.args = newArgs; |
174
20ff3c31f600
Putting symbol on MemberRef -calls.
Anders Johnsen <skabet@gmail.com>
parents:
168
diff
changeset
|
186 } |
20ff3c31f600
Putting symbol on MemberRef -calls.
Anders Johnsen <skabet@gmail.com>
parents:
168
diff
changeset
|
187 else if (auto iden = cast(Identifier)exp.exp) |
70
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
188 { |
168
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
189 Exp[] newArgs; |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
190 |
181
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
191 DFunction function_type; |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
192 if (iden.type.isFunction()) |
168
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
193 { |
181
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
194 Symbol[] methods; |
168
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
195 |
181
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
196 foreach (decl ; iden.env.find(iden.get)) |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
197 methods ~= decl.sym; |
168
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
198 |
181
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
199 if (!methods.length) |
168
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
200 { |
181
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
201 messages.report(NoMethodByName, iden.loc); |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
202 return; |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
203 } |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
204 |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
205 Symbol sel = getBestMatch(exp.args, methods); |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
206 exp.callSym = sel; |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
207 if (sel) |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
208 function_type = sel.type.asFunction(); |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
209 else |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
210 { |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
211 messages.report(NoMachingMethod, exp.loc); |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
212 foreach ( i, s ; methods ) |
168
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
213 { |
181
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
214 messages.report(CandidateNr, |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
215 (cast(FuncDecl)s.decl).identifier.loc) |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
216 .arg(Integer.toString(i+1)); |
168
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
217 } |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
218 } |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
219 } |
181
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
220 else if (iden.type.isCallable) |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
221 function_type = iden.type.asCallable(); |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
222 else assert(0, "Should not happen"); |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
223 |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
224 foreach (i, arg; exp.args) |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
225 { |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
226 auto argType = function_type.params[i]; |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
227 auto expType = arg.type; |
191
e799db8d9cb0
Fixed a small bug. Passes two more tests now.
Anders Johnsen <skabet@gmail.com>
parents:
184
diff
changeset
|
228 if (!argType.isSame(expType)) |
181
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
229 { |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
230 if (!expType.hasImplicitConversionTo(argType)) |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
231 messages.report(InvalidImplicitCast, exp.loc) |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
232 .arg(expType.toString) |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
233 .arg(argType.toString); |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
234 |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
235 auto castExp = new CastExp( |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
236 SLoc.Invalid, |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
237 new Identifier(argType.name), |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
238 arg); |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
239 castExp.env = iden.env; |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
240 newArgs ~= castExp; |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
241 } |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
242 else |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
243 newArgs ~= arg; |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
244 } |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
179
diff
changeset
|
245 exp.args = newArgs; |
70
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
246 } |
168
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
247 else |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
248 { |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
249 Exp[] newArgs; |
70
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
250 |
168
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
251 foreach(i, arg; exp.args) |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
252 { |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
253 auto argType = exp.exp.type.asFunction.params[i]; |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
254 auto expType = arg.type; |
177
491b5fc4782a
Small fixes to type checks.
Anders Johnsen <skabet@gmail.com>
parents:
176
diff
changeset
|
255 if(!argType.isSame(expType)) |
168
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
256 { |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
257 if(!expType.hasImplicitConversionTo(argType)) |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
258 messages.report(InvalidImplicitCast, exp.loc) |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
259 .arg(expType.toString) |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
260 .arg(argType.toString); |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
261 |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
262 auto castExp = new CastExp( |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
263 SLoc.Invalid, |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
264 new Identifier(argType.name), |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
265 arg); |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
266 castExp.env = exp.exp.env; |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
267 newArgs ~= castExp; |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
268 } |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
269 else |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
270 newArgs ~= arg; |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
271 } |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
272 |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
273 exp.args = newArgs; |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
274 } |
70
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
275 } |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
276 |
158
57b0b4464a0b
Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents:
126
diff
changeset
|
277 override void visitNewExp(NewExp exp) |
57b0b4464a0b
Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents:
126
diff
changeset
|
278 { |
57b0b4464a0b
Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents:
126
diff
changeset
|
279 super.visitNewExp(exp); |
57b0b4464a0b
Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents:
126
diff
changeset
|
280 |
57b0b4464a0b
Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents:
126
diff
changeset
|
281 Exp[] newArgs; |
57b0b4464a0b
Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents:
126
diff
changeset
|
282 |
168
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
283 Symbol[] methods = exp.newType.getSymbol.findFunctionMembers("this"); |
158
57b0b4464a0b
Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents:
126
diff
changeset
|
284 |
165
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
285 if (!methods.length) |
158
57b0b4464a0b
Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents:
126
diff
changeset
|
286 { |
165
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
287 messages.report(NoConstructor, exp.newType.loc); |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
288 return; |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
289 } |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
290 |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
291 Symbol sel = getBestMatch(exp.c_args, methods); |
158
57b0b4464a0b
Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents:
126
diff
changeset
|
292 |
165
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
293 if (sel) |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
294 { |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
295 foreach (i, arg; exp.c_args) |
158
57b0b4464a0b
Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents:
126
diff
changeset
|
296 { |
165
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
297 auto argType = sel.type.asFunction.params[i]; |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
298 auto expType = arg.type; |
177
491b5fc4782a
Small fixes to type checks.
Anders Johnsen <skabet@gmail.com>
parents:
176
diff
changeset
|
299 if (!argType.isSame(expType)) |
158
57b0b4464a0b
Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents:
126
diff
changeset
|
300 { |
165
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
301 if (!expType.hasImplicitConversionTo(argType)) |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
302 messages.report(InvalidImplicitCast, exp.loc) |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
303 .arg(expType.toString) |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
304 .arg(argType.toString); |
158
57b0b4464a0b
Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents:
126
diff
changeset
|
305 |
165
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
306 auto castExp = new CastExp( |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
307 SLoc.Invalid, |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
308 new Identifier(argType.name), |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
309 arg); |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
310 castExp.env = exp.newType.env; |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
311 newArgs ~= castExp; |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
312 } |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
313 else |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
314 newArgs ~= arg; |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
315 } |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
316 exp.c_args = newArgs; |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
317 exp.callSym = sel; |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
318 } |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
319 else |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
320 { |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
321 messages.report(NoMachingCon, exp.newType.loc); |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
322 foreach ( i, s ; methods ) |
158
57b0b4464a0b
Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents:
126
diff
changeset
|
323 { |
165
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
324 messages.report(CandidateNr, |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
325 (cast(FuncDecl)s.decl).identifier.loc) |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
326 .arg(Integer.toString(i+1)); |
158
57b0b4464a0b
Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents:
126
diff
changeset
|
327 } |
57b0b4464a0b
Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents:
126
diff
changeset
|
328 } |
57b0b4464a0b
Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents:
126
diff
changeset
|
329 } |
57b0b4464a0b
Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents:
126
diff
changeset
|
330 |
70
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
331 override void visitAssignExp(AssignExp exp) |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
332 { |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
333 super.visitAssignExp(exp); |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
334 |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
335 auto identifierType = exp.identifier.type; |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
336 auto expType = exp.exp.type; |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
337 |
176
dc9bf56b7ace
Can now use & as a unary operator and take an AddressOf
Anders Johnsen <skabet@gmail.com>
parents:
175
diff
changeset
|
338 if(!identifierType.isSame(expType)) |
70
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
339 { |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
340 if(!expType.hasImplicitConversionTo(identifierType)) |
179
2a1a635bd531
Changes the way messages can be displayed. Also added a toString to DType's for type printing.
Anders Johnsen <skabet@gmail.com>
parents:
177
diff
changeset
|
341 messages.report(InvalidImplicitCast, |
2a1a635bd531
Changes the way messages can be displayed. Also added a toString to DType's for type printing.
Anders Johnsen <skabet@gmail.com>
parents:
177
diff
changeset
|
342 [exp.identifier.sourceRange, exp.exp.sourceRange][], |
2a1a635bd531
Changes the way messages can be displayed. Also added a toString to DType's for type printing.
Anders Johnsen <skabet@gmail.com>
parents:
177
diff
changeset
|
343 [exp.loc]) |
114
3a0cd42de9cc
Removed misc/Error.d and is now using the error system all way through.
Anders Johnsen <skabet@gmail.com>
parents:
107
diff
changeset
|
344 .arg(expType.toString) |
3a0cd42de9cc
Removed misc/Error.d and is now using the error system all way through.
Anders Johnsen <skabet@gmail.com>
parents:
107
diff
changeset
|
345 .arg(identifierType.toString); |
70
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
346 |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
347 auto castExp = new CastExp( |
88
eb5b2c719a39
Major change to locations, tokens and expressions.
Anders Halager <halager@gmail.com>
parents:
87
diff
changeset
|
348 SLoc.Invalid, |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
92
diff
changeset
|
349 new Identifier(identifierType.name), |
70
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
350 exp.exp); |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
351 castExp.env = exp.exp.env; |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
352 exp.exp = castExp; |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
353 } |
183
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
354 |
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
355 if (expType.isStaticArray) |
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
356 messages.report(CannotReassignSArray, |
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
357 [exp.identifier.sourceRange, exp.exp.sourceRange][], |
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
358 [exp.loc]); |
70
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
359 } |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
360 |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
361 override void visitReturnStmt(ReturnStmt stmt) |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
362 { |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
363 super.visitReturnStmt(stmt); |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
364 |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
365 if(stmt.exp) |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
366 { |
80
682e20aa224f
Pointers working now - big YAY
Anders Johnsen <skabet@gmail.com>
parents:
70
diff
changeset
|
367 auto returnType = stmt.env.parentFunction.type.asFunction.returnType; |
70
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
368 auto expType = stmt.exp.type; |
177
491b5fc4782a
Small fixes to type checks.
Anders Johnsen <skabet@gmail.com>
parents:
176
diff
changeset
|
369 if(!returnType.isSame(expType)) |
70
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
370 { |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
371 if(!expType.hasImplicitConversionTo(returnType)) |
114
3a0cd42de9cc
Removed misc/Error.d and is now using the error system all way through.
Anders Johnsen <skabet@gmail.com>
parents:
107
diff
changeset
|
372 messages.report(InvalidImplicitCast, stmt.exp.loc) |
3a0cd42de9cc
Removed misc/Error.d and is now using the error system all way through.
Anders Johnsen <skabet@gmail.com>
parents:
107
diff
changeset
|
373 .arg(expType.toString) |
3a0cd42de9cc
Removed misc/Error.d and is now using the error system all way through.
Anders Johnsen <skabet@gmail.com>
parents:
107
diff
changeset
|
374 .arg(returnType.toString); |
70
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
375 |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
376 auto castExp = new CastExp( |
88
eb5b2c719a39
Major change to locations, tokens and expressions.
Anders Halager <halager@gmail.com>
parents:
87
diff
changeset
|
377 SLoc.Invalid, |
70
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
378 new Identifier(returnType.name), |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
379 stmt.exp); |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
380 castExp.env = stmt.exp.env; |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
381 stmt.exp = castExp; |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
382 } |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
383 } |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
384 } |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
385 |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
386 override void visitVarDecl(VarDecl decl) |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
387 { |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
388 super.visitVarDecl(decl); |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
389 |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
390 if(decl.init) |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
391 { |
160 | 392 auto varType = decl.identifier.type; |
70
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
393 auto expType = decl.init.type; |
177
491b5fc4782a
Small fixes to type checks.
Anders Johnsen <skabet@gmail.com>
parents:
176
diff
changeset
|
394 if(!varType.isSame(expType)) |
70
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
395 { |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
396 if(!expType.hasImplicitConversionTo(varType)) |
114
3a0cd42de9cc
Removed misc/Error.d and is now using the error system all way through.
Anders Johnsen <skabet@gmail.com>
parents:
107
diff
changeset
|
397 messages.report(InvalidImplicitCast, decl.init.loc) |
3a0cd42de9cc
Removed misc/Error.d and is now using the error system all way through.
Anders Johnsen <skabet@gmail.com>
parents:
107
diff
changeset
|
398 .arg(expType.toString) |
3a0cd42de9cc
Removed misc/Error.d and is now using the error system all way through.
Anders Johnsen <skabet@gmail.com>
parents:
107
diff
changeset
|
399 .arg(varType.toString); |
70
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
400 |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
401 auto castExp = new CastExp( |
88
eb5b2c719a39
Major change to locations, tokens and expressions.
Anders Halager <halager@gmail.com>
parents:
87
diff
changeset
|
402 SLoc.Invalid, |
70
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
403 new Identifier(varType.name), |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
404 decl.init); |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
405 castExp.env = decl.init.env; |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
406 decl.init = castExp; |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
407 } |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
408 } |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
409 } |
114
3a0cd42de9cc
Removed misc/Error.d and is now using the error system all way through.
Anders Johnsen <skabet@gmail.com>
parents:
107
diff
changeset
|
410 |
165
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
411 private Symbol getBestMatch(Exp[] arg_list , Symbol[] available) |
168
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
412 in |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
413 { |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
414 foreach (a ; available) |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
415 assert(a.type.isFunction, "A non-function found in available-list."); |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
416 } |
165
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
417 body |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
418 { |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
419 assert(available.length, "No available methods in symbol-list."); |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
420 |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
421 Symbol[] possible; |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
422 Symbol perfect; |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
423 |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
424 foreach (s ; available) |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
425 { |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
426 if (s.type.asFunction.params.length < arg_list.length) |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
427 continue; |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
428 |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
429 bool per = true; |
168
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
430 bool work = true; |
165
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
431 |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
432 foreach (i, arg; arg_list) |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
433 { |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
434 auto argType = s.type.asFunction.params[i]; |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
435 auto expType = arg.type; |
177
491b5fc4782a
Small fixes to type checks.
Anders Johnsen <skabet@gmail.com>
parents:
176
diff
changeset
|
436 if (argType.isSame(expType)) |
165
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
437 { |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
438 per = false; |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
439 if( !expType.hasImplicitConversionTo(argType) ) |
168
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
440 { |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
441 work = false; |
165
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
442 break; |
168
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
443 } |
165
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
444 } |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
445 } |
168
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
446 |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
447 foreach (a ; (cast(FuncDecl)s.decl).funcArgs[arg_list.length..$]) |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
448 if (a.init is null) |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
449 work = false; |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
450 |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
451 if (work) |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
452 if (per) |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
453 return s; |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
454 else |
7982eb63c0eb
Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents:
165
diff
changeset
|
455 possible ~= s; |
165
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
456 } |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
457 |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
458 if (possible.length) |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
459 return possible[0]; |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
460 |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
461 return null; |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
462 } |
7606387b2f0a
Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents:
164
diff
changeset
|
463 |
114
3a0cd42de9cc
Removed misc/Error.d and is now using the error system all way through.
Anders Johnsen <skabet@gmail.com>
parents:
107
diff
changeset
|
464 MessageHandler messages; |
70
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
465 } |
70a002b3fba4
Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
466 |