annotate src/dil/semantic/Analysis.d @ 823:fde064aca673

Added support for version(unittest).
author Aziz K?ksal <aziz.koeksal@gmail.com>
date Mon, 24 Mar 2008 18:53:15 +0100
parents bcb74c9b895c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
559
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
1 /++
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
2 Author: Aziz Köksal
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
3 License: GPL3
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
4 +/
583
af16adf500f4 Moved dil.Semantics to dil.semantic.Analysis.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 580
diff changeset
5 module dil.semantic.Analysis;
559
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
6
580
fa6d3c52757d Moved SyntaxTree.d to new package 'ast'.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 559
diff changeset
7 import dil.ast.Node;
586
e25345656d10 Moved dil.Expressions to dil.ast.Expressions.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 583
diff changeset
8 import dil.ast.Expressions;
592
b8dd677e0ace Moved dil.Scope to dil.semantic.Scope.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 586
diff changeset
9 import dil.semantic.Scope;
601
9f96fd51cb41 Moved dil.IdTable to dil.lexer.IdTable.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 596
diff changeset
10 import dil.lexer.IdTable;
778
78be32e3e157 Implemented conditional compilation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
11 import dil.Compilation;
559
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
12 import common;
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
13
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
14 /// Common semantics for pragma declarations and statements.
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
15 void pragmaSemantic(Scope scop, Token* pragmaLoc,
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
16 Identifier* ident,
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
17 Expression[] args)
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
18 {
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
19 if (ident is Ident.msg)
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
20 pragma_msg(scop, pragmaLoc, args);
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
21 else if (ident is Ident.lib)
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
22 pragma_lib(scop, pragmaLoc, args);
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
23 // else
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
24 // scop.error(begin, "unrecognized pragma");
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
25 }
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
26
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
27 /// Evaluates a msg pragma.
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
28 void pragma_msg(Scope scop, Token* pragmaLoc, Expression[] args)
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
29 {
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
30 if (args.length == 0)
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
31 return /*scop.error(pragmaLoc, "expected expression arguments to pragma")*/;
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
32
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
33 foreach (arg; args)
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
34 {
684
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 673
diff changeset
35 auto e = arg/+.evaluate()+/;
559
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
36 if (e is null)
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
37 {
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
38 // scop.error(e.begin, "expression is not evaluatable at compile time");
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
39 }
673
64fec49651cf Renamed VariableDeclaration to VariablesDeclaration.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 601
diff changeset
40 else if (auto stringExpr = e.Is!(StringExpression))
559
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
41 // Print string to standard output.
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
42 Stdout(stringExpr.getString());
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
43 else
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
44 {
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
45 // scop.error(e.begin, "expression must evaluate to a string");
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
46 }
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
47 }
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
48 // Print a newline at the end.
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
49 Stdout('\n');
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
50 }
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
51
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
52 /// Evaluates a lib pragma.
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
53 void pragma_lib(Scope scop, Token* pragmaLoc, Expression[] args)
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
54 {
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
55 if (args.length != 1)
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
56 return /*scop.error(pragmaLoc, "expected one expression argument to pragma")*/;
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
57
684
10b314bf37e3 Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 673
diff changeset
58 auto e = args[0]/+.evaluate()+/;
559
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
59 if (e is null)
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
60 {
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
61 // scop.error(e.begin, "expression is not evaluatable at compile time");
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
62 }
673
64fec49651cf Renamed VariableDeclaration to VariablesDeclaration.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 601
diff changeset
63 else if (auto stringExpr = e.Is!(StringExpression))
559
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
64 {
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
65 // TODO: collect library paths in Module?
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
66 // scop.modul.addLibrary(stringExpr.getString());
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
67 }
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
68 else
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
69 {
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
70 // scop.error(e.begin, "expression must evaluate to a string");
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
71 }
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
72 }
778
78be32e3e157 Implemented conditional compilation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
73
78be32e3e157 Implemented conditional compilation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
74 /// Returns true if the first branch (of a debug declaration/statement) or
78be32e3e157 Implemented conditional compilation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
75 /// false if the else-branch should be compiled in.
78be32e3e157 Implemented conditional compilation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
76 bool debugBranchChoice(Token* cond, CompilationContext context)
78be32e3e157 Implemented conditional compilation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
77 {
78be32e3e157 Implemented conditional compilation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
78 if (cond)
78be32e3e157 Implemented conditional compilation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
79 {
78be32e3e157 Implemented conditional compilation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
80 if (cond.kind == TOK.Identifier)
78be32e3e157 Implemented conditional compilation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
81 {
78be32e3e157 Implemented conditional compilation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
82 if (context.findDebugId(cond.ident.str))
78be32e3e157 Implemented conditional compilation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
83 return true;
78be32e3e157 Implemented conditional compilation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
84 }
78be32e3e157 Implemented conditional compilation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
85 else if (cond.uint_ <= context.debugLevel)
78be32e3e157 Implemented conditional compilation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
86 return true;
78be32e3e157 Implemented conditional compilation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
87 }
78be32e3e157 Implemented conditional compilation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
88 else if (1 <= context.debugLevel)
78be32e3e157 Implemented conditional compilation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
89 return true;
78be32e3e157 Implemented conditional compilation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
90 return false;
78be32e3e157 Implemented conditional compilation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
91 }
78be32e3e157 Implemented conditional compilation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
92
78be32e3e157 Implemented conditional compilation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
93 /// Returns true if the first branch (of a version declaration/statement) or
78be32e3e157 Implemented conditional compilation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
94 /// false if the else-branch should be compiled in.
78be32e3e157 Implemented conditional compilation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
95 bool versionBranchChoice(Token* cond, CompilationContext context)
78be32e3e157 Implemented conditional compilation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
96 {
78be32e3e157 Implemented conditional compilation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
97 assert(cond);
823
fde064aca673 Added support for version(unittest).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 806
diff changeset
98 if (cond.kind == TOK.Identifier || cond.kind == TOK.Unittest)
778
78be32e3e157 Implemented conditional compilation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
99 {
78be32e3e157 Implemented conditional compilation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
100 if (context.findVersionId(cond.ident.str))
78be32e3e157 Implemented conditional compilation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
101 return true;
78be32e3e157 Implemented conditional compilation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
102 }
78be32e3e157 Implemented conditional compilation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
103 else if (cond.uint_ >= context.versionLevel)
78be32e3e157 Implemented conditional compilation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
104 return true;
78be32e3e157 Implemented conditional compilation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
105 return false;
78be32e3e157 Implemented conditional compilation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 684
diff changeset
106 }