|
|
@@ -14,20 +14,88 @@ class AtomicBuilder {
|
|
|
var buf: StringBuf;
|
|
|
var inits : List<TypedExpr>;
|
|
|
var statics : List<{ c : ClassType, f : ClassField }>;
|
|
|
- var requirements: List<String>;
|
|
|
+ var requirements: Map<String, Array<String>>;
|
|
|
+ var currClass:ClassType;
|
|
|
+ var components:List<ClassType>;
|
|
|
|
|
|
function new(api:JSGenApi) {
|
|
|
this.api = api;
|
|
|
this.buf = new StringBuf();
|
|
|
this.inits = new List();
|
|
|
this.statics = new List();
|
|
|
- this.requirements = new List();
|
|
|
+ this.requirements = new Map();
|
|
|
+ this.components = new List();
|
|
|
+ api.setTypeAccessor(getType);
|
|
|
build();
|
|
|
}
|
|
|
|
|
|
+ function getType( t : Type ) {
|
|
|
+ return switch(t) {
|
|
|
+ case TInst(c, _):
|
|
|
+ getPath(c.get());
|
|
|
+ case TEnum(e, _):
|
|
|
+ getPath(e.get());
|
|
|
+ case TAbstract(a, _):
|
|
|
+ getPath(a.get());
|
|
|
+ default: throw "assert";
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ function getPath( t : BaseType ) {
|
|
|
+ var s:Array<String> = t.module.split(".");
|
|
|
+ if (s[0].toLowerCase() == "atomic") {
|
|
|
+ if (StringTools.startsWith(t.name, "Atomic")) {
|
|
|
+ return t.name;
|
|
|
+ }
|
|
|
+ return "Atomic." + t.name;
|
|
|
+ }
|
|
|
+ //skip to do not require itself
|
|
|
+ if (t.name == currClass.name) return t.name;
|
|
|
+
|
|
|
+ var mod = t.module.split(".");
|
|
|
+ if (mod[0].toLowerCase() == "scripts") {
|
|
|
+ var n = "";
|
|
|
+ for (pa in mod) {
|
|
|
+ if (mod[0] == pa) {
|
|
|
+ n += pa;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ n += "/" + pa;
|
|
|
+ }
|
|
|
+ addReq(n);
|
|
|
+ } else if (mod[0].toLowerCase() == "components") {
|
|
|
+ var n = "";
|
|
|
+ for (pa in mod) {
|
|
|
+ if (mod[0] == pa) {
|
|
|
+ n += pa;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ n += "/" + pa;
|
|
|
+ }
|
|
|
+ addReq(n);
|
|
|
+ } else {
|
|
|
+ addReq("Modules/" + t.name);
|
|
|
+ }
|
|
|
+ return t.name;
|
|
|
+ }
|
|
|
+
|
|
|
+ function addReq(name:String) {
|
|
|
+ if (!requirements.exists(currClass.name)) {
|
|
|
+ requirements.set(currClass.name, new Array());
|
|
|
+ }
|
|
|
+ var arr = requirements.get(currClass.name);
|
|
|
+ for (i in arr) {
|
|
|
+ if (i == name) return;
|
|
|
+ }
|
|
|
+ arr.push(name);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
function build():Void {
|
|
|
for( t in api.types )
|
|
|
genType(t);
|
|
|
+ for (comp in components)
|
|
|
+ genComponent(comp);
|
|
|
}
|
|
|
|
|
|
function genType( t : Type ):Void {
|
|
|
@@ -48,12 +116,18 @@ class AtomicBuilder {
|
|
|
inline function print(str):Void {
|
|
|
buf.add(str);
|
|
|
}
|
|
|
+
|
|
|
+ inline function prepend(str):Void {
|
|
|
+ var b = new StringBuf();
|
|
|
+ b.add(str);
|
|
|
+ b.add(buf.toString());
|
|
|
+ buf = b;
|
|
|
+ }
|
|
|
|
|
|
inline function newline():Void {
|
|
|
buf.add(";\n");
|
|
|
}
|
|
|
|
|
|
- //extend function which I took from typescript
|
|
|
inline function printExtend__():Void {
|
|
|
var str:String = "var __extends = (this && this.__extends) || function (d, b) {for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];function __() { this.constructor = d; };__.prototype = b.prototype;d.prototype = new __();};\n";
|
|
|
print(str);
|
|
|
@@ -65,48 +139,24 @@ class AtomicBuilder {
|
|
|
|
|
|
inline function getExpr(e):String {
|
|
|
var out = api.generateValue(e);
|
|
|
- //TODO: properly handle components
|
|
|
- //I'm renaming it, to avoid components_Star e.g.
|
|
|
- out = StringTools.replace(out, "atomic.", "");
|
|
|
- out = StringTools.replace(out, "scripts_", "");
|
|
|
- out = StringTools.replace(out, "components_", "");
|
|
|
return out;
|
|
|
}
|
|
|
|
|
|
- //TODO: Rethink how to handle imports correctly, because now it's really not a good way
|
|
|
//https://github.com/HaxeFoundation/haxe/issues/3560
|
|
|
function checkRequires(c: ClassType):Void {
|
|
|
- requirements.clear();
|
|
|
- var mets = c.meta.get();
|
|
|
-
|
|
|
- for (meta in mets) {
|
|
|
- if (meta.name == ":require") {
|
|
|
- for (param in meta.params) {
|
|
|
- switch(param.expr) {
|
|
|
- case EConst(CString(s)):
|
|
|
- requirements.add(s);
|
|
|
- default:
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- for (req in requirements) {
|
|
|
- var name = "";
|
|
|
- if (req.charAt(0) == 'C') {
|
|
|
- name = "Components/" + req.substr(1, req.length);
|
|
|
- }else if (req.charAt(0) == 'S') {
|
|
|
- name = "Scripts/" + req.substr(1, req.length);
|
|
|
- } else if (req.charAt(0) == 'M') {
|
|
|
- name = "Modules/" + req.substr(1, req.length);
|
|
|
- }
|
|
|
- print("var " + req.substr(1, req.length) + " = require(\"" + name + "\");\n");
|
|
|
+ var arr = requirements.get(currClass.name);
|
|
|
+ if (arr == null || arr.length == 0) return;
|
|
|
+ for (req in requirements.get(currClass.name)) {
|
|
|
+ var a = req.split("/");
|
|
|
+ var name = a[a.length - 1];
|
|
|
+ prepend("var " + name + " = require(\"" + req + "\");\n");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function genClass(c:ClassType):Void {
|
|
|
- if (c.name == "Std") return;
|
|
|
- if (c.pack[0] == "components") {
|
|
|
- genComponent(c);
|
|
|
+ //if (c.name == "Std") return;
|
|
|
+ if (c.pack.length > 0 && c.pack[0].toLowerCase() == "components") {
|
|
|
+ components.add(c);
|
|
|
} else {
|
|
|
genScript(c);
|
|
|
}
|
|
|
@@ -126,11 +176,11 @@ class AtomicBuilder {
|
|
|
|
|
|
function genScript(c: ClassType):Void {
|
|
|
//If pack length equals 0, so it's probably a haxe's class, so, require a HxOverrides
|
|
|
- if (c.pack.length == 0) {
|
|
|
- print("var HxOverrides = require(\"./HxOverrides\");\n");
|
|
|
- }
|
|
|
+ //if (c.pack.length == 0) {
|
|
|
+ // print("var HxOverrides = require(\"./HxOverrides\");\n");
|
|
|
+ //}
|
|
|
api.setCurrentClass(c);
|
|
|
- checkRequires(c);
|
|
|
+ currClass = c;
|
|
|
printExtend__();
|
|
|
print("var " + c.name + " = (function(_super) {\n");
|
|
|
print("__extends(" + c.name + ", _super);\n");
|
|
|
@@ -142,19 +192,26 @@ class AtomicBuilder {
|
|
|
}
|
|
|
newline();
|
|
|
print("return " + c.name + ";\n");
|
|
|
- print("})(" + (c.superClass == null ? "Object" : c.superClass.t.toString()) +");\n");
|
|
|
- print("module.exports = " + c.name + ";");
|
|
|
-
|
|
|
- var p = c.pack[0] + ("/") + c.name + ".js";
|
|
|
- //If it's a haxe's class
|
|
|
- p = StringTools.replace(p, "null", "Modules");
|
|
|
+ print("})(" + (c.superClass == null ? "Object" : getPath(c.superClass.t.get())) +");\n");
|
|
|
+ print("module.exports = " + c.name + ";\n");
|
|
|
+ checkRequires(c);
|
|
|
+ var p = "";
|
|
|
+ //script path
|
|
|
+ if (c.pack.length > 0 && c.pack[0].toLowerCase() == "scripts") {
|
|
|
+ for (pa in c.pack) {
|
|
|
+ p += pa + "/";
|
|
|
+ }
|
|
|
+ p += c.name + ".js";
|
|
|
+ } else {
|
|
|
+ p = "Modules/" + c.name + ".js";
|
|
|
+ }
|
|
|
File.saveContent(p, buf.toString());
|
|
|
buf = new StringBuf();
|
|
|
}
|
|
|
|
|
|
function genComponent(c: ClassType):Void {
|
|
|
- api.setCurrentClass(c);
|
|
|
- checkRequires(c);
|
|
|
+ api.setCurrentClass(c);
|
|
|
+ currClass = c;
|
|
|
printExtend__();
|
|
|
print("\"atomic component\"");
|
|
|
newline();
|
|
|
@@ -168,9 +225,14 @@ class AtomicBuilder {
|
|
|
}
|
|
|
newline();
|
|
|
print("return " + c.name + ";\n");
|
|
|
- print("})(" + (c.superClass == null ? "Object" : StringTools.replace(c.superClass.t.toString(), "components.", "")) +");\n");
|
|
|
- print("module.exports = " + c.name + ";");
|
|
|
- var p = c.pack[0] + ("/") + c.name + ".js";
|
|
|
+ print("})(" + (c.superClass == null ? "Object" : getPath(c.superClass.t.get())) +");\n");
|
|
|
+ print("module.exports = " + getPath(c) + ";\n");
|
|
|
+ checkRequires(c);
|
|
|
+ var p = "";
|
|
|
+ for (pa in c.pack) {
|
|
|
+ p += pa + "/";
|
|
|
+ }
|
|
|
+ p += c.name + ".js";
|
|
|
File.saveContent(p, buf.toString());
|
|
|
buf = new StringBuf();
|
|
|
}
|
|
|
@@ -179,7 +241,7 @@ class AtomicBuilder {
|
|
|
var field = f.name;
|
|
|
var e = f.expr();
|
|
|
if( e == null ) {
|
|
|
- print('NULL :(');
|
|
|
+ print("null");
|
|
|
newline();
|
|
|
} else switch( f.kind ) {
|
|
|
case FMethod(_):
|
|
|
@@ -190,6 +252,10 @@ class AtomicBuilder {
|
|
|
genExpr(api.main);
|
|
|
}
|
|
|
newline();
|
|
|
+ case FVar(r, w):
|
|
|
+ print(c.name + '.$field = ');
|
|
|
+ genExpr(e);
|
|
|
+ newline();
|
|
|
default:
|
|
|
statics.add( { c : c, f : f } );
|
|
|
}
|