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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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