Classes are done.
This commit is contained in:
parent
ad70d58e83
commit
8797d5cc0c
|
|
@ -428,7 +428,7 @@ Future plans
|
|||
* const: vars
|
||||
* covert: vars, funcs, getters and setters in class and objects
|
||||
|
||||
- classes
|
||||
- classes. status: done
|
||||
|
||||
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");
|
||||
|
||||
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,9 +1516,9 @@ 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;
|
||||
});
|
||||
|
|
@ -1491,6 +1527,7 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){
|
|||
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)
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user