Some fixes. Class translation spec is done.

This commit is contained in:
Onoshko Dan 2014-08-16 22:40:23 +07:00
parent 0585a8eb8f
commit 73fbeb2377
3 changed files with 131 additions and 35 deletions

View File

@ -1438,11 +1438,14 @@ Cola.Parser.prototype.function_ = function(ctor, type, mods) {
!type && (type = "dynamic"); !type && (type = "dynamic");
!mods && (mods = []); !mods && (mods = []);
var in_statement = ctor === Cola.AST_Defun || Cola.AST_Setter || Cola.AST_Getter, _this = this, splatedexist = false; var in_statement = ctor === Cola.AST_Defun || ctor === Cola.AST_Setter || ctor === Cola.AST_Getter, _this = this, splatedexist = false;
var name = this.is("name") ? this.as_symbol(in_statement ? Cola.AST_SymbolDefun : Cola.AST_SymbolLambda) : null; var name = this.is("name") ? this.as_symbol(in_statement ? Cola.AST_SymbolDefun : Cola.AST_SymbolLambda) : null;
//var args_skiped = false;
if (name != null) name = this.subscripts(name, false); if (name != null) name = this.subscripts(name, false);
if (in_statement && !name) if (in_statement && !name)
this.unexpected(); this.unexpected();
this.expect("("); this.expect("(");
return new ctor({ return new ctor({
mods: mods, mods: mods,
@ -1784,23 +1787,31 @@ Cola.Parser.prototype.expr_atom = function(allow_calls) {
if (!this.is_js && this.is("name")) { if (!this.is_js && this.is("name")) {
if(this.next_is("name")){ if(this.next_is("name")){
type = this.S.token.value, this.next(); type = this.S.token.value, this.next();
return this.function_(Cola.AST_Function, type);
var isfun = false;
this.dumpS();
this.subscripts(this.as_symbol(Cola.AST_SymbolLambda), false);
isfun = this.is("punc", "(");
this.restoreS();
if(isfun) return this.function_(Cola.AST_Function, type);
} }
var _this = this, balance = 1, isfun = false; var _this = this, balance = 1, isfun = false;
this.dumpS(); this.dumpS();
this.next(); this.subscripts(this.as_symbol(Cola.AST_SymbolLambda), false);
if(this.is('punc', '(')){ if(this.is('punc', '(')){
this.next(); this.next();
this.next_until(function(){ this.next_until(function(){
if(_this.is('punc', '(')) balance++; if(_this.is('punc', '(')) balance++;
else if(_this.is('punc', ')')) balance--; else if(_this.is('punc', ')')) balance--;
return balance == 0 || _this.is('eof'); return balance == 0 || _this.is('eof');
}); });
isfun = (this.next(), (this.is('punc','{') || this.is('punc','=>'))); isfun = (this.next(), (this.is('punc','{') || this.is('punc','=>')));
} }
this.restoreS(); this.restoreS();
if(isfun) return this.function_(Cola.AST_Function); if(isfun) return this.function_(Cola.AST_Function);

View File

@ -145,13 +145,21 @@ Cola._ColaRuntime$$updateProperty = function _ColaRuntime$$updateProperty(_objec
}; };
Cola._ColaRuntime$$updateProperty.i = 14; Cola._ColaRuntime$$updateProperty.i = 14;
Cola._ColaRuntime$$arguments_def = { i : 15 }; Cola._ColaRuntime$$proto = function _ColaRuntime$$proto(_proto) {
function proto(){}
proto.prototype = _proto.prototype;
return new c();
};
Cola._ColaRuntime$$proto.i = 15;
Cola._ColaRuntime$$arguments_def = { i : 16 };
Cola.$_cola = Cola.$_cola =
Cola._ColaRuntime$$is + Cola._ColaRuntime$$isnt + Cola._ColaRuntime$$modulo + Cola._ColaRuntime$$isset + Cola._ColaRuntime$$is + Cola._ColaRuntime$$isnt + Cola._ColaRuntime$$modulo + Cola._ColaRuntime$$isset +
Cola._ColaRuntime$$isntset + Cola._ColaRuntime$$clone + Cola._ColaRuntime$$array_last + Cola._ColaRuntime$$array_range + Cola._ColaRuntime$$isntset + Cola._ColaRuntime$$clone + Cola._ColaRuntime$$array_last + Cola._ColaRuntime$$array_range +
Cola._ColaRuntime$$array_asplice + Cola._ColaRuntime$$func_named_args + Cola._ColaRuntime$$func_set_named_args + Cola._ColaRuntime$$error + Cola._ColaRuntime$$array_asplice + Cola._ColaRuntime$$func_named_args + Cola._ColaRuntime$$func_set_named_args + Cola._ColaRuntime$$error +
Cola._ColaRuntime$$array_negate_access + Cola._ColaRuntime$$array_modulo_access + Cola._ColaRuntime$$updateProperty + Cola._ColaRuntime$$array_negate_access + Cola._ColaRuntime$$array_modulo_access + Cola._ColaRuntime$$updateProperty +
Cola._ColaRuntime$$proto +
"var arguments;"; "var arguments;";
Cola.Compressor.StdFuncs = { Cola.Compressor.StdFuncs = {

View File

@ -393,13 +393,15 @@ Cola.DefPropWithMods = function(def, mods){
new Cola.AST_ObjectKeyVal({ new Cola.AST_ObjectKeyVal({
key : "value", key : "value",
value : def.value value : def.value
}),
new Cola.AST_ObjectKeyVal({
key : "configurable",
value : new Cola.AST_True
}) })
] }; ] };
if(!(def.name.expression instanceof Cola.AST_Symbol && def.name.expression.name == "this" || def.name instanceof Cola.AST_Proto))
dp.properties.push(new Cola.AST_ObjectKeyVal({
key : "configurable",
value : new Cola.AST_True
}));
if(mods.indexOf("const") == -1) if(mods.indexOf("const") == -1)
dp.properties.push(new Cola.AST_ObjectKeyVal({ dp.properties.push(new Cola.AST_ObjectKeyVal({
key : "writable", key : "writable",
@ -427,8 +429,8 @@ Cola.DefPropWithMods = function(def, mods){
}; };
Cola.DefFunWithMods = function(func, mods){ Cola.DefFunWithMods = function(func, mods){
if(mods.length == 0 || !mods){ if(!mods || mods.length == 0){
if(func instanceof Cola.AST_Defun) if(func instanceof Cola.AST_Defun || func instanceof Cola.AST_Function)
return new Cola.AST_Assign({ return new Cola.AST_Assign({
start : func.start, start : func.start,
end : func.end, end : func.end,
@ -446,7 +448,9 @@ Cola.DefFunWithMods = function(func, mods){
else if(func instanceof Cola.AST_Getter) else if(func instanceof Cola.AST_Getter)
return new Cola.AST_Call({ return new Cola.AST_Call({
expression : new Cola.AST_Dot({ expression : new Cola.AST_Dot({
expression : func.name.expression, expression : func.name instanceof Cola.AST_Proto
? new Cola.AST_Dot({ expression: func.name.expression, property: "prototype" })
: func.name.expression,
property : "__defineGetter__" property : "__defineGetter__"
}), }),
args : [ args : [
@ -464,7 +468,9 @@ Cola.DefFunWithMods = function(func, mods){
else if(func instanceof Cola.AST_Setter) else if(func instanceof Cola.AST_Setter)
return new Cola.AST_Call({ return new Cola.AST_Call({
expression : new Cola.AST_Dot({ expression : new Cola.AST_Dot({
expression : node.name.expression, expression : func.name instanceof Cola.AST_Proto
? new Cola.AST_Dot({ expression: func.name.expression, property: "prototype" })
: func.name.expression,
property : "__defineSetter__" property : "__defineSetter__"
}), }),
args : [ args : [
@ -499,13 +505,15 @@ Cola.DefFunWithMods = function(func, mods){
}); });
return new Cola.AST_Function(node); return new Cola.AST_Function(node);
})(func) })(func)
}),
new Cola.AST_ObjectKeyVal({
key : "configurable",
value : new Cola.AST_True
}) })
] }; ] };
if(!(sname.expression instanceof Cola.AST_Symbol && sname.expression.name == "this" || sname instanceof Cola.AST_Proto))
dp.properties.push(new Cola.AST_ObjectKeyVal({
key : "configurable",
value : new Cola.AST_True
}));
if(!(func instanceof Cola.AST_Getter || func instanceof Cola.AST_Setter)) if(!(func instanceof Cola.AST_Getter || func instanceof Cola.AST_Setter))
dp.properties.push(new Cola.AST_ObjectKeyVal({ dp.properties.push(new Cola.AST_ObjectKeyVal({
key : "writable", key : "writable",
@ -520,7 +528,9 @@ Cola.DefFunWithMods = function(func, mods){
return new Cola.AST_Call({ return new Cola.AST_Call({
args : [ args : [
sname.expression, sname instanceof Cola.AST_Proto
? new Cola.AST_Dot({ expression: sname.expression, property: "prototype" })
: sname.expression,
sname instanceof Cola.AST_Sub sname instanceof Cola.AST_Sub
? sname.property ? sname.property
: new Cola.AST_String({ value: sname.property }), : new Cola.AST_String({ value: sname.property }),
@ -1113,7 +1123,7 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){
var defCache = []; newNode = []; var defCache = []; newNode = [];
node.definitions.forEach(function(def, i){ node.definitions.forEach(function(def, i){
if(def.name instanceof Cola.AST_SymbolVar){ if(def.name instanceof Cola.AST_SymbolVar){
if(!def.value) if(node.mods && node.mods.indexOf("const") != -1 && !def.value)
Cola.Parser.prototype.token_error.call(Cola.Parser.prototype, def.start, "`const` var can't have `undefined` value"); Cola.Parser.prototype.token_error.call(Cola.Parser.prototype, def.start, "`const` var can't have `undefined` value");
defCache.push(def); defCache.push(def);
@ -1132,7 +1142,7 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){
} }
var texpr = def.name; var texpr = def.name;
while(!(texpr.expression instanceof Cola.AST_SymbolVar)) texpr = texpr.expression; while(!(texpr.expression instanceof Cola.AST_Symbol || texpr.expression instanceof Cola.AST_Constant)) texpr = texpr.expression;
texpr.expression = new Cola.AST_SymbolRef(texpr.expression); texpr.expression = new Cola.AST_SymbolRef(texpr.expression);
newNode.push(Cola.DefPropWithMods(def, node.mods)); newNode.push(Cola.DefPropWithMods(def, node.mods));
@ -1166,16 +1176,17 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){
Math.rand = function rand(){} Math.rand = function rand(){}
*/ */
if((node instanceof Cola.AST_Defun || node instanceof Cola.AST_Setter || node instanceof Cola.AST_Getter) && !(node.name instanceof Cola.AST_SymbolDefun)){ if((node instanceof Cola.AST_Defun || node instanceof Cola.AST_Function || node instanceof Cola.AST_Setter || node instanceof Cola.AST_Getter)
var texpr = node.name; && node.name && !(node.name instanceof Cola.AST_SymbolDefun) && !(node.name instanceof Cola.AST_SymbolLambda)){
while(!(texpr.expression instanceof Cola.AST_SymbolDefun)) texpr = texpr.expression; var texpr = node.name, notst = node instanceof Cola.AST_Function;
while(!(texpr.expression instanceof Cola.AST_Symbol || texpr.expression instanceof Cola.AST_Constant)) texpr = texpr.expression;
texpr.expression = new Cola.AST_SymbolRef(texpr.expression); texpr.expression = new Cola.AST_SymbolRef(texpr.expression);
node = Cola.DefFunWithMods(node, node.mods); node = Cola.DefFunWithMods(node, node.mods);
if(node instanceof Cola.AST_Call && node.expression instanceof Cola.AST_SymbolRef && node.expression.name == "_ColaRuntime$$updateProperty") _ColaRuntime$$hash[Cola._ColaRuntime$$updateProperty.i] = true; if(node instanceof Cola.AST_Call && node.expression instanceof Cola.AST_SymbolRef && node.expression.name == "_ColaRuntime$$updateProperty") _ColaRuntime$$hash[Cola._ColaRuntime$$updateProperty.i] = true;
node = new Cola.AST_SimpleStatement({ if(!notst) node = new Cola.AST_SimpleStatement({
body : node body : node
}); });
} else } else
@ -1223,14 +1234,80 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){
} else } else
/* /*
class Test extends Test2 { class Test extends ParentTest {
int i = 123; const int i = 123;
Test(){ Test(){ // constructor
super();
} }
Test.Test2(){ // named constructor
super.Test2();
}
queryAll("ul li a").forEach((el) =>
el.onclick = () => console.log("click")
);
covert String method1() => console.log("method");
get getter() => i;
set setter(int val) => console.log(val);
superExample(){
super.superExample();
}
selfExample(){
query("*").onclick = () => console.log(self);
}
}
to
Test(){
this.pre_constructor();
this.super.constructor.call(this);
this.post_constructor();
}
Test.prototype = _ColaRuntime$$proto(ParentTest);
Test::Test2 = Test.Test2(){
this.pre_constructor();
this.super.Test2.call(this);
this.post_constructor();
};
Test.Test2.prototype = Test.prototype;
Test::pre_constructor(){
this.super = ParentTest.prototype;
const int this.i = 123;
}
Test::post_constructor(){
queryAll("ul li a").forEach((el) =>
el.onclick = () => console.log("click")
);
}
covert String Test::method1() => console.log("method");
get Test::getter() => i;
set Test::setter(int val) => console.log(val);
Test::superExample(){
this.super.superExample.call(this);
}
Test::selfExample(){
var self = this;
query("*").onclick = () => console.log(self);
} }
*/ */