From 8797d5cc0c4fb07b9047205b6dea55135b4788fa Mon Sep 17 00:00:00 2001 From: Dan Onoshko Date: Wed, 20 Aug 2014 02:32:57 +0700 Subject: [PATCH] Classes are done. --- README.md | 2 +- lib/translate.js | 82 +++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 68 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 3790d699..a3699e08 100644 --- a/README.md +++ b/README.md @@ -428,7 +428,7 @@ Future plans * const: vars * covert: vars, funcs, getters and setters in class and objects -- classes +- classes. status: done class A { diff --git a/lib/translate.js b/lib/translate.js index f47788bb..6c744af4 100644 --- a/lib/translate.js +++ b/lib/translate.js @@ -487,7 +487,7 @@ Cola.DefFunWithMods = function(func, mods){ }); } - if(mods.indexOf("static") != -1) + if(mods.indexOf("static") != -1 && mods.indexOf("method") == -1) Cola.Parser.prototype.token_error.call(Cola.Parser.prototype, func.start, "Function definition outside of class can't contain `static` modifer"); var sname = func.name, dp = { properties : [ @@ -529,7 +529,7 @@ Cola.DefFunWithMods = function(func, mods){ return new Cola.AST_Call({ args : [ sname instanceof Cola.AST_Proto - ? new Cola.AST_Dot({ expression: sname.expression, property: "prototype" }) + ? (mods.indexOf("static") != -1 ? sname.expression : new Cola.AST_Dot({ expression: sname.expression, property: "prototype" })) : sname.expression, sname instanceof Cola.AST_Sub ? sname.property @@ -1273,6 +1273,7 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ this.post_constructor(); } Test.prototype = _ColaRuntime$$proto(ParentTest); + Test.prototype.$uper = ParentTest.prototype. Test::Test2 = Test.Test2(){ this.pre_constructor(); @@ -1445,22 +1446,52 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ }); } - var scope, lvl = 0, hmembers, with_self = false, flvl_this = []; + var scope, lvl = 0, hmembers, with_super = false, with_self = false, self_def = false, flvl_this = []; binder = new Cola.TreeTransformer(function(member){ - var tmembers, tscope, tlvl; + var tmembers, tscope, tlvl, tself_def; member = member.clone(); - if(lvl > 1 && member instanceof Cola.AST_Var) + if(lvl > 1 && member instanceof Cola.AST_Var){ member.definitions.forEach(function(def){ - if(def.name instanceof Cola.AST_Symbol && hmembers.indexOf(def.name.name) != -1) - hmembers.splice(hmembers.indexOf(def.name.name), 1); + if(def.name instanceof Cola.AST_Symbol){ + if(hmembers.indexOf(def.name.name) != -1) + hmembers.splice(hmembers.indexOf(def.name.name), 1); + if(def.name.name == "self") + self_def = true; + } }); - else - if(lvl > 1 && (member instanceof Cola.AST_Defun || member instanceof Cola.AST_Getter || member instanceof Cola.AST_Setter) - && member.name instanceof Cola.AST_Symbol && hmembers.indexOf(member.name.name) != -1) + } else + + if(lvl > 1 && (member instanceof Cola.AST_Defun || member instanceof Cola.AST_Getter || member instanceof Cola.AST_Setter) && member.name instanceof Cola.AST_Symbol && hmembers.indexOf(member.name.name) != -1){ hmembers.splice(hmembers.indexOf(member.name.name), 1); - else if(member instanceof Cola.AST_Scope) scope = (lvl++, member); - else if(member instanceof Cola.AST_SymbolRef && hmembers.indexOf(member.name) != -1){ + } else + + if(member instanceof Cola.AST_Scope) + scope = (lvl++, member); + else + + if(member instanceof Cola.AST_Call && member.expression instanceof Cola.AST_Symbol && member.expression.name == "super"){ + member.expression = new Cola.AST_Dot({ + expression : member.expression, + property : "call" + }); + member.args.unshift(new Cola.AST_This); + } else + + if(member instanceof Cola.AST_Call && member.expression instanceof Cola.AST_Dot && member.expression.expression.name == "super"){ + member.expression = new Cola.AST_Dot({ + expression : member.expression, + property : "call" + }); + member.args.unshift(new Cola.AST_This); + } else + + if(member instanceof Cola.AST_SymbolRef && hmembers.indexOf(member.name) != -1){ + if(member.name == "super"){ + with_super = true; + member.name = "$uper"; + } + member = new Cola.AST_Dot({ expression : lvl > 1 ? (with_self = true, new Cola.AST_SymbolRef({ name: "self" })) @@ -1469,6 +1500,11 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ }); if(lvl == 1) flvl_this.push(member); } else + + if(member instanceof Cola.AST_SymbolRef && member.name == "self" && !self_def){ + with_self = true; + } else + if(member instanceof Cola.AST_SymbolVar && scope.name instanceof Cola.AST_Proto && (scope.name.property == "pre_constructor" || scope.name.property == "post_constructor") && hmembers.indexOf(member.name) != -1){ member = new Cola.AST_Dot({ @@ -1480,17 +1516,18 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ if(lvl == 1) flvl_this.push(member); } - tscope = scope; tlvl = lvl; tmembers = hmembers.slice(); + tscope = scope; tlvl = lvl; tmembers = hmembers.slice(); tself_def = self_def; member._descend(member, this); - scope = tscope; lvl = tlvl; hmembers = tmembers; + scope = tscope; lvl = tlvl; hmembers = tmembers; self_def = tself_def; return member; }); - + newNode.forEach(function(member, i){ lvl = 0; flvl_this = []; with_self = false; + self_def = false; hmembers = members.slice(); if(member instanceof Cola.AST_Lambda){ @@ -1515,6 +1552,17 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ } }); + if(with_super){ + newNode.push(new Cola.AST_Assign({ + left : new Cola.AST_Proto({ expression: node.name, property: "$uper" }), + operator : "=", + right : new Cola.AST_Dot({ expression: node.extends, property: "prototype" }), + })); + newNode[newNode.length - 1] = new Cola.AST_SimpleStatement({ + body : newNode[newNode.length - 1] + }); + } + node = new Cola.AST_BlockStatement({ body: newNode }); } else @@ -2047,6 +2095,10 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ }); } else + if(node instanceof Cola.AST_ArrayTemplate || node instanceof Cola.AST_ObjectTemplate){ + Cola.Parser.prototype.token_error.call(Cola.Parser.prototype, node.start, "Incorrect usage of distructive templates."); + } else + /* func({ a : aname, b : bname } = obj)