Classes are done.
This commit is contained in:
parent
ad70d58e83
commit
8797d5cc0c
|
|
@ -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 {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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){
|
||||||
hmembers.splice(hmembers.indexOf(def.name.name), 1);
|
if(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,17 +1516,18 @@ 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;
|
||||||
});
|
});
|
||||||
|
|
||||||
newNode.forEach(function(member, i){
|
newNode.forEach(function(member, i){
|
||||||
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)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user