Classes are done.

This commit is contained in:
Dan Onoshko 2014-08-20 02:32:57 +07:00
parent ad70d58e83
commit 8797d5cc0c
2 changed files with 68 additions and 16 deletions

View File

@ -428,7 +428,7 @@ Future plans
* const: vars * const: vars
* covert: vars, funcs, getters and setters in class and objects * covert: vars, funcs, getters and setters in class and objects
- classes - classes. status: done
class A { class A {

View File

@ -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"); 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 : [ var sname = func.name, dp = { properties : [
@ -529,7 +529,7 @@ Cola.DefFunWithMods = function(func, mods){
return new Cola.AST_Call({ return new Cola.AST_Call({
args : [ args : [
sname instanceof Cola.AST_Proto 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.expression,
sname instanceof Cola.AST_Sub sname instanceof Cola.AST_Sub
? sname.property ? sname.property
@ -1273,6 +1273,7 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){
this.post_constructor(); this.post_constructor();
} }
Test.prototype = _ColaRuntime$$proto(ParentTest); Test.prototype = _ColaRuntime$$proto(ParentTest);
Test.prototype.$uper = ParentTest.prototype.
Test::Test2 = Test.Test2(){ Test::Test2 = Test.Test2(){
this.pre_constructor(); 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){ binder = new Cola.TreeTransformer(function(member){
var tmembers, tscope, tlvl; var tmembers, tscope, tlvl, tself_def;
member = member.clone(); member = member.clone();
if(lvl > 1 && member instanceof Cola.AST_Var) if(lvl > 1 && member instanceof Cola.AST_Var){
member.definitions.forEach(function(def){ member.definitions.forEach(function(def){
if(def.name instanceof Cola.AST_Symbol && 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); hmembers.splice(hmembers.indexOf(def.name.name), 1);
if(def.name.name == "self")
self_def = true;
}
}); });
else } 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) 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); hmembers.splice(hmembers.indexOf(member.name.name), 1);
else if(member instanceof Cola.AST_Scope) scope = (lvl++, member); } else
else if(member instanceof Cola.AST_SymbolRef && hmembers.indexOf(member.name) != -1){
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({ member = new Cola.AST_Dot({
expression : lvl > 1 expression : lvl > 1
? (with_self = true, new Cola.AST_SymbolRef({ name: "self" })) ? (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); if(lvl == 1) flvl_this.push(member);
} else } 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") 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){ && hmembers.indexOf(member.name) != -1){
member = new Cola.AST_Dot({ member = new Cola.AST_Dot({
@ -1480,9 +1516,9 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){
if(lvl == 1) flvl_this.push(member); 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); member._descend(member, this);
scope = tscope; lvl = tlvl; hmembers = tmembers; scope = tscope; lvl = tlvl; hmembers = tmembers; self_def = tself_def;
return member; return member;
}); });
@ -1491,6 +1527,7 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){
lvl = 0; lvl = 0;
flvl_this = []; flvl_this = [];
with_self = false; with_self = false;
self_def = false;
hmembers = members.slice(); hmembers = members.slice();
if(member instanceof Cola.AST_Lambda){ 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 }); node = new Cola.AST_BlockStatement({ body: newNode });
} else } else
@ -2047,6 +2095,10 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){
}); });
} else } 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) func({ a : aname, b : bname } = obj)