diff --git a/README.md b/README.md index a3699e08..8475306f 100644 --- a/README.md +++ b/README.md @@ -485,7 +485,7 @@ Future plans return res; } } - +- add `observe` modificator. - static typing - `@use` expressions diff --git a/lib/std.js b/lib/std.js index 5a9d4b00..ef29a260 100644 --- a/lib/std.js +++ b/lib/std.js @@ -148,7 +148,7 @@ Cola._ColaRuntime$$updateProperty.i = 14; Cola._ColaRuntime$$proto = function _ColaRuntime$$proto(_proto) { function proto(){} proto.prototype = _proto.prototype; - return new c(); + return new proto(); }; Cola._ColaRuntime$$proto.i = 15; diff --git a/lib/translate.js b/lib/translate.js index 6c744af4..ff750314 100644 --- a/lib/translate.js +++ b/lib/translate.js @@ -1339,8 +1339,15 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ body : [] }); + var has_main_constr = false; node.body.forEach(function(member){ if(member instanceof Cola.AST_Defun && member.name instanceof Cola.AST_SymbolDefun && member.name.name == node.name.name){ + if(member.type != "dynamic") + Cola.Parser.prototype.token_error.call(Cola.Parser.prototype, member.start, "Constructor can't have returned type."); + + if(member.mods.length != 0) + Cola.Parser.prototype.token_error.call(Cola.Parser.prototype, member.start, "Constructor can't have modificators."); + if(main_constructors.some(function(constr){ return constr.name instanceof Cola.AST_Dot; })) Cola.Parser.prototype.token_error.call(Cola.Parser.prototype, member.start, "Main constructor must be defined before named constructors"); @@ -1350,6 +1357,8 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ main_constructors.push(member); newNode.push(member); + has_main_constr = true; + if(node.extends){ _ColaRuntime$$hash[Cola._ColaRuntime$$proto.i] = true; newNode.push(new Cola.AST_Assign({ @@ -1370,6 +1379,12 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ if(member instanceof Cola.AST_Defun && member.name instanceof Cola.AST_Dot && member.name.expression instanceof Cola.AST_SymbolDefun && member.name.expression.name == node.name.name){ + if(member.type != "dynamic") + Cola.Parser.prototype.token_error.call(Cola.Parser.prototype, member.start, "Constructor can't have returned type."); + + if(member.mods.length != 0) + Cola.Parser.prototype.token_error.call(Cola.Parser.prototype, member.start, "Constructor can't have modificators."); + if(main_constructors.some(function(constr){ return constr.name instanceof Cola.AST_Dot && constr.name.property == member.name.property; })) Cola.Parser.prototype.token_error.call(Cola.Parser.prototype, member.start, "Constructor can be defined only one time"); @@ -1420,6 +1435,40 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ } }); + if(!has_main_constr){ + newNode.push(new Cola.AST_Defun({ + mods : [], + type : "dynamic", + name : new Cola.AST_SymbolDefun(node.name), + argnames : [], + body : [] + })); + + main_constructors.push(newNode[newNode.length - 1]); + + if(node.extends){ + newNode[newNode.length - 1].body.push(new Cola.AST_SimpleStatement({ + body : new Cola.AST_Call({ + expression : new Cola.AST_SymbolRef({ name: "super" }), + args : [] + }) + })); + + _ColaRuntime$$hash[Cola._ColaRuntime$$proto.i] = true; + newNode.push(new Cola.AST_Assign({ + left : new Cola.AST_Dot({ expression: node.name, property: "prototype" }), + operator : "=", + right : new Cola.AST_Call({ + expression : new Cola.AST_SymbolRef({ name: "_ColaRuntime$$proto" }), + args : [node.extends] + }) + })); + newNode[newNode.length - 1] = new Cola.AST_SimpleStatement({ + body : newNode[newNode.length - 1] + }); + } + } + if(pre_constructor.body.length != 0){ newNode.push(pre_constructor); main_constructors.forEach(function(constr){ @@ -1470,7 +1519,15 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ scope = (lvl++, member); else - if(member instanceof Cola.AST_Call && member.expression instanceof Cola.AST_Symbol && member.expression.name == "super"){ + if(member instanceof Cola.AST_Call && member.expression instanceof Cola.AST_Symbol && member.expression.name == "super" && node.extends){ + member.expression = new Cola.AST_Dot({ + expression : node.extends, + 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" && node.extends){ member.expression = new Cola.AST_Dot({ expression : member.expression, property : "call" @@ -1478,15 +1535,7 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ 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 instanceof Cola.AST_SymbolRef && hmembers.indexOf(member.name) != -1 && node.extends){ if(member.name == "super"){ with_super = true; member.name = "$uper";