Some fixes. Class translation spec is done.
This commit is contained in:
parent
0585a8eb8f
commit
73fbeb2377
31
lib/parse.js
31
lib/parse.js
|
|
@ -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);
|
||||||
|
|
|
||||||
10
lib/std.js
10
lib/std.js
|
|
@ -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 = {
|
||||||
|
|
|
||||||
125
lib/translate.js
125
lib/translate.js
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user