瀏覽代碼

compile dependencies too

Vladislav Folts 11 年之前
父節點
當前提交
330fa59eef
共有 2 個文件被更改,包括 50 次插入13 次删除
  1. 1 1
      test/compile.cmd
  2. 49 12
      test/compile.js

+ 1 - 1
test/compile.cmd

@@ -1,2 +1,2 @@
 @SET NODE_PATH=.;%~dp0../src
-@"C:\Program Files\nodejs\node.exe" compile.js %*
+@"C:\Program Files\nodejs\node.exe" %~dp0\compile.js %*

+ 49 - 12
test/compile.js

@@ -2,25 +2,62 @@
 
 var oc = require("oc");
 var fs = require("fs");
-var path = require("path");
+var rtl = require("rtl.js");
+var Stream = require("stream.js").Stream;
+var Class = rtl.Class;
+
+var Compiler = Class.extend({
+    init: function Compiler(){
+        this.__rtl = new rtl.RTL();
+        this.__code = "";
+        this.__errors = "";
+        this.__modules = {};
+    },
+    addFile: function(file){
+        console.info("compiling '" + file + "...")
+        var text = fs.readFileSync(file, "utf8");
+        var stream = new Stream(text);
+        var module = oc.compileModule(
+              stream,
+              this.__rtl,
+              this.__resolveModule.bind(this),
+              function(e){this.__handleErrors(file, e);}.bind(this)
+              );
+        if (!module)
+            return undefined;
+
+        this.__code += module.code();
+
+        var symbol = module.symbol();
+        this.__modules[symbol.id()] = symbol.info();
+        return symbol.info();
+    },
+    code: function(){return this.__rtl.generate() + this.__code;},
+    errors: function(){return this.__errors;},
+    __resolveModule: function(name){
+        var compiled = this.__modules[name];
+        if (compiled)
+            return compiled;
+
+        var fileName = name + ".ob";
+        return this.addFile(fileName);
+    },
+    __handleErrors: function(file, e){
+        this.__errors += "File \"" + file + "\", " + e;
+    }
+});
 
 function compile(src){
-    var text = fs.readFileSync(src, "utf8");
-    var errors = "";
-    var result = oc.compile(text, function(e){errors += "File \"" + src + "\", " + e;});
+    var compiler = new Compiler();
+    compiler.addFile(src);
+    var errors = compiler.errors();
     if (errors){
         console.info(errors);
         return;
     }
 
-    var fileName = path.basename(src);
-    if (path.extname(fileName) != ".ob"){
-        console.info(result);
-        return;
-    }
-
-    fileName = fileName.substr(0, fileName.length - ".ob".length) + ".js";
-    fs.writeFileSync(fileName, result);
+    var fileName = "a.js";
+    fs.writeFileSync(fileName, compiler.code());
     console.info("compiled to '" + fileName + "' - OK!");
 
 }