annotate dang/compiler.d @ 195:4e1a7265d620

Made a BuildTypes pass, to give all exp's a type.
author Anders Johnsen <skabet@gmail.com>
date Tue, 29 Jul 2008 15:50:24 +0200
parents 08f68d684047
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
1 module dang.compiler;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
2
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
3 import tango.io.Stdout,
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
4 tango.core.Signal,
91
1a24e61eb104 Fixed the SourceLocation/SourceManager for files stretching by more then one CheckPoints
johnsen@johnsen-laptop
parents: 90
diff changeset
5 tango.core.Memory,
89
a49bb982a7b0 Using the new SourceLocation system to handle errors. Also, this is the first push for making the errors don't throw, but continue to check the source.
Anders Johnsen <skabet@gmail.com>
parents: 88
diff changeset
6 tango.sys.Process,
87
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
7 tango.time.StopWatch,
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
8 tango.text.Util,
89
a49bb982a7b0 Using the new SourceLocation system to handle errors. Also, this is the first push for making the errors don't throw, but continue to check the source.
Anders Johnsen <skabet@gmail.com>
parents: 88
diff changeset
9 tango.io.FileConduit,
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
10 tango.io.FilePath;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
11
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
12 import lexer.Lexer,
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
13 parser.Parser;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
14
88
eb5b2c719a39 Major change to locations, tokens and expressions.
Anders Halager <halager@gmail.com>
parents: 87
diff changeset
15 import basic.SourceManager;
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
16
89
a49bb982a7b0 Using the new SourceLocation system to handle errors. Also, this is the first push for making the errors don't throw, but continue to check the source.
Anders Johnsen <skabet@gmail.com>
parents: 88
diff changeset
17 import basic.Message;
a49bb982a7b0 Using the new SourceLocation system to handle errors. Also, this is the first push for making the errors don't throw, but continue to check the source.
Anders Johnsen <skabet@gmail.com>
parents: 88
diff changeset
18
94
48bb2287c035 Added Modules. Right now it's very simple - will grow with time and need.
Anders Johnsen <skabet@gmail.com>
parents: 92
diff changeset
19 import ast.Module;
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
20
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
21 import tools.AstPrinter,
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
22 tools.DotPrinter;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
23
51
c96cdcbdb9d6 Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents: 50
diff changeset
24 import gen.CodeGen;
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
25
13
e5caf9971207 Checking for types and identifiers. TODO: Make each varDecl create a new scope
johnsen@johnsen-desktop
parents: 1
diff changeset
26 import sema.Visitor,
51
c96cdcbdb9d6 Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents: 50
diff changeset
27 sema.AstAction,
194
08f68d684047 Rename some files. Hopefully we can get a more iterative sema pass, that's a lot easier to "get startet with".
Anders Johnsen <skabet@gmail.com>
parents: 176
diff changeset
28 sema.BuildScopes,
08f68d684047 Rename some files. Hopefully we can get a more iterative sema pass, that's a lot easier to "get startet with".
Anders Johnsen <skabet@gmail.com>
parents: 176
diff changeset
29 sema.BuildSymbols,
195
4e1a7265d620 Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents: 194
diff changeset
30 sema.BuildTypes,
194
08f68d684047 Rename some files. Hopefully we can get a more iterative sema pass, that's a lot easier to "get startet with".
Anders Johnsen <skabet@gmail.com>
parents: 176
diff changeset
31 sema.CheckScopes,
08f68d684047 Rename some files. Hopefully we can get a more iterative sema pass, that's a lot easier to "get startet with".
Anders Johnsen <skabet@gmail.com>
parents: 176
diff changeset
32 sema.CheckTypes,
106
89db676fbacb Now able of understanding strings.
Anders Johnsen <skabet@gmail.com>
parents: 101
diff changeset
33 sema.LiteralInterpreter,
150
6c5a3c0bb4fb Make switch work again
Anders Halager <halager@gmail.com>
parents: 136
diff changeset
34 sema.VC,
194
08f68d684047 Rename some files. Hopefully we can get a more iterative sema pass, that's a lot easier to "get startet with".
Anders Johnsen <skabet@gmail.com>
parents: 176
diff changeset
35 sema.ObjectOriented;
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
36
97
198ad05f3ace "-c" as argument now generates out.o (only works on linux now)
Anders Johnsen <skabet@gmail.com>
parents: 94
diff changeset
37 import tango.stdc.posix.unistd;
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
38 import tango.stdc.stdlib;
97
198ad05f3ace "-c" as argument now generates out.o (only works on linux now)
Anders Johnsen <skabet@gmail.com>
parents: 94
diff changeset
39
87
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
40 import Opt = dang.OptParse;
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
41
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
42 class NullAction : Action
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
43 {
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
44 }
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
45
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
46 void checkFiles(char[][] *files)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
47 {
176
dc9bf56b7ace Can now use & as a unary operator and take an AddressOf
Anders Johnsen <skabet@gmail.com>
parents: 168
diff changeset
48 // GC.disable();
87
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
49 bool non_existant_files = false;
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
50 bool duplicate_files = false;
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
51
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
52 char[][] validFiles;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
53
87
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
54 foreach (file; *files)
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
55 {
87
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
56 scope path = new FilePath(file);
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
57
87
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
58 if (!path.exists)
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
59 {
87
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
60 Stderr.formatln("'{}' does not exist", file).newline;
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
61 non_existant_files = true;
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
62
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
63 continue;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
64 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
65
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
66 bool fileInStack = false;
87
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
67 foreach (vFile; validFiles)
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
68 if (vFile == file)
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
69 {
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
70 fileInStack = true;
87
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
71 duplicate_files = true;
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
72 }
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
73
87
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
74 if (fileInStack)
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
75 continue;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
76
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
77 validFiles ~= path.toString();
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
78 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
79
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
80 *files = validFiles;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
81
87
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
82 if (non_existant_files)
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
83 throw new Exception("All files given must exist");
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
84 if (duplicate_files)
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
85 Stderr("warning: duplicate files ignored").newline;
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
86 }
87
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
87
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
88 void main(char[][] args)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
89 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
90 char[][] filesToHandle;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
91
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
92 Signal!(char[][]*) preStart;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
93
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
94 Signal!(char[]) preLex;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
95 Signal!(Lexer) postLex;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
96
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
97 Signal!(Lexer) preParse;
101
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
98 Signal!(Module[], SourceManager) postParse;
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
99 Signal!(Module[], SourceManager) postSema;
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
100
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
101 preStart.attach(&checkFiles);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
102
87
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
103 auto argParse = new Opt.OptionParser(`Dang "D" compiler v0.0`);
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
104
40
9fb190ad81a4 Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents: 22
diff changeset
105 bool optimize = false;
9fb190ad81a4 Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents: 22
diff changeset
106 bool inline = false;
9fb190ad81a4 Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents: 22
diff changeset
107
89
a49bb982a7b0 Using the new SourceLocation system to handle errors. Also, this is the first push for making the errors don't throw, but continue to check the source.
Anders Johnsen <skabet@gmail.com>
parents: 88
diff changeset
108
a49bb982a7b0 Using the new SourceLocation system to handle errors. Also, this is the first push for making the errors don't throw, but continue to check the source.
Anders Johnsen <skabet@gmail.com>
parents: 88
diff changeset
109 SourceManager src_mgr = new SourceManager;
a49bb982a7b0 Using the new SourceLocation system to handle errors. Also, this is the first push for making the errors don't throw, but continue to check the source.
Anders Johnsen <skabet@gmail.com>
parents: 88
diff changeset
110 MessageHandler messages = new MessageHandler(src_mgr);
a49bb982a7b0 Using the new SourceLocation system to handle errors. Also, this is the first push for making the errors don't throw, but continue to check the source.
Anders Johnsen <skabet@gmail.com>
parents: 88
diff changeset
111
87
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
112 argParse.addOption(["-h", "--help"], Opt.Action.Help)
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
113 .help("Show this help message");
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
114
87
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
115 argParse.addOption(["--ast-dump-dot"],
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
116 "what-to-do", Opt.Action.StoreConst, "dot")
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
117 .help("Output the AST in the dot format");
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
118 argParse.addOption(["--ast-dump-code"],
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
119 "what-to-do", Opt.Action.StoreConst, "code")
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
120 .help("Output the AST as code");
176
dc9bf56b7ace Can now use & as a unary operator and take an AddressOf
Anders Johnsen <skabet@gmail.com>
parents: 168
diff changeset
121 argParse.addOption(["--semantic-only"],
dc9bf56b7ace Can now use & as a unary operator and take an AddressOf
Anders Johnsen <skabet@gmail.com>
parents: 168
diff changeset
122 "what-to-do", Opt.Action.StoreConst, "exit")
dc9bf56b7ace Can now use & as a unary operator and take an AddressOf
Anders Johnsen <skabet@gmail.com>
parents: 168
diff changeset
123 .help("Exit after semantics and before codegen");
87
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
124 argParse.addOption(["--gen-llvm"],
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
125 "what-to-do", Opt.Action.StoreConst, "gen-llvm")
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
126 .help("Compile to LLVM code (default)");
89
a49bb982a7b0 Using the new SourceLocation system to handle errors. Also, this is the first push for making the errors don't throw, but continue to check the source.
Anders Johnsen <skabet@gmail.com>
parents: 88
diff changeset
127 argParse.addOption(["-c"],
a49bb982a7b0 Using the new SourceLocation system to handle errors. Also, this is the first push for making the errors don't throw, but continue to check the source.
Anders Johnsen <skabet@gmail.com>
parents: 88
diff changeset
128 "what-to-do", Opt.Action.StoreConst, "compile")
a49bb982a7b0 Using the new SourceLocation system to handle errors. Also, this is the first push for making the errors don't throw, but continue to check the source.
Anders Johnsen <skabet@gmail.com>
parents: 88
diff changeset
129 .help("Compile to .o or executeable");
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
130 argParse.addOption(["--syntax-only"],
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
131 "what-to-do", Opt.Action.StoreConst, "parse")
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
132 .help("Only parse the file(s) and output parseing errors.");
40
9fb190ad81a4 Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents: 22
diff changeset
133
9fb190ad81a4 Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents: 22
diff changeset
134 argParse.addOption(
9fb190ad81a4 Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents: 22
diff changeset
135 ["-O","--optimize"], {
9fb190ad81a4 Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents: 22
diff changeset
136 optimize = true;
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
137 }
87
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
138 ).help("Tell LLVM to do its standard optimizations");
40
9fb190ad81a4 Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents: 22
diff changeset
139
9fb190ad81a4 Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents: 22
diff changeset
140 argParse.addOption(
9fb190ad81a4 Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents: 22
diff changeset
141 ["--inline"], {
9fb190ad81a4 Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents: 22
diff changeset
142 inline = true;
9fb190ad81a4 Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents: 22
diff changeset
143 }
87
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
144 ).help("Tell LLVM that its allowed to inline functions");
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
145
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
146 argParse
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
147 .addOption(["--time"], Opt.Action.SetTrue, "time")
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
148 .help("Time the various operations performed.");
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
149
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
150 auto options = argParse.parse(args);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
151
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
152 filesToHandle ~= options.args;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
153
87
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
154 // Will throw exception if some files don't exist
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
155 preStart(&filesToHandle);
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
156
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
157 struct Measurement { char[] label; double time; }
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
158 Measurement[] timings;
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
159
87
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
160 auto what = options["what-to-do"];
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
161 if (what == "" || what == "gen-llvm")
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
162 postSema.attach(
101
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
163 (Module[] modules, SourceManager sm) {
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
164 foreach(m ; modules)
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
165 {
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
166 if (!m.outputModule)
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
167 continue;
101
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
168 StopWatch w; w.start;
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
169 auto llvmGen = new CodeGen();
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
170 auto file = new FileConduit(m.moduleName~".bc", FileConduit.WriteCreate);
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
171 llvmGen.gen(m, file.fileHandle, optimize, inline);
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
172 timings ~= Measurement("Generating LLVM bytecode", w.stop);
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
173 }
87
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
174 });
89
a49bb982a7b0 Using the new SourceLocation system to handle errors. Also, this is the first push for making the errors don't throw, but continue to check the source.
Anders Johnsen <skabet@gmail.com>
parents: 88
diff changeset
175 else if (what == "compile")
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
176 postSema.attach(
101
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
177 (Module[] modules, SourceManager sm) {
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
178 foreach(m ; modules)
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
179 {
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
180 if (!m.outputModule)
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
181 continue;
101
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
182 StopWatch w; w.start;
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
183 auto llvmGen = new CodeGen();
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
184 auto llc = new Process("llc","-o=-");
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
185 auto gcc = new Process("gcc","-c","-o",m.moduleName~".o","-x","assembler","-");
101
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
186 llc.execute();
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
187 int i = dup(llc.stdin.fileHandle);
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
188 llc.stdin.detach;
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
189 llvmGen.gen(m, i, optimize, inline);
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
190 llc.wait();
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
191 gcc.execute();
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
192 gcc.stdin.copy(llc.stdout);
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
193 gcc.stdin.detach;
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
194 gcc.wait();
150
6c5a3c0bb4fb Make switch work again
Anders Halager <halager@gmail.com>
parents: 136
diff changeset
195 timings ~= Measurement("Generating ASM", w.stop);
101
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
196 }
97
198ad05f3ace "-c" as argument now generates out.o (only works on linux now)
Anders Johnsen <skabet@gmail.com>
parents: 94
diff changeset
197
89
a49bb982a7b0 Using the new SourceLocation system to handle errors. Also, this is the first push for making the errors don't throw, but continue to check the source.
Anders Johnsen <skabet@gmail.com>
parents: 88
diff changeset
198 });
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
199 else if (what == "parse")
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
200 preParse.attach(
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
201 (Lexer lexer) {
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
202 auto parser = new Parser(messages);
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
203 auto action = new NullAction();
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
204 parser.parse(src_mgr, lexer, action);
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
205 messages.checkErrors(ExitLevel.Parser);
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
206 exit(0);
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
207 });
87
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
208 else if (what == "dot")
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
209 postSema.attach(
101
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
210 (Module[] m, SourceManager sm) {
87
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
211 StopWatch w; w.start;
101
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
212 // auto print = new DotPrinter();
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
213 // print.print(m);
87
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
214 timings ~= Measurement("Generating dot output", w.stop);
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
215 });
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
216 else if (what == "code")
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
217 postSema.attach(
101
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
218 (Module[] modules, SourceManager sm) {
87
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
219 StopWatch w; w.start;
88
eb5b2c719a39 Major change to locations, tokens and expressions.
Anders Halager <halager@gmail.com>
parents: 87
diff changeset
220 auto print = new AstPrinter(sm);
101
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
221 foreach ( m ; modules )
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
222 if (m.outputModule)
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
223 print.print(m);
87
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
224 timings ~= Measurement("Converting AST to text", w.stop);
40
9fb190ad81a4 Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents: 22
diff changeset
225 });
176
dc9bf56b7ace Can now use & as a unary operator and take an AddressOf
Anders Johnsen <skabet@gmail.com>
parents: 168
diff changeset
226 else if (what == "exit")
dc9bf56b7ace Can now use & as a unary operator and take an AddressOf
Anders Johnsen <skabet@gmail.com>
parents: 168
diff changeset
227 postSema.attach(
dc9bf56b7ace Can now use & as a unary operator and take an AddressOf
Anders Johnsen <skabet@gmail.com>
parents: 168
diff changeset
228 (Module[] modules, SourceManager sm) {
dc9bf56b7ace Can now use & as a unary operator and take an AddressOf
Anders Johnsen <skabet@gmail.com>
parents: 168
diff changeset
229 });
87
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
230 StopWatch total;
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
231 total.start;
101
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
232
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
233 Module[] modules;
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
234
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
235 StopWatch watch;
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
236 watch.start;
88
eb5b2c719a39 Major change to locations, tokens and expressions.
Anders Halager <halager@gmail.com>
parents: 87
diff changeset
237 foreach (file; filesToHandle)
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
238 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
239 preLex(file);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
240
88
eb5b2c719a39 Major change to locations, tokens and expressions.
Anders Halager <halager@gmail.com>
parents: 87
diff changeset
241 auto start = src_mgr.addFile(file);
89
a49bb982a7b0 Using the new SourceLocation system to handle errors. Also, this is the first push for making the errors don't throw, but continue to check the source.
Anders Johnsen <skabet@gmail.com>
parents: 88
diff changeset
242 auto lexer = new Lexer(start, src_mgr, messages);
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
243 postLex(lexer);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
244
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
245 preParse(lexer);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
246
89
a49bb982a7b0 Using the new SourceLocation system to handle errors. Also, this is the first push for making the errors don't throw, but continue to check the source.
Anders Johnsen <skabet@gmail.com>
parents: 88
diff changeset
247 auto parser = new Parser(messages);
88
eb5b2c719a39 Major change to locations, tokens and expressions.
Anders Halager <halager@gmail.com>
parents: 87
diff changeset
248 auto action = new AstAction(src_mgr);
101
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
249 modules ~= cast(Module)parser.parse(src_mgr, lexer, action);
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
250 timings ~= Measurement("Lex + Parse of '"~file~"'", watch.stop);
92
771ac63898e2 A few better parser errors plus renaming most of the sema classes to match that they do now. Some have changes a lot.
Anders Johnsen <skabet@gmail.com>
parents: 91
diff changeset
251 messages.checkErrors(ExitLevel.Parser);
101
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
252 /*
87
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
253 StopWatch watch2;
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
254 watch.start;
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
255 watch2.start;
100
5f258eaf9517 Loading modules in. Just need to add them to the scope of the "main" Module now.
Anders Johnsen <skabet@gmail.com>
parents: 97
diff changeset
256 Module[] mods = (new LoadModule).visit(m, src_mgr, messages);
94
48bb2287c035 Added Modules. Right now it's very simple - will grow with time and need.
Anders Johnsen <skabet@gmail.com>
parents: 92
diff changeset
257 (new ScopeBuilder).visit(m);
92
771ac63898e2 A few better parser errors plus renaming most of the sema classes to match that they do now. Some have changes a lot.
Anders Johnsen <skabet@gmail.com>
parents: 91
diff changeset
258 auto scope_builder = watch2.stop;
87
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
259 watch2.start;
94
48bb2287c035 Added Modules. Right now it's very simple - will grow with time and need.
Anders Johnsen <skabet@gmail.com>
parents: 92
diff changeset
260 (new ScopeCheck).visit(m);
92
771ac63898e2 A few better parser errors plus renaming most of the sema classes to match that they do now. Some have changes a lot.
Anders Johnsen <skabet@gmail.com>
parents: 91
diff changeset
261 auto scope_check = watch2.stop;
87
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
262 watch2.start;
94
48bb2287c035 Added Modules. Right now it's very simple - will grow with time and need.
Anders Johnsen <skabet@gmail.com>
parents: 92
diff changeset
263 (new TypeCheck).visit(m);
92
771ac63898e2 A few better parser errors plus renaming most of the sema classes to match that they do now. Some have changes a lot.
Anders Johnsen <skabet@gmail.com>
parents: 91
diff changeset
264 auto type_check = watch2.stop;
87
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
265 watch2.start;
13
e5caf9971207 Checking for types and identifiers. TODO: Make each varDecl create a new scope
johnsen@johnsen-desktop
parents: 1
diff changeset
266
94
48bb2287c035 Added Modules. Right now it's very simple - will grow with time and need.
Anders Johnsen <skabet@gmail.com>
parents: 92
diff changeset
267 foreach (decl; m.decls)
56
4ae365eff712 Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents: 51
diff changeset
268 decl.simplify();
87
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
269 auto simplify = watch2.stop;
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
270 auto extra_stuff = watch.stop;
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
271 timings ~= Measurement("Extra stuff", watch.stop);
92
771ac63898e2 A few better parser errors plus renaming most of the sema classes to match that they do now. Some have changes a lot.
Anders Johnsen <skabet@gmail.com>
parents: 91
diff changeset
272 timings ~= Measurement(" - Building scopes", scope_builder);
771ac63898e2 A few better parser errors plus renaming most of the sema classes to match that they do now. Some have changes a lot.
Anders Johnsen <skabet@gmail.com>
parents: 91
diff changeset
273 timings ~= Measurement(" - Checking scopes", scope_check);
771ac63898e2 A few better parser errors plus renaming most of the sema classes to match that they do now. Some have changes a lot.
Anders Johnsen <skabet@gmail.com>
parents: 91
diff changeset
274 timings ~= Measurement(" - Checking types", type_check);
56
4ae365eff712 Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents: 51
diff changeset
275
101
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
276 postParse(m, src_mgr);*/
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
277 }
101
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
278
106
89db676fbacb Now able of understanding strings.
Anders Johnsen <skabet@gmail.com>
parents: 101
diff changeset
279 (new LiteralInterpreter(messages)).visit(modules);
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
280 messages.checkErrors;
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
281 postParse(modules, src_mgr);
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
282
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
283 class ModuleLoader : Visitor!(void)
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
284 {
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
285 Module[] visit(Module[] modules, MessageHandler messages, SourceManager src_mgr)
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
286 {
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
287 this.modules = modules;
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
288 this.messages = messages;
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
289 this.src_mgr = src_mgr;
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
290 super.visit(modules);
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
291 return this.modules;
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
292 }
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
293
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
294 override void visitImportDecl(ImportDecl decl)
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
295 {
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
296 char[] path = replace!(char)(decl.get,'.','/')~".d";
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
297
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
298 auto start = src_mgr.addFile(path);
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
299 auto lexer = new Lexer(start, src_mgr, messages);
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
300
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
301 auto parser = new Parser(messages);
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
302 auto action = new AstAction(src_mgr);
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
303
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
304 Module m = cast(Module)parser.parse(src_mgr, lexer, action);
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
305 modules ~= m;
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
306 m.outputModule = false;
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
307 // decl.env.mHandle.add(m);
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
308 messages.checkErrors(ExitLevel.Parser);
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
309 }
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
310
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
311 Module[] modules;
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
312 SourceManager src_mgr;
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
313 MessageHandler messages;
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
314 }
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
315
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
316 modules = (new ModuleLoader()).visit(modules, messages, src_mgr);
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
317 messages.checkErrors;
106
89db676fbacb Now able of understanding strings.
Anders Johnsen <skabet@gmail.com>
parents: 101
diff changeset
318
194
08f68d684047 Rename some files. Hopefully we can get a more iterative sema pass, that's a lot easier to "get startet with".
Anders Johnsen <skabet@gmail.com>
parents: 176
diff changeset
319 (new BuildScopes).visit(modules);
08f68d684047 Rename some files. Hopefully we can get a more iterative sema pass, that's a lot easier to "get startet with".
Anders Johnsen <skabet@gmail.com>
parents: 176
diff changeset
320 (new BuildSymbols).visit(modules);
101
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
321 StopWatch watch2;
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
322 watch.start;
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
323 watch2.start;
195
4e1a7265d620 Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents: 194
diff changeset
324
4e1a7265d620 Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents: 194
diff changeset
325 (new BuildTypes(messages)).visit(modules);
4e1a7265d620 Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents: 194
diff changeset
326
194
08f68d684047 Rename some files. Hopefully we can get a more iterative sema pass, that's a lot easier to "get startet with".
Anders Johnsen <skabet@gmail.com>
parents: 176
diff changeset
327 (new CheckScopes(messages)).visit(modules);
150
6c5a3c0bb4fb Make switch work again
Anders Halager <halager@gmail.com>
parents: 136
diff changeset
328 messages.checkErrors;
101
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
329 auto scope_check = watch2.stop;
150
6c5a3c0bb4fb Make switch work again
Anders Halager <halager@gmail.com>
parents: 136
diff changeset
330
101
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
331 watch2.start;
194
08f68d684047 Rename some files. Hopefully we can get a more iterative sema pass, that's a lot easier to "get startet with".
Anders Johnsen <skabet@gmail.com>
parents: 176
diff changeset
332 (new CheckTypes(messages)).visit(modules);
150
6c5a3c0bb4fb Make switch work again
Anders Halager <halager@gmail.com>
parents: 136
diff changeset
333 messages.checkErrors;
101
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
334 auto type_check = watch2.stop;
150
6c5a3c0bb4fb Make switch work again
Anders Halager <halager@gmail.com>
parents: 136
diff changeset
335
101
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
336 watch2.start;
168
7982eb63c0eb Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents: 150
diff changeset
337 (new ObjectOriented(messages)).visit(modules);
7982eb63c0eb Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents: 150
diff changeset
338 messages.checkErrors;
7982eb63c0eb Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents: 150
diff changeset
339 auto object_check = watch2.stop;
7982eb63c0eb Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents: 150
diff changeset
340
7982eb63c0eb Some changes to get function overloading to work. Also class inherit works now - to some extend. needs vtables and all the complex stuff of it.
Anders Johnsen <skabet@gmail.com>
parents: 150
diff changeset
341 watch2.start;
150
6c5a3c0bb4fb Make switch work again
Anders Halager <halager@gmail.com>
parents: 136
diff changeset
342 auto vc = new VC;
6c5a3c0bb4fb Make switch work again
Anders Halager <halager@gmail.com>
parents: 136
diff changeset
343 vc.msg = messages;
6c5a3c0bb4fb Make switch work again
Anders Halager <halager@gmail.com>
parents: 136
diff changeset
344 foreach (m; modules)
6c5a3c0bb4fb Make switch work again
Anders Halager <halager@gmail.com>
parents: 136
diff changeset
345 m.verify(vc);
114
3a0cd42de9cc Removed misc/Error.d and is now using the error system all way through.
Anders Johnsen <skabet@gmail.com>
parents: 106
diff changeset
346 messages.checkErrors;
150
6c5a3c0bb4fb Make switch work again
Anders Halager <halager@gmail.com>
parents: 136
diff changeset
347 auto ast_verify = watch2.stop;
101
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
348
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
349 foreach (m; modules)
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
350 foreach (decl; m.decls)
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
351 decl.simplify();
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
352
87
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
353 timings ~= Measurement("Total", total.stop);
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 114
diff changeset
354 postSema(modules, src_mgr);
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
355
87
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
356 if (options.flag("time"))
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
357 foreach (m; timings)
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
358 Stderr.formatln("{,-45} {}ms", m.label, m.time*1e3);
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
359 }
87
9a35a973175a Some improvements to the compiler program
Anders Halager <halager@gmail.com>
parents: 68
diff changeset
360