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;
+}