annotate sema/TypeCheck.d @ 165:7606387b2f0a

Better handling of param checking on method calls.
author Anders Johnsen <skabet@gmail.com>
date Tue, 22 Jul 2008 18:24:15 +0200
parents ba94fd563548
children 7982eb63c0eb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
85 }
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
86
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
87 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
88 {
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
89 super.visitCallExp(exp);
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
90
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
91 Exp[] newArgs;
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
92
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
93 foreach(i, arg; exp.args)
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
94 {
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
95 auto argType = exp.exp.type.asFunction.params[i];
70
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
96 auto expType = arg.type;
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
97 if(argType.byteSize != expType.byteSize)
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
98 {
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
99 if(!expType.hasImplicitConversionTo(argType))
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
100 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
101 .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
102 .arg(argType.toString);
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 auto castExp = new CastExp(
88
eb5b2c719a39 Major change to locations, tokens and expressions.
Anders Halager <halager@gmail.com>
parents: 87
diff changeset
105 SLoc.Invalid,
70
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
106 new Identifier(argType.name),
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
107 arg);
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
108 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
109 newArgs ~= castExp;
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
110 }
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
111 else
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
112 newArgs ~= arg;
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
113 }
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
114
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
115 exp.args = newArgs;
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
116 }
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
117
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
118 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
119 {
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
120 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
121
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
122 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
123
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
124 Symbol[] methods = exp.newType.getSymbol.findMembers("this");
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
125
165
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
126 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
127 {
165
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
128 messages.report(NoConstructor, exp.newType.loc);
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
129 return;
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
130 }
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
131
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
132 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
133
165
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
134 if (sel)
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
135 {
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
136 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
137 {
165
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
138 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
139 auto expType = arg.type;
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
140 if (argType.byteSize != expType.byteSize)
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
141 {
165
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
142 if (!expType.hasImplicitConversionTo(argType))
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
143 messages.report(InvalidImplicitCast, exp.loc)
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
144 .arg(expType.toString)
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
145 .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
146
165
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
147 auto castExp = new CastExp(
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
148 SLoc.Invalid,
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
149 new Identifier(argType.name),
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
150 arg);
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
151 castExp.env = exp.newType.env;
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
152 newArgs ~= castExp;
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
153 }
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
154 else
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
155 newArgs ~= arg;
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
156 }
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
157 exp.c_args = newArgs;
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
158 exp.callSym = sel;
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
159 }
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
160 else
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
161 {
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
162 messages.report(NoMachingCon, exp.newType.loc);
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
163 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
164 {
165
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
165 messages.report(CandidateNr,
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
166 (cast(FuncDecl)s.decl).identifier.loc)
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
167 .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
168 }
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
169 }
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
170 }
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
171
70
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
172 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
173 {
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
174 super.visitAssignExp(exp);
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
175
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
176 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
177 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
178
80
682e20aa224f Pointers working now - big YAY
Anders Johnsen <skabet@gmail.com>
parents: 70
diff changeset
179 if(identifierType != expType)
70
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
180 {
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
181 if(!expType.hasImplicitConversionTo(identifierType))
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
182 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
183 .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
184 .arg(identifierType.toString);
70
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
185
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
186 auto castExp = new CastExp(
88
eb5b2c719a39 Major change to locations, tokens and expressions.
Anders Halager <halager@gmail.com>
parents: 87
diff changeset
187 SLoc.Invalid,
107
189c049cbfcc Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents: 92
diff changeset
188 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
189 exp.exp);
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
190 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
191 exp.exp = castExp;
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
192 }
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
193 }
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
194
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
195 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
196 {
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
197 super.visitReturnStmt(stmt);
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
198
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
199 if(stmt.exp)
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
200 {
80
682e20aa224f Pointers working now - big YAY
Anders Johnsen <skabet@gmail.com>
parents: 70
diff changeset
201 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
202 auto expType = stmt.exp.type;
80
682e20aa224f Pointers working now - big YAY
Anders Johnsen <skabet@gmail.com>
parents: 70
diff changeset
203 if(returnType != expType)
70
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
204 {
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
205 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
206 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
207 .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
208 .arg(returnType.toString);
70
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
209
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
210 auto castExp = new CastExp(
88
eb5b2c719a39 Major change to locations, tokens and expressions.
Anders Halager <halager@gmail.com>
parents: 87
diff changeset
211 SLoc.Invalid,
70
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
212 new Identifier(returnType.name),
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
213 stmt.exp);
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
214 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
215 stmt.exp = castExp;
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
216 }
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
217 }
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
218 }
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
219
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
220 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
221 {
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
222 super.visitVarDecl(decl);
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
223
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
224 if(decl.init)
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
225 {
160
6cb2f4201e2a Improved static arrays
Anders Halager <halager@gmail.com>
parents: 158
diff changeset
226 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
227 auto expType = decl.init.type;
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
228 if(varType.byteSize != expType.byteSize)
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
229 {
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
230 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
231 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
232 .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
233 .arg(varType.toString);
70
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
234
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
235 auto castExp = new CastExp(
88
eb5b2c719a39 Major change to locations, tokens and expressions.
Anders Halager <halager@gmail.com>
parents: 87
diff changeset
236 SLoc.Invalid,
70
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
237 new Identifier(varType.name),
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
238 decl.init);
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
239 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
240 decl.init = castExp;
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
241 }
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
242 }
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
243 }
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
244
165
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
245 private Symbol getBestMatch(Exp[] arg_list , Symbol[] available)
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
246 body
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
247 {
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
248 Symbol[] _a;
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
249 foreach (a ; available)
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
250 if (a.type.isFunction)
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
251 _a ~= a;
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
252 available = _a;
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
253
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
254 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
255
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
256 Symbol[] possible;
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
257 Symbol perfect;
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
258
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
259 foreach (s ; available)
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
260 {
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
261 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
262 continue;
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
263
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
264 bool per = true;
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
265
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
266 foreach (i, arg; arg_list)
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
267 {
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
268 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
269 auto expType = arg.type;
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
270 if (argType != expType)
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
271 {
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
272 per = false;
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
273 if( !expType.hasImplicitConversionTo(argType) )
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
274 break;
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
275 }
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
276
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
277 if (i == arg_list.length-1)
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
278 {
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
279 bool work = true;
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
280 foreach (a ; (cast(FuncDecl)s.decl).funcArgs[i+1..$])
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
281 if (a.init is null)
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
282 work = false;
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
283
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
284 if (work)
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
285 if (per)
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
286 return s;
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
287 else
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
288 possible ~= s;
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 }
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
292
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
293 if (possible.length)
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
294 return possible[0];
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
295
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
296 return null;
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
297 }
7606387b2f0a Better handling of param checking on method calls.
Anders Johnsen <skabet@gmail.com>
parents: 164
diff changeset
298
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
299 MessageHandler messages;
70
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
300 }
70a002b3fba4 Added missing files and also cleaned up some Stdout debug-output.
Anders Johnsen <skabet@gmail.com>
parents:
diff changeset
301