annotate src/dil/semantic/Pass2.d @ 820:1d06b4aed7cf

Revised code in the first pass. Added code to handle anonymous unions and structs. Hope the idea will work. Added type to class Aggregate and isAnonymous to some other Symbol classes.
author Aziz K?ksal <aziz.koeksal@gmail.com>
date Fri, 14 Mar 2008 15:42:08 +0100
parents 525ee3f848d9
children fd52beaaa94a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
684
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
1 /++
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
2 Author: Aziz Köksal
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
3 License: GPL3
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
4 +/
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
5 module dil.semantic.Pass2;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
6
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
7 import dil.ast.DefaultVisitor;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
8 import dil.ast.Node,
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
9 dil.ast.Declarations,
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
10 dil.ast.Expressions,
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
11 dil.ast.Statements,
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
12 dil.ast.Types,
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
13 dil.ast.Parameters;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
14 import dil.lexer.Identifier;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
15 import dil.semantic.Symbol,
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
16 dil.semantic.Symbols,
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
17 dil.semantic.Types,
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
18 dil.semantic.Scope,
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
19 dil.semantic.Module,
696
c67d2c3c0b3d Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 694
diff changeset
20 dil.semantic.Analysis,
c67d2c3c0b3d Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 694
diff changeset
21 dil.semantic.Interpreter;
684
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
22 import dil.parser.Parser;
755
90668b83ae5e Introduced new module dil.SourceText and class SourceText.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 711
diff changeset
23 import dil.SourceText;
684
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
24 import dil.Location;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
25 import dil.Information;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
26 import dil.Messages;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
27 import dil.Enums;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
28 import dil.CompilerInfo;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
29 import common;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
30
798
c24be8d4f6ab Added documentation comments.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 755
diff changeset
31 /// The second pass determines the types of symbols and the types
c24be8d4f6ab Added documentation comments.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 755
diff changeset
32 /// of expressions and also evaluates them.
684
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
33 class SemanticPass2 : DefaultVisitor
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
34 {
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
35 Scope scop; /// The current scope.
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
36 Module modul; /// The module to be semantically checked.
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
37
798
c24be8d4f6ab Added documentation comments.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 755
diff changeset
38 /// Constructs a SemanticPass2 object.
c24be8d4f6ab Added documentation comments.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 755
diff changeset
39 /// Params:
c24be8d4f6ab Added documentation comments.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 755
diff changeset
40 /// modul = the module to be checked.
684
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
41 this(Module modul)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
42 {
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
43 this.modul = modul;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
44 }
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
45
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
46 /// Start semantic analysis.
810
525ee3f848d9 Added modules cmd.Compile and dil.ModuleManager.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 806
diff changeset
47 void run()
684
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
48 {
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
49 assert(modul.root !is null);
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
50 // Create module scope.
692
d33895f679eb Tidied up the class Scope a bit.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
51 scop = new Scope(null, modul);
810
525ee3f848d9 Added modules cmd.Compile and dil.ModuleManager.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 806
diff changeset
52 modul.semanticPass = 2;
684
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
53 visit(modul.root);
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
54 }
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
55
798
c24be8d4f6ab Added documentation comments.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 755
diff changeset
56 /// Enters a new scope.
684
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
57 void enterScope(ScopeSymbol s)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
58 {
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
59 scop = scop.enter(s);
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
60 }
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
61
798
c24be8d4f6ab Added documentation comments.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 755
diff changeset
62 /// Exits the current scope.
684
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
63 void exitScope()
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
64 {
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
65 scop = scop.exit();
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
66 }
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
67
798
c24be8d4f6ab Added documentation comments.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 755
diff changeset
68 /// Evaluates e and returns the result.
708
3a4c7d444467 Added method interpret() to class SemanticPass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 707
diff changeset
69 Expression interpret(Expression e)
3a4c7d444467 Added method interpret() to class SemanticPass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 707
diff changeset
70 {
798
c24be8d4f6ab Added documentation comments.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 755
diff changeset
71 return Interpreter.interpret(e, modul.infoMan/+, scop+/);
708
3a4c7d444467 Added method interpret() to class SemanticPass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 707
diff changeset
72 }
3a4c7d444467 Added method interpret() to class SemanticPass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 707
diff changeset
73
798
c24be8d4f6ab Added documentation comments.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 755
diff changeset
74 /// Creates an error report.
684
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
75 void error(Token* token, char[] formatMsg, ...)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
76 {
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
77 auto location = token.getErrorLocation();
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
78 auto msg = Format(_arguments, _argptr, formatMsg);
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
79 modul.infoMan ~= new SemanticError(location, msg);
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
80 }
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
81
798
c24be8d4f6ab Added documentation comments.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 755
diff changeset
82 /// Some handy aliases.
684
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
83 private alias Declaration D;
798
c24be8d4f6ab Added documentation comments.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 755
diff changeset
84 private alias Expression E; /// ditto
c24be8d4f6ab Added documentation comments.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 755
diff changeset
85 private alias Statement S; /// ditto
c24be8d4f6ab Added documentation comments.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 755
diff changeset
86 private alias TypeNode T; /// ditto
684
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
87
804
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
88 /// The current scope symbol to use for looking up identifiers.
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
89 /// E.g.:
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
90 /// ---
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
91 /// object.method(); // *) object is looked up in the current scope.
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
92 /// // *) idScope is set if object is a ScopeSymbol.
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
93 /// // *) method will be looked up in idScope.
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
94 /// dil.ast.Node.Node node; // A fully qualified type.
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
95 /// ---
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
96 ScopeSymbol idScope;
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
97
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
98 /// Searches for a symbol.
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
99 Symbol search(Token* idTok)
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
100 {
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
101 assert(idTok.kind == TOK.Identifier);
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
102 auto id = idTok.ident;
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
103 Symbol symbol;
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
104
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
105 if (idScope is null)
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
106 for (auto sc = scop; sc; sc = sc.parent)
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
107 {
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
108 symbol = sc.lookup(id);
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
109 if (symbol)
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
110 return symbol;
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
111 }
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
112 else
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
113 symbol = idScope.lookup(id);
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
114
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
115 if (symbol is null)
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
116 error(idTok, MSG.UndefinedIdentifier, id.str);
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
117 else if (auto scopSymbol = cast(ScopeSymbol)symbol)
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
118 idScope = scopSymbol;
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
119
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
120 return symbol;
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
121 }
707
efa5fcb9aa14 Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 704
diff changeset
122
684
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
123 override
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
124 {
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
125 D visit(CompoundDeclaration d)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
126 {
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
127 return super.visit(d);
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
128 }
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
129
707
efa5fcb9aa14 Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 704
diff changeset
130 D visit(EnumDeclaration d)
efa5fcb9aa14 Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 704
diff changeset
131 {
711
4f971f6382c7 Added enum Status to class Symbol.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 708
diff changeset
132 d.symbol.setCompleting();
4f971f6382c7 Added enum Status to class Symbol.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 708
diff changeset
133
707
efa5fcb9aa14 Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 704
diff changeset
134 Type type = Types.Int; // Default to int.
efa5fcb9aa14 Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 704
diff changeset
135 if (d.baseType)
efa5fcb9aa14 Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 704
diff changeset
136 type = visitT(d.baseType).type;
820
1d06b4aed7cf Revised code in the first pass.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 810
diff changeset
137 // Set the enum's base type.
1d06b4aed7cf Revised code in the first pass.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 810
diff changeset
138 d.symbol.type.baseType = type;
1d06b4aed7cf Revised code in the first pass.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 810
diff changeset
139
1d06b4aed7cf Revised code in the first pass.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 810
diff changeset
140 // TODO: check base type. must be basic type or another enum.
711
4f971f6382c7 Added enum Status to class Symbol.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 708
diff changeset
141
707
efa5fcb9aa14 Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 704
diff changeset
142 enterScope(d.symbol);
711
4f971f6382c7 Added enum Status to class Symbol.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 708
diff changeset
143
707
efa5fcb9aa14 Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 704
diff changeset
144 foreach (member; d.members)
efa5fcb9aa14 Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 704
diff changeset
145 {
efa5fcb9aa14 Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 704
diff changeset
146 Expression finalValue;
711
4f971f6382c7 Added enum Status to class Symbol.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 708
diff changeset
147 member.symbol.setCompleting();
707
efa5fcb9aa14 Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 704
diff changeset
148 if (member.value)
efa5fcb9aa14 Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 704
diff changeset
149 {
efa5fcb9aa14 Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 704
diff changeset
150 member.value = visitE(member.value);
708
3a4c7d444467 Added method interpret() to class SemanticPass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 707
diff changeset
151 finalValue = interpret(member.value);
707
efa5fcb9aa14 Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 704
diff changeset
152 if (finalValue is Interpreter.NAR)
711
4f971f6382c7 Added enum Status to class Symbol.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 708
diff changeset
153 finalValue = new IntExpression(0, d.symbol.type);
707
efa5fcb9aa14 Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 704
diff changeset
154 }
efa5fcb9aa14 Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 704
diff changeset
155 //else
efa5fcb9aa14 Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 704
diff changeset
156 // TODO: increment a number variable and assign that to value.
efa5fcb9aa14 Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 704
diff changeset
157 member.symbol.value = finalValue;
711
4f971f6382c7 Added enum Status to class Symbol.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 708
diff changeset
158 member.symbol.setComplete();
707
efa5fcb9aa14 Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 704
diff changeset
159 }
711
4f971f6382c7 Added enum Status to class Symbol.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 708
diff changeset
160
707
efa5fcb9aa14 Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 704
diff changeset
161 exitScope();
711
4f971f6382c7 Added enum Status to class Symbol.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 708
diff changeset
162 d.symbol.setComplete();
707
efa5fcb9aa14 Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 704
diff changeset
163 return d;
efa5fcb9aa14 Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 704
diff changeset
164 }
efa5fcb9aa14 Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 704
diff changeset
165
684
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
166 D visit(MixinDeclaration md)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
167 {
704
ff4643a4a97c Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 696
diff changeset
168 if (md.decls)
ff4643a4a97c Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 696
diff changeset
169 return md.decls;
ff4643a4a97c Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 696
diff changeset
170 if (md.isMixinExpression)
ff4643a4a97c Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 696
diff changeset
171 {
ff4643a4a97c Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 696
diff changeset
172 md.argument = visitE(md.argument);
708
3a4c7d444467 Added method interpret() to class SemanticPass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 707
diff changeset
173 auto expr = interpret(md.argument);
704
ff4643a4a97c Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 696
diff changeset
174 if (expr is Interpreter.NAR)
ff4643a4a97c Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 696
diff changeset
175 return md;
ff4643a4a97c Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 696
diff changeset
176 auto stringExpr = expr.Is!(StringExpression);
ff4643a4a97c Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 696
diff changeset
177 if (stringExpr is null)
ff4643a4a97c Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 696
diff changeset
178 {
ff4643a4a97c Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 696
diff changeset
179 error(md.begin, MSG.MixinArgumentMustBeString);
ff4643a4a97c Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 696
diff changeset
180 return md;
ff4643a4a97c Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 696
diff changeset
181 }
ff4643a4a97c Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 696
diff changeset
182 else
ff4643a4a97c Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 696
diff changeset
183 { // Parse the declarations in the string.
ff4643a4a97c Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 696
diff changeset
184 auto loc = md.begin.getErrorLocation();
ff4643a4a97c Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 696
diff changeset
185 auto filePath = loc.filePath;
755
90668b83ae5e Introduced new module dil.SourceText and class SourceText.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 711
diff changeset
186 auto sourceText = new SourceText(filePath, stringExpr.getString());
90668b83ae5e Introduced new module dil.SourceText and class SourceText.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 711
diff changeset
187 auto parser = new Parser(sourceText, modul.infoMan);
704
ff4643a4a97c Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 696
diff changeset
188 md.decls = parser.start();
ff4643a4a97c Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 696
diff changeset
189 }
ff4643a4a97c Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 696
diff changeset
190 }
684
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
191 else
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
192 {
704
ff4643a4a97c Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 696
diff changeset
193 // TODO: implement template mixin.
684
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
194 }
704
ff4643a4a97c Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 696
diff changeset
195 return md.decls;
684
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
196 }
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
197
804
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
198 // Type nodes:
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
199
694
19a34b69cc7d Renamed some members of BinaryExpression and QualifiedType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 692
diff changeset
200 T visit(TypeofType t)
19a34b69cc7d Renamed some members of BinaryExpression and QualifiedType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 692
diff changeset
201 {
19a34b69cc7d Renamed some members of BinaryExpression and QualifiedType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 692
diff changeset
202 t.e = visitE(t.e);
19a34b69cc7d Renamed some members of BinaryExpression and QualifiedType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 692
diff changeset
203 t.type = t.e.type;
19a34b69cc7d Renamed some members of BinaryExpression and QualifiedType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 692
diff changeset
204 return t;
19a34b69cc7d Renamed some members of BinaryExpression and QualifiedType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 692
diff changeset
205 }
19a34b69cc7d Renamed some members of BinaryExpression and QualifiedType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 692
diff changeset
206
692
d33895f679eb Tidied up the class Scope a bit.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
207 T visit(ArrayType t)
d33895f679eb Tidied up the class Scope a bit.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
208 {
804
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
209 auto baseType = visitT(t.next).type;
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
210 if (t.isAssociative)
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
211 t.type = baseType.arrayOf(visitT(t.assocType).type);
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
212 else if (t.isDynamic)
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
213 t.type = baseType.arrayOf();
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
214 else if (t.isStatic)
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
215 {}
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
216 else
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
217 assert(t.isSlice);
692
d33895f679eb Tidied up the class Scope a bit.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
218 return t;
d33895f679eb Tidied up the class Scope a bit.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
219 }
d33895f679eb Tidied up the class Scope a bit.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
220
684
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
221 T visit(PointerType t)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
222 {
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
223 t.type = visitT(t.next).type.ptrTo();
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
224 return t;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
225 }
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
226
804
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
227 T visit(QualifiedType t)
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
228 {
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
229 if (t.lhs.Is!(QualifiedType) is null)
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
230 idScope = null; // Reset at left-most type.
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
231 visitT(t.lhs);
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
232 visitT(t.rhs);
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
233 t.type = t.rhs.type;
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
234 return t;
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
235 }
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
236
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
237 T visit(IdentifierType t)
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
238 {
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
239 auto idToken = t.begin;
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
240 auto symbol = search(idToken);
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
241 // TODO: save symbol or its type in t.
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
242 return t;
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
243 }
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
244
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
245 T visit(TemplateInstanceType t)
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
246 {
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
247 auto idToken = t.begin;
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
248 auto symbol = search(idToken);
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
249 // TODO: save symbol or its type in t.
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
250 return t;
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
251 }
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
252
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
253 T visit(ModuleScopeType t)
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
254 {
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
255 idScope = modul;
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
256 return t;
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
257 }
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
258
684
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
259 T visit(IntegralType t)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
260 {
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
261 // A table mapping the kind of a token to its corresponding semantic Type.
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
262 TypeBasic[TOK] tok2Type = [
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
263 TOK.Char : Types.Char, TOK.Wchar : Types.Wchar, TOK.Dchar : Types.Dchar, TOK.Bool : Types.Bool,
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
264 TOK.Byte : Types.Byte, TOK.Ubyte : Types.Ubyte, TOK.Short : Types.Short, TOK.Ushort : Types.Ushort,
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
265 TOK.Int : Types.Int, TOK.Uint : Types.Uint, TOK.Long : Types.Long, TOK.Ulong : Types.Ulong,
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
266 TOK.Cent : Types.Cent, TOK.Ucent : Types.Ucent,
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
267 TOK.Float : Types.Float, TOK.Double : Types.Double, TOK.Real : Types.Real,
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
268 TOK.Ifloat : Types.Ifloat, TOK.Idouble : Types.Idouble, TOK.Ireal : Types.Ireal,
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
269 TOK.Cfloat : Types.Cfloat, TOK.Cdouble : Types.Cdouble, TOK.Creal : Types.Creal, TOK.Void : Types.Void
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
270 ];
694
19a34b69cc7d Renamed some members of BinaryExpression and QualifiedType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 692
diff changeset
271 assert(t.tok in tok2Type);
684
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
272 t.type = tok2Type[t.tok];
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
273 return t;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
274 }
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
275
804
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
276 // Expression nodes:
9e6c6bb73e5f Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 798
diff changeset
277
684
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
278 E visit(ParenExpression e)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
279 {
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
280 if (!e.type)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
281 {
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
282 e.next = visitE(e.next);
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
283 e.type = e.next.type;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
284 }
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
285 return e;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
286 }
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
287
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
288 E visit(CommaExpression e)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
289 {
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
290 if (!e.type)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
291 {
694
19a34b69cc7d Renamed some members of BinaryExpression and QualifiedType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 692
diff changeset
292 e.lhs = visitE(e.lhs);
19a34b69cc7d Renamed some members of BinaryExpression and QualifiedType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 692
diff changeset
293 e.rhs = visitE(e.rhs);
19a34b69cc7d Renamed some members of BinaryExpression and QualifiedType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 692
diff changeset
294 e.type = e.rhs.type;
684
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
295 }
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
296 return e;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
297 }
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
298
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
299 E visit(OrOrExpression)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
300 { return null; }
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
301
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
302 E visit(AndAndExpression)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
303 { return null; }
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
304
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
305 E visit(SpecialTokenExpression e)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
306 {
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
307 if (e.type)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
308 return e.value;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
309 switch (e.specialToken.kind)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
310 {
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
311 case TOK.LINE, TOK.VERSION:
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
312 e.value = new IntExpression(e.specialToken.uint_, Types.Uint);
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
313 break;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
314 case TOK.FILE, TOK.DATE, TOK.TIME, TOK.TIMESTAMP, TOK.VENDOR:
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
315 e.value = new StringExpression(e.specialToken.str);
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
316 break;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
317 default:
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
318 assert(0);
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
319 }
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
320 e.type = e.value.type;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
321 return e.value;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
322 }
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
323
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
324 E visit(DollarExpression e)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
325 {
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
326 if (e.type)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
327 return e;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
328 e.type = Types.Size_t;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
329 // if (!inArraySubscript)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
330 // error("$ can only be in an array subscript.");
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
331 return e;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
332 }
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
333
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
334 E visit(NullExpression e)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
335 {
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
336 if (!e.type)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
337 e.type = Types.Void_ptr;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
338 return e;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
339 }
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
340
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
341 E visit(BoolExpression e)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
342 {
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
343 if (e.type)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
344 return e;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
345 e.value = new IntExpression(e.toBool(), Types.Bool);
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
346 e.type = Types.Bool;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
347 return e;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
348 }
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
349
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
350 E visit(IntExpression e)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
351 {
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
352 if (e.type)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
353 return e;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
354
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
355 if (e.number & 0x8000_0000_0000_0000)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
356 e.type = Types.Ulong; // 0xFFFF_FFFF_FFFF_FFFF
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
357 else if (e.number & 0xFFFF_FFFF_0000_0000)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
358 e.type = Types.Long; // 0x7FFF_FFFF_FFFF_FFFF
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
359 else if (e.number & 0x8000_0000)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
360 e.type = Types.Uint; // 0xFFFF_FFFF
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
361 else
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
362 e.type = Types.Int; // 0x7FFF_FFFF
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
363 return e;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
364 }
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
365
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
366 E visit(RealExpression e)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
367 {
704
ff4643a4a97c Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 696
diff changeset
368 if (!e.type)
684
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
369 e.type = Types.Double;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
370 return e;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
371 }
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
372
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
373 E visit(ComplexExpression e)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
374 {
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
375 if (!e.type)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
376 e.type = Types.Cdouble;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
377 return e;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
378 }
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
379
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
380 E visit(CharExpression e)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
381 {
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
382 if (e.type)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
383 return e;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
384 if (e.character <= 0xFF)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
385 e.type = Types.Char;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
386 else if (e.character <= 0xFFFF)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
387 e.type = Types.Wchar;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
388 else
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
389 e.type = Types.Dchar;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
390 return e;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
391 }
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
392
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
393 E visit(StringExpression e)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
394 {
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
395 return e;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
396 }
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
397
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
398 E visit(MixinExpression me)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
399 {
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
400 if (me.type)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
401 return me.expr;
696
c67d2c3c0b3d Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 694
diff changeset
402 me.expr = visitE(me.expr);
708
3a4c7d444467 Added method interpret() to class SemanticPass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 707
diff changeset
403 auto expr = interpret(me.expr);
696
c67d2c3c0b3d Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 694
diff changeset
404 if (expr is Interpreter.NAR)
684
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
405 return me;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
406 auto stringExpr = expr.Is!(StringExpression);
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
407 if (stringExpr is null)
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
408 error(me.begin, MSG.MixinArgumentMustBeString);
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
409 else
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
410 {
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
411 auto loc = me.begin.getErrorLocation();
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
412 auto filePath = loc.filePath;
755
90668b83ae5e Introduced new module dil.SourceText and class SourceText.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 711
diff changeset
413 auto sourceText = new SourceText(filePath, stringExpr.getString());
90668b83ae5e Introduced new module dil.SourceText and class SourceText.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 711
diff changeset
414 auto parser = new Parser(sourceText, modul.infoMan);
684
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
415 expr = parser.start2();
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
416 expr = visitE(expr); // Check expression.
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
417 }
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
418 me.expr = expr;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
419 me.type = expr.type;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
420 return me.expr;
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
421 }
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
422
696
c67d2c3c0b3d Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 694
diff changeset
423 E visit(ImportExpression ie)
684
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
424 {
696
c67d2c3c0b3d Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 694
diff changeset
425 if (ie.type)
c67d2c3c0b3d Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 694
diff changeset
426 return ie.expr;
c67d2c3c0b3d Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 694
diff changeset
427 ie.expr = visitE(ie.expr);
708
3a4c7d444467 Added method interpret() to class SemanticPass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 707
diff changeset
428 auto expr = interpret(ie.expr);
696
c67d2c3c0b3d Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 694
diff changeset
429 if (expr is Interpreter.NAR)
c67d2c3c0b3d Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 694
diff changeset
430 return ie;
c67d2c3c0b3d Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 694
diff changeset
431 auto stringExpr = expr.Is!(StringExpression);
c67d2c3c0b3d Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 694
diff changeset
432 //if (stringExpr is null)
c67d2c3c0b3d Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 694
diff changeset
433 // error(me.begin, MSG.ImportArgumentMustBeString);
c67d2c3c0b3d Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 694
diff changeset
434 // TODO: load file
c67d2c3c0b3d Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 694
diff changeset
435 //ie.expr = new StringExpression(loadImportFile(stringExpr.getString()));
c67d2c3c0b3d Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 694
diff changeset
436 return ie.expr;
684
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
437 }
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
438 }
696
c67d2c3c0b3d Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 694
diff changeset
439 }