Mercurial > projects > dang
annotate dang/compiler.d @ 211:9e9f3e7e342b default tip
Added dang folder and Module in ast.
author | Anders Johnsen <skabet@gmail.com> |
---|---|
date | Tue, 12 Aug 2008 20:07:35 +0200 |
parents | |
children |
rev | line source |
---|---|
211
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1 module dang.compiler; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
2 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
3 import tango.io.Stdout, |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
4 tango.core.Signal, |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
5 tango.core.Memory, |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
6 tango.sys.Process, |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
7 tango.time.StopWatch, |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
8 tango.text.Util, |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
9 tango.io.FileConduit, |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
10 tango.io.FilePath; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
11 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
12 import lexer.Lexer, |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
13 parser.Action, |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
14 parser.Parser; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
15 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
16 import basic.SourceManager; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
17 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
18 import basic.Message; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
19 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
20 import ast.Module; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
21 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
22 import tango.stdc.posix.unistd; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
23 import tango.stdc.stdlib; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
24 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
25 import Opt = dang.OptParse; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
26 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
27 class NullAction : Action |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
28 { |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
29 } |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
30 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
31 void checkFiles(char[][] *files) |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
32 { |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
33 // GC.disable(); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
34 bool non_existant_files = false; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
35 bool duplicate_files = false; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
36 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
37 char[][] validFiles; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
38 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
39 foreach (file; *files) |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
40 { |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
41 scope path = new FilePath(file); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
42 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
43 if (!path.exists) |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
44 { |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
45 Stderr.formatln("'{}' does not exist", file).newline; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
46 non_existant_files = true; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
47 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
48 continue; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
49 } |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
50 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
51 bool fileInStack = false; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
52 foreach (vFile; validFiles) |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
53 if (vFile == file) |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
54 { |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
55 fileInStack = true; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
56 duplicate_files = true; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
57 } |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
58 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
59 if (fileInStack) |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
60 continue; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
61 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
62 validFiles ~= path.toString(); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
63 } |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
64 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
65 *files = validFiles; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
66 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
67 if (non_existant_files) |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
68 throw new Exception("All files given must exist"); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
69 if (duplicate_files) |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
70 Stderr("warning: duplicate files ignored").newline; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
71 } |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
72 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
73 void main(char[][] args) |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
74 { |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
75 char[][] filesToHandle; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
76 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
77 Signal!(char[][]*) preStart; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
78 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
79 Signal!(char[]) preLex; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
80 Signal!(Lexer) postLex; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
81 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
82 Signal!(Lexer) preParse; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
83 Signal!(Module[], SourceManager) postParse; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
84 Signal!(Module[], SourceManager) postSema; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
85 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
86 preStart.attach(&checkFiles); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
87 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
88 auto argParse = new Opt.OptionParser(`Dang "D" compiler v0.1`); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
89 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
90 bool optimize = false; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
91 bool inline = false; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
92 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
93 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
94 SourceManager src_mgr = new SourceManager; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
95 MessageHandler messages = new MessageHandler(src_mgr); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
96 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
97 argParse.addOption(["-h", "--help"], Opt.Action.Help) |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
98 .help("Show this help message"); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
99 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
100 auto options = argParse.parse(args); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
101 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
102 filesToHandle ~= options.args; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
103 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
104 // Will throw exception if some files don't exist |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
105 preStart(&filesToHandle); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
106 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
107 struct Measurement { char[] label; double time; } |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
108 Measurement[] timings; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
109 StopWatch total; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
110 total.start; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
111 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
112 Module[] modules; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
113 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
114 StopWatch watch; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
115 watch.start; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
116 foreach (file; filesToHandle) |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
117 { |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
118 preLex(file); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
119 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
120 auto start = src_mgr.addFile(file); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
121 auto lexer = new Lexer(start, src_mgr, messages); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
122 postLex(lexer); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
123 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
124 preParse(lexer); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
125 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
126 auto parser = new Parser(messages); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
127 auto action = new NullAction; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
128 modules ~= cast(Module)parser.parse(src_mgr, lexer, action); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
129 timings ~= Measurement("Lex + Parse of '"~file~"'", watch.stop); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
130 messages.checkErrors(ExitLevel.Parser); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
131 /* |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
132 StopWatch watch2; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
133 watch.start; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
134 watch2.start; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
135 Module[] mods = (new LoadModule).visit(m, src_mgr, messages); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
136 (new ScopeBuilder).visit(m); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
137 auto scope_builder = watch2.stop; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
138 watch2.start; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
139 (new ScopeCheck).visit(m); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
140 auto scope_check = watch2.stop; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
141 watch2.start; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
142 (new TypeCheck).visit(m); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
143 auto type_check = watch2.stop; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
144 watch2.start; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
145 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
146 foreach (decl; m.decls) |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
147 decl.simplify(); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
148 auto simplify = watch2.stop; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
149 auto extra_stuff = watch.stop; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
150 timings ~= Measurement("Extra stuff", watch.stop); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
151 timings ~= Measurement(" - Building scopes", scope_builder); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
152 timings ~= Measurement(" - Checking scopes", scope_check); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
153 timings ~= Measurement(" - Checking types", type_check); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
154 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
155 postParse(m, src_mgr);*/ |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
156 } |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
157 /* |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
158 (new LiteralInterpreter(messages)).visit(modules); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
159 messages.checkErrors; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
160 postParse(modules, src_mgr); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
161 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
162 class ModuleLoader : Visitor!(void) |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
163 { |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
164 Module[] visit(Module[] modules, MessageHandler messages, SourceManager src_mgr) |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
165 { |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
166 this.modules = modules; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
167 this.messages = messages; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
168 this.src_mgr = src_mgr; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
169 super.visit(modules); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
170 return this.modules; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
171 } |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
172 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
173 override void visitImportDecl(ImportDecl decl) |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
174 { |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
175 char[] path = replace!(char)(decl.get,'.','/')~".d"; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
176 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
177 auto start = src_mgr.addFile(path); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
178 auto lexer = new Lexer(start, src_mgr, messages); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
179 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
180 auto parser = new Parser(messages); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
181 auto action = new AstAction(src_mgr); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
182 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
183 Module m = cast(Module)parser.parse(src_mgr, lexer, action); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
184 modules ~= m; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
185 m.outputModule = false; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
186 // decl.env.mHandle.add(m); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
187 messages.checkErrors(ExitLevel.Parser); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
188 } |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
189 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
190 Module[] modules; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
191 SourceManager src_mgr; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
192 MessageHandler messages; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
193 } |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
194 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
195 modules = (new ModuleLoader()).visit(modules, messages, src_mgr); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
196 messages.checkErrors; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
197 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
198 (new BuildScopes).visit(modules); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
199 (new BuildSymbols).visit(modules); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
200 StopWatch watch2; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
201 watch.start; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
202 watch2.start; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
203 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
204 (new BuildTypes(messages)).visit(modules); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
205 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
206 (new CheckScopes(messages)).visit(modules); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
207 messages.checkErrors; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
208 auto scope_check = watch2.stop; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
209 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
210 watch2.start; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
211 (new CheckTypes(messages)).visit(modules); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
212 messages.checkErrors; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
213 auto type_check = watch2.stop; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
214 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
215 watch2.start; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
216 (new ObjectOriented(messages)).visit(modules); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
217 messages.checkErrors; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
218 auto object_check = watch2.stop; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
219 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
220 watch2.start; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
221 auto vc = new VC; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
222 vc.msg = messages; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
223 foreach (m; modules) |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
224 m.verify(vc); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
225 messages.checkErrors; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
226 auto ast_verify = watch2.stop; |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
227 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
228 foreach (m; modules) |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
229 foreach (decl; m.decls) |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
230 decl.simplify(); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
231 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
232 timings ~= Measurement("Total", total.stop); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
233 postSema(modules, src_mgr); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
234 |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
235 if (options.flag("time")) |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
236 foreach (m; timings) |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
237 Stderr.formatln("{,-45} {}ms", m.label, m.time*1e3); |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
238 */ |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
239 } |
9e9f3e7e342b
Added dang folder and Module in ast.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
240 |