Mercurial > projects > dang
changeset 100:5f258eaf9517 new_gen
Loading modules in. Just need to add them to the scope of the "main" Module now.
author | Anders Johnsen <skabet@gmail.com> |
---|---|
date | Tue, 06 May 2008 22:49:43 +0200 |
parents | 857f0d530789 |
children | fea8d61a2451 |
files | basic/Message.d basic/Messages.d basic/SourceLocation.d dang/compiler.d parser/Parser.d sema/LoadModule.d |
diffstat | 6 files changed, 76 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/basic/Message.d Tue May 06 21:59:22 2008 +0200 +++ b/basic/Message.d Tue May 06 22:49:43 2008 +0200 @@ -23,6 +23,7 @@ Normal = 1, Lexer = 2, Parser = 3, + Semantic = 3, } class MessageHandler
--- a/basic/Messages.d Tue May 06 21:59:22 2008 +0200 +++ b/basic/Messages.d Tue May 06 22:49:43 2008 +0200 @@ -24,6 +24,10 @@ // - imports/module ExpectedIdAfterPackage, RenameMustBeSingleIdent, + + + // Imports + CannotFindModule, } enum MessageType @@ -62,7 +66,8 @@ ExpectedCastType : E(Err, "Expected cast type"), InvalidDeclType : E(Err, "Invalid declaration type"), InvalidType : E(Err, "Invalid type"), - ExpectedIdAfterPackage : E(Err, "Identifier expected following package") + ExpectedIdAfterPackage : E(Err, "Identifier expected following package"), + CannotFindModule : E(Err, "Cannot find module '%0'") ]; }
--- a/basic/SourceLocation.d Tue May 06 21:59:22 2008 +0200 +++ b/basic/SourceLocation.d Tue May 06 22:49:43 2008 +0200 @@ -67,7 +67,7 @@ { assert(fileID < Bits.MaxFileID, "To large fileID"); SourceLocation res; - res.val = fileID << Bits.FileID; + res.val = fileID << Bits.FileOffset; return res; }
--- a/dang/compiler.d Tue May 06 21:59:22 2008 +0200 +++ b/dang/compiler.d Tue May 06 22:49:43 2008 +0200 @@ -23,6 +23,7 @@ import gen.CodeGen; import sema.Visitor, + sema.LoadModule, sema.AstAction, sema.ScopeBuilder, sema.ScopeCheck, @@ -207,6 +208,7 @@ StopWatch watch2; watch.start; watch2.start; + Module[] mods = (new LoadModule).visit(m, src_mgr, messages); (new ScopeBuilder).visit(m); auto scope_builder = watch2.stop; watch2.start;
--- a/parser/Parser.d Tue May 06 21:59:22 2008 +0200 +++ b/parser/Parser.d Tue May 06 22:49:43 2008 +0200 @@ -182,6 +182,9 @@ require(Tok.Seperator); res ~= d; return res.safe(); + case Tok.Seperator: + done = true; + break; default: goto Lerror; }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sema/LoadModule.d Tue May 06 22:49:43 2008 +0200 @@ -0,0 +1,63 @@ +module sema.LoadModule; + +import sema.Visitor, + sema.AstAction, + sema.ScopeBuilder, + sema.ScopeCheck, + sema.TypeCheck; + +import lexer.Lexer; +import parser.Parser; + +import basic.SourceManager, + basic.Message; + +import tango.io.Stdout, + tango.io.FilePath; + + +class LoadModule : Visitor!(Module[], void) +{ + Module[] visit(Module m, SourceManager sc, MessageHandler messages) + { + this.messages = messages; + this.sc = sc; + + visitModule(m); + + return res; + } + + void visitImportDecl(ImportDecl i) + { + char[] dir; + + foreach(p ; i.packages) + dir ~= p.get ~ "/"; + + dir ~= i.name.name ~".d"; + + if(!FilePath(dir).exists) + messages.report(CannotFindModule, i.name.loc) + .arg(dir) + .fatal(ExitLevel.Semantic); + + auto start = sc.addFile(dir); + auto lexer = new Lexer(start, sc, messages); + auto parser = new Parser(messages); + auto action = new AstAction(sc); + auto m = cast(Module)parser.parse(sc, lexer, action); + messages.checkErrors(ExitLevel.Parser); + + Module[] mods = (new LoadModule).visit(m, sc, messages); + (new ScopeBuilder).visit(m); + (new ScopeCheck).visit(m); + (new TypeCheck).visit(m); + + res ~= m; + } + + MessageHandler messages; + Module[] res; + SourceManager sc; +}