Array sugar added.

This commit is contained in:
Onoshko Dan 2014-04-22 20:33:43 +07:00
parent b2bffc40cd
commit f88a7e12d9
12 changed files with 378 additions and 133 deletions

View File

@ -190,12 +190,17 @@ ColaScript is a language that compiles in JavaScript. This language is similar t
arr[] = 4; // [3, 5, 6, 7, 4]
console.log(arr[]); // 4
- part assigment
- part assigment, status: done
arr[0..2] = [0,1]; // [0, 1, 7, 4]
arr[0..2] = []; // [7, 4]
arr[0..2] = []; // [7, 4]
- slice, status: done
arr = arr[0..2];
- inline array ranging
- inline array ranging, status: done
arr = [10..1]; // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
arr = [1..10]; // [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
@ -320,5 +325,5 @@ ColaScript is a language that compiles in JavaScript. This language is similar t
### Statistic
- 30 feature ( without classes )
- 18 done
- 34 feature ( without classes )
- 22 done

View File

@ -45,7 +45,7 @@
***********************************************************************/
"use strict";
!window.Cola && (window.Cola = {});
!this.Cola && (this.Cola = {});
Cola.DEFNODE = function (type, props, methods, base) {
if (arguments.length < 4) base = Cola.AST_Node;
@ -742,6 +742,20 @@ Cola.AST_Array = Cola.DEFNODE("Array", "elements", {
}
});
Cola.AST_ArrayRange = Cola.DEFNODE("ArrayRange", "from to", {
$documentation: "An array range.",
$propdoc: {
from: "[AST_Node] range from",
to: "[AST_Node] range to"
},
_walk: function(visitor) {
return visitor._visit(this, function(){
this.from._walk(visitor);
this.to._walk(visitor);
});
}
});
Cola.AST_Object = Cola.DEFNODE("Object", "properties", {
$documentation: "An object literal",
$propdoc: {

View File

@ -42,7 +42,7 @@
***********************************************************************/
"use strict";
!window.Cola && (window.Cola = {});
!this.Cola && (this.Cola = {});
Cola.Compressor = function (options, false_by_default) {
if (!(this instanceof Cola.Compressor))
@ -76,9 +76,9 @@ Cola.Compressor = function (options, false_by_default) {
angular : false,
warnings : true,
global_defs : {},
global_defs : {}
is_js : false
,is_js : false
}, true);
};
@ -107,6 +107,27 @@ Cola.merge(Cola.Compressor.prototype, {
}
});
Cola.Compressor.MathFuncs = {
abs: true,
acos: true,
asin: true,
atan: true,
atan2: true,
ceil: true,
cos: true,
exp: true,
floor: true,
imul: true,
log: true,
max: true,
min: true,
pow: true,
round: true,
sin: true,
sqrt: true,
tan: true
};
(function(){
function OPT(node, optimizer) {
@ -1668,6 +1689,33 @@ Cola.merge(Cola.Compressor.prototype, {
});
OPT(Cola.AST_Call, function(self, compressor){
if (compressor.option("evaluate")) {
if (self.expression instanceof Cola.AST_Dot && Cola.Compressor.MathFuncs[self.expression.property] &&
self.expression.expression instanceof Cola.AST_SymbolRef && self.expression.expression.name == "Math") {
var args = [], allstatic = true, val;
self.args.some(function(arg){
if(arg instanceof Cola.AST_Constant) args.push(arg.value);
else return !(allstatic = false);
});
if (allstatic) {
val = Math[self.expression.property].apply({}, args);
if((""+val).length <= 15) return make_node(Cola.AST_Number, self, { value : val }).transform(compressor);
}
} else
if (!compressor.option("is_js") && self.expression instanceof Cola.AST_SymbolRef && Cola.Compressor.StdFuncs[self.expression.name] && self.args[0] instanceof Cola.AST_Constant) {
if (self.expression.name == "$_cola_isset" || self.expression.name == "$_cola_isntset")
return make_node(Cola.AST_Boolean, self, { value : Cola[self.expression.name](self.args[0].value) }).transform(compressor);
if ((self.expression.name == "$_cola_is" || self.expression.name == "$_cola_isnt") &&
self.args[1] instanceof Cola.AST_SymbolRef &&
(self.args[1].value == "Number" || self.args[1].value == "Boolean" || self.args[1].value == "String"))
return make_node(Cola.AST_Boolean, self, { value : Cola[self.expression.name](self.args[0].value, eval(self.args[1].value)) }).transform(compressor);
if (self.expression.name == "$_cola_modulo" && self.args[1] instanceof Cola.AST_Constant)
return make_node(Cola.AST_Number, self, { value : Cola.$_cola_modulo(self.args[0].value, self.args[1].value) }).transform(compressor);
}
}
if (compressor.option("unsafe")) {
var exp = self.expression;
if (exp instanceof Cola.AST_SymbolRef && exp.undeclared()) {
@ -1999,7 +2047,7 @@ Cola.merge(Cola.Compressor.prototype, {
// result. hence, force switch.
if (!(self.left instanceof Cola.AST_Binary
&& (compressor.option("is_js") ? Cola.PRECEDENCE : Cola.cPRECEDENCE)[self.left.operator] >= (compressor.option("is_js") ? Cola.PRECEDENCE : Cola.cPRECEDENCE)[self.operator])) {
&& Cola.PRECEDENCE[self.left.operator] >= Cola.PRECEDENCE[self.operator])) {
reverse(null, true);
}
}
@ -2348,7 +2396,7 @@ Cola.merge(Cola.Compressor.prototype, {
var prop = self.property;
if (prop instanceof Cola.AST_String && compressor.option("properties")) {
prop = prop.getValue();
if ((compressor.option("is_js") ? Cola.RESERVED_WORDS : Cola.cRESERVED_WORDS)(prop) ? compressor.option("screw_ie8") : Cola.is_identifier_string(prop)) {
if (Cola.RESERVED_WORDS(prop) ? compressor.option("screw_ie8") : Cola.is_identifier_string(prop)) {
return make_node(Cola.AST_Dot, self, {
expression : self.expression,
property : prop

View File

@ -118,6 +118,7 @@ main();</textarea>
<div class="bg">&nbsp;</div>
<div class="m">
<button id="exec" onclick="exec()">Execute</button>
<button id="benchmark" onclick="benchmark()">Benchmark</button>
<input type="checkbox" id="is_js" onclick="compile()">
<label for="is_js">js parser</label>
<span id="lenstat"></span>
@ -139,7 +140,7 @@ main();</textarea>
localStorage.source = source;
localStorage.isjs = isjs.checked ? "t" : "f";
stream = new Cola.OutputStream({ beautify : true, is_js : isjs.checked });
stream = new Cola.OutputStream({ beautify : true });
compressor = new Cola.Compressor({ is_js : isjs.checked });
try {
@ -156,9 +157,9 @@ main();</textarea>
// 3. mangle
ast.figure_out_scope();
ast.compute_char_frequency();
ast.mangle_names({ is_js : isjs.checked, sort : true, toplevel : true });
ast.mangle_names({ sort : true, toplevel : true });
stream = new Cola.OutputStream({ is_js : isjs.checked });
stream = new Cola.OutputStream();
ast.print(stream);
resultArea.value = stream.toString();
} catch(e){
@ -171,6 +172,16 @@ main();</textarea>
document.querySelector('#lenstat').innerHTML = sourceArea.value.length+" : "+translationArea.value.length+" : "+resultArea.value.length;
}
function benchmark(){
console.time("Uncompressed");
eval(translationArea.result);
console.timeEnd("Uncompressed");
console.time("Compressed");
eval(resultArea.result);
console.timeEnd("Compressed");
}
function exec(){
eval(resultArea.value)
}

View File

@ -42,7 +42,7 @@
***********************************************************************/
"use strict";
!window.Cola && (window.Cola = {});
!this.Cola && (this.Cola = {});
Cola.OutputStream = function (options) {
@ -63,8 +63,8 @@ Cola.OutputStream = function (options) {
comments : false,
preserve_line : false,
screw_ie8 : false,
preamble : null,
is_js : false
preamble : null
//,is_js : false
}, true);
this.indentation = 0;
@ -463,8 +463,8 @@ Cola.OutputStream.prototype.parent = function(n) {
return true;
// this deals with precedence: 3 * (2 + 1)
if (p instanceof Cola.AST_Binary) {
var po = p.operator, pp = (output.option("is_js") ? Cola.PRECEDENCE : Cola.cPRECEDENCE)[po];
var so = this.operator, sp = (output.option("is_js") ? Cola.PRECEDENCE : Cola.cPRECEDENCE)[so];
var po = p.operator, pp = Cola.PRECEDENCE[po];
var so = this.operator, sp = Cola.PRECEDENCE[so];
if (pp > sp
|| (pp == sp
&& this === p.right)) {
@ -1051,7 +1051,7 @@ Cola.OutputStream.prototype.parent = function(n) {
&& +key + "" == key)
&& parseFloat(key) >= 0) {
output.print(make_num(key));
} else if ((output.option("is_js") ? Cola.RESERVED_WORDS : Cola.cRESERVED_WORDS)(key) ? output.option("screw_ie8") : Cola.is_identifier_string(key)) {
} else if (Cola.RESERVED_WORDS(key) ? output.option("screw_ie8") : Cola.is_identifier_string(key)) {
output.print_name(key);
} else {
output.print_string(key);

View File

@ -46,7 +46,7 @@
***********************************************************************/
"use strict";
!window.Cola && (window.Cola = {});
!this.Cola && (this.Cola = {});
Cola.KEYWORDS = 'break case catch const continue debugger default delete do else finally for function if in instanceof new return switch throw try typeof var void while with';
Cola.cKEYWORDS = Cola.KEYWORDS.replace(' void', '') + ' clone isset is isnt class singleton injector';
@ -388,7 +388,7 @@ Cola.Tokenizer.prototype.parse_error = function (err) {
};
Cola.Tokenizer.prototype.read_num = function (prefix) {
var has_e = false, after_e = false, has_x = false, has_dot = prefix == ".";
var has_e = false, after_e = false, has_x = false, has_dot = prefix == ".", _this = this;
var num = this.read_while(function(ch, i){
var code = ch.charCodeAt(0);
switch (code) {
@ -401,6 +401,7 @@ Cola.Tokenizer.prototype.read_num = function (prefix) {
case 43: // +
return after_e;
case (after_e = false, 46): // .
if(!_this.is_js && _this.peek(1) == '.') return false;
return (!has_dot && !has_x && !has_e) ? (has_dot = true) : false;
}
return Cola.is_alphanumeric_char(code);
@ -642,6 +643,7 @@ Cola.Tokenizer.prototype.handle_slash = function () {
Cola.Tokenizer.prototype.handle_dot = function () {
this.next();
if (!this.is_js && this.peek() == '.') return this.next(), this.token("punc", "..");
return Cola.is_digit(this.peek().charCodeAt(0))
? this.read_num(".")
: this.token("punc", ".");
@ -709,7 +711,6 @@ Cola.Tokenizer.prototype.next_token = function (force_regexp) {
if (!this.is_js) {
if (ch == 'r' && (this.peek(1) == '"' || this.peek(1) == "'" || this.peek(1) == '`')) return this.next(), this.read_string(true);
if (ch + this.peek(1) == '=>') return this.next(), this.next(), this.token("punc", "=>");
if (ch + this.peek(1) == '..') return this.next(), this.next(), this.token("punc", "..");
if (ch == '@') return this.read_at();
}
@ -1575,6 +1576,22 @@ Cola.Parser.prototype.expr_list = function (closing, allow_trailing_comma, allow
Cola.Parser.prototype.array_ = Cola.Parser.embed_tokens(function() {
this.expect("[");
if(!this.is_js && !this.is("punc","]")){
this.dumpS();
var tmp, from = this.expression(true);
if(this.is("punc","..")){
this.next();
return new Cola.AST_ArrayRange({
from : from,
to : (tmp = this.expression(true), this.expect("]"), tmp),
start : from.start,
end : this.prev()
});
}
this.restoreS();
}
return new Cola.AST_Array({
elements: this.expr_list("]", !this.options.strict, true)
});
@ -1685,7 +1702,24 @@ Cola.Parser.prototype.subscripts = function(expr, allow_calls) {
}
if (this.is("punc", "[")) {
this.next();
var prop = !this.is_js && this.is("punc", "]") ? new Cola.AST_Noop() : this.expression(true);
var prop;
if(this.is_js) prop = this.expression(true);
else if(this.is("punc","]")) prop = new Cola.AST_Noop();
else {
prop = this.expression(true);
this.dumpS();
if(this.is("punc","..")){
this.next();
prop = new Cola.AST_ArrayRange({
from : prop,
to : this.expression(true),
start : prop.start,
end : this.prev()
});
} else this.restoreS();
}
this.expect("]");
return this.subscripts(new Cola.AST_Sub({
start : start,

View File

@ -42,7 +42,7 @@
***********************************************************************/
"use strict";
!window.Cola && (window.Cola = {});
!this.Cola && (this.Cola = {});
Cola.SymbolDef = function (scope, index, orig) {
this.name = orig.name;
@ -246,7 +246,7 @@ Cola.AST_Scope.DEFMETHOD("next_mangled", function(options){
var ext = this.enclosed;
out: while (true) {
var m = Cola.base54(++this.cname);
if (!Cola.is_identifier(m, options.is_js)) continue; // skip over "do"
if (!Cola.is_identifier(m, true)) continue; // skip over "do"
// https://github.com/mishoo/UglifyJS2/issues/242 -- do not
// shadow a name excepted from mangling.
@ -327,8 +327,8 @@ Cola.AST_Toplevel.DEFMETHOD("_default_mangler_options", function(options){
eval : false,
sort : false,
toplevel : false,
screw_ie8 : false,
is_js : false
screw_ie8 : false
//,is_js : false
});
});
@ -363,7 +363,7 @@ Cola.AST_Toplevel.DEFMETHOD("mangle_names", function(options){
}
if (node instanceof Cola.AST_Label) {
var name;
do name = Cola.base54(++lname); while (!Cola.is_identifier(name, options.is_js));
do name = Cola.base54(++lname); while (!Cola.is_identifier(name, true));
node.mangled_name = name;
return true;
}

View File

@ -42,7 +42,7 @@
***********************************************************************/
"use strict";
!window.Cola && (window.Cola = {});
!this.Cola && (this.Cola = {});
// a small wrapper around fitzgen's source-map library
Cola.SourceMap = function (options) {

View File

@ -34,32 +34,32 @@
***********************************************************************/
function $_cola_is(_object, _type){
return _object instanceof _type || _object.__proto__ === _type.prototype;
Cola.$_cola_is = function $_cola_is(_object, _type){
return _object === _type || _type.prototype && (_object instanceof _type || _object.__proto__ === _type.prototype) || isNaN(_object) && isNaN(_type);
}
$_cola_is.i = 0;
Cola.$_cola_is.i = 0;
function $_cola_isnt(_object, _type){
return !(_object instanceof _type || _object.__proto__ === _type.prototype);
Cola.$_cola_isnt = function $_cola_isnt(_object, _type){
return !(_object === _type || _type.prototype && (_object instanceof _type || _object.__proto__ === _type.prototype) || isNaN(_object) && isNaN(_type));
}
$_cola_isnt.i = 1;
Cola.$_cola_isnt.i = 1;
function $_cola_modulo(_a, _b){
Cola.$_cola_modulo = function $_cola_modulo(_a, _b){
return (_a % _b + +_b) % _b;
}
$_cola_modulo.i = 2;
Cola.$_cola_modulo.i = 2;
function $_cola_isset(_object){
Cola.$_cola_isset = function $_cola_isset(_object){
return !(typeof _object === "undefined" || _object === null);
}
$_cola_isset.i = 3;
Cola.$_cola_isset.i = 3;
function $_cola_isntset(_object){
Cola.$_cola_isntset = function $_cola_isntset(_object){
return (typeof _object === "undefined" || _object === null);
}
$_cola_isntset.i = 4;
Cola.$_cola_isntset.i = 4;
function $_cola_clone(_item){
Cola.$_cola_clone = function $_cola_clone(_item){
if (_item === undefined || _item === null) return _item;
if (_item.__clone__ instanceof Function) return _item.__clone__();
@ -94,11 +94,33 @@ function $_cola_clone(_item){
return _item;
}
$_cola_clone.i = 5;
Cola.$_cola_clone.i = 5;
function $_cola_array_last(_array){
Cola.$_cola_array_last = function $_cola_array_last(_array){
return _array[_array.length - 1];
}
$_cola_array_last.i = 6;
Cola.$_cola_array_last.i = 6;
$_cola = $_cola_is + $_cola_isnt + $_cola_modulo + $_cola_isset + $_cola_isntset + $_cola_clone + $_cola_array_last;
Cola.$_cola_array_range = function $_cola_array_range(_from, _to){
var range = [];
if(_from <= _to) for(var i = _from; i <= _to; i++) range.push(i);
else for(var i = _from; i >= _to; i--) range.push(i);
return range;
}
Cola.$_cola_array_range.i = 7;
Cola.$_cola_array_asplice = function $_cola_array_asplice(_array, _from, _to, _a){
_to = _to - _from + 1;
return [].splice.apply(_array, [_from, _to + 1].concat(_a)), _a;
}
Cola.$_cola_array_asplice.i = 8;
Cola.$_cola = Cola.$_cola_is + Cola.$_cola_isnt + Cola.$_cola_modulo + Cola.$_cola_isset + Cola.$_cola_isntset + Cola.$_cola_clone + Cola.$_cola_array_last + Cola.$_cola_array_range + Cola.$_cola_array_asplice;
Cola.Compressor.StdFuncs = {
$_cola_is : true,
$_cola_isnt : true,
$_cola_modulo : true,
$_cola_isset : true,
$_cola_isntset : true
};

View File

@ -42,7 +42,7 @@
***********************************************************************/
"use strict";
!window.Cola && (window.Cola = {});
!this.Cola && (this.Cola = {});
// Tree transformer helpers.
@ -56,6 +56,7 @@ Cola.TreeTransformer.prototype = new Cola.TreeWalker;
(function(undefined){
function _(node, descend) {
node.DEFMETHOD("_descend", descend);
node.DEFMETHOD("transform", function(tw, in_list){
var x, y;
tw.push(this);

View File

@ -35,89 +35,124 @@
***********************************************************************/
"use strict";
!window.Cola && (window.Cola = {});
!this.Cola && (this.Cola = {});
Cola.AST_Toplevel.prototype.toJavaScript = function(){
if(this.language == 'js') return this;
this.language = 'js';
var $_cola_ast = Cola.parse($_cola, { is_js : true}), $_cola_hash = {}, _this,
tt = new Cola.TreeTransformer(null, function(node){
var newNode, props, parent = this.parent();
var $_cola_ast = Cola.parse(Cola.$_cola, { is_js : true}), $_cola_hash = {}, _this,
tt = new Cola.TreeTransformer(function(node, descend){
var newNode, props = {}, parent = this.parent();
node = node.clone();
if(node instanceof Cola.AST_Binary && node.operator == '**'){
props = {
args : [node.left, node.right],
start : new Cola.AST_Token({ nlb : false, type : 'name', value : 'Math' }),
end : new Cola.AST_Token({ nlb : false, type : 'punc', value : ')' })
start : node.start, //new Cola.AST_Token({ nlb : false, type : 'name', value : 'Math' }),
end : node.left //new Cola.AST_Token({ nlb : false, type : 'punc', value : ')' })
};
props.expression = new Cola.AST_Dot({
property : 'pow',
start : props.start,
end : new Cola.AST_Token({ nlb : false, type : 'name', value : 'pow' }),
//start : props.start,
//end : new Cola.AST_Token({ nlb : false, type : 'name', value : 'pow' }),
expression : new Cola.AST_SymbolRef({ name : 'Math', start : props.start, end : props.start })
});
node = new Cola.AST_Call(props);
} else
if(node instanceof Cola.AST_Binary && node.operator == '%%'){
$_cola_hash[$_cola_modulo.i] = true;
$_cola_hash[Cola.$_cola_modulo.i] = true;
props = {
args : [node.left, node.right],
start : new Cola.AST_Token({ nlb : false, type : 'name', value : '$_cola_modulo' }),
end : new Cola.AST_Token({ nlb : false, type : 'punc', value : ')' })
start : node.start, //new Cola.AST_Token({ nlb : false, type : 'name', value : '$_cola_modulo' }),
end : node.end //new Cola.AST_Token({ nlb : false, type : 'punc', value : ')' })
};
props.expression = new Cola.AST_SymbolRef({
name : '$_cola_modulo',
start : props.start,
end : props.start
name : '$_cola_modulo'
//start : props.start,
//end : props.start
});
node = new Cola.AST_Call(props);
} else
if(node instanceof Cola.AST_SimpleStatement && node.body instanceof Cola.AST_Assign && node.body.operator == '?='){
$_cola_hash[$_cola_isntset.i] = true;
if(node.body.left instanceof Cola.AST_Sub && node.body.left.property instanceof Cola.AST_Noop){
props = {
property : "length",
//start : node.left.start,
//end : new Cola.AST_Token({ nlb : false, type : 'name', value : 'push' }),
expression : node.body.left.expression
};
props = {
operator : "-",
left : new Cola.AST_Dot(props),
right : new Cola.AST_Number({ value : 1})
};
node.body.left.property = new Cola.AST_Binary(props);
}
$_cola_hash[Cola.$_cola_isntset.i] = true;
node.body.operator = '=';
props = {
args : [node.body.left],
start : new Cola.AST_Token({ nlb : false, type : 'name', value : '$_cola_isntset' }),
end : new Cola.AST_Token({ nlb : false, type : 'punc', value : ')' })
args : [node.body.left]
//start : node.start, //new Cola.AST_Token({ nlb : false, type : 'name', value : '$_cola_isntset' }),
//end : node.end //new Cola.AST_Token({ nlb : false, type : 'punc', value : ')' })
};
props.expression = new Cola.AST_SymbolRef({
name : '$_cola_isntset',
start : props.start,
end : props.start
name : '$_cola_isntset'
//start : props.start,
//end : props.start
});
node = new Cola.AST_If({
body : node.clone(),
start : new Cola.AST_Token({ nlb : false, type : 'keyword', value : 'if' }),
end : new Cola.AST_Token({ nlb : false, type : 'punc', value : ';' }),
start : node.start, //new Cola.AST_Token({ nlb : false, type : 'keyword', value : 'if' }),
end : node.end, //new Cola.AST_Token({ nlb : false, type : 'punc', value : ';' }),
condition : new Cola.AST_Call(props)
});
} else
if(node instanceof Cola.AST_Assign && node.operator == '?='){
$_cola_hash[$_cola_isntset.i] = true;
if(node instanceof Cola.AST_Assign && node.operator == '?='/* && !(parent instanceof Cola.AST_SimpleStatement)*/){
if(node.left instanceof Cola.AST_Sub && node.left.property instanceof Cola.AST_Noop){
props = {
property : "length",
//start : node.left.start,
//end : new Cola.AST_Token({ nlb : false, type : 'name', value : 'push' }),
expression : node.left.expression
};
props = {
operator : "-",
left : new Cola.AST_Dot(props),
right : new Cola.AST_Number({ value : 1})
};
node.left.property = new Cola.AST_Binary(props);
}
$_cola_hash[Cola.$_cola_isntset.i] = true;
node.operator = '=';
props = {
args : [node.left],
start : new Cola.AST_Token({ nlb : false, type : 'name', value : '$_cola_isntset' }),
end : new Cola.AST_Token({ nlb : false, type : 'punc', value : ')' })
args : [node.left]
//start : new Cola.AST_Token({ nlb : false, type : 'name', value : '$_cola_isntset' }),
//end : new Cola.AST_Token({ nlb : false, type : 'punc', value : ')' })
};
props.expression = new Cola.AST_SymbolRef({
name : '$_cola_isntset',
start : props.start,
end : props.start
name : '$_cola_isntset'
//start : props.start,
//end : props.start
});
node = new Cola.AST_Conditional({
start : new Cola.AST_Token({ nlb : false, type : 'punc', value : '(' }),
end : new Cola.AST_Token({ nlb : false, type : 'punc', value : ')' }),
start : node.start, //new Cola.AST_Token({ nlb : false, type : 'punc', value : '(' }),
end : node.end, //new Cola.AST_Token({ nlb : false, type : 'punc', value : ')' }),
condition : new Cola.AST_Call(props),
consequent : node.clone(),
alternative : node.left
@ -125,17 +160,17 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(){
} else
if(node instanceof Cola.AST_Conditional && node.alternative instanceof Cola.AST_Noop){
$_cola_hash[$_cola_isset.i] = true;
$_cola_hash[Cola.$_cola_isset.i] = true;
props = {
args : [node.condition],
start : new Cola.AST_Token({ nlb : false, type : 'name', value : '$_cola_isset' }),
end : new Cola.AST_Token({ nlb : false, type : 'punc', value : ')' })
start : node.start, //new Cola.AST_Token({ nlb : false, type : 'name', value : '$_cola_isset' }),
end : node.end //new Cola.AST_Token({ nlb : false, type : 'punc', value : ')' })
};
props.expression = new Cola.AST_SymbolRef({
name : '$_cola_isset',
start : props.start,
end : props.start
name : '$_cola_isset'
//start : props.start,
//end : props.start
});
node.alternative = node.consequent;
@ -144,99 +179,166 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(){
} else
if(node instanceof Cola.AST_Binary && node.operator == 'is'){
$_cola_hash[$_cola_is.i] = true;
$_cola_hash[Cola.$_cola_is.i] = true;
props = {
args : [node.left, node.right],
start : new Cola.AST_Token({ nlb : false, type : 'name', value : '$_cola_is' }),
end : new Cola.AST_Token({ nlb : false, type : 'punc', value : ')' })
start : node.start, //new Cola.AST_Token({ nlb : false, type : 'name', value : '$_cola_is' }),
end : node.end //new Cola.AST_Token({ nlb : false, type : 'punc', value : ')' })
};
props.expression = new Cola.AST_SymbolRef({
name : '$_cola_is',
start : props.start,
end : props.start
name : '$_cola_is'
//start : props.start,
//end : props.start
});
node = new Cola.AST_Call(props);
} else
if(node instanceof Cola.AST_Binary && node.operator == 'isnt'){
$_cola_hash[$_cola_isnt.i] = true;
$_cola_hash[Cola.$_cola_isnt.i] = true;
props = {
args : [node.left, node.right],
start : new Cola.AST_Token({ nlb : false, type : 'name', value : '$_cola_isnt' }),
end : new Cola.AST_Token({ nlb : false, type : 'punc', value : ')' })
start : node.start, //new Cola.AST_Token({ nlb : false, type : 'name', value : '$_cola_isnt' }),
end : node.end //new Cola.AST_Token({ nlb : false, type : 'punc', value : ')' })
};
props.expression = new Cola.AST_SymbolRef({
name : '$_cola_isnt',
start : props.start,
end : props.start
name : '$_cola_isnt'
//start : props.start,
//end : props.start
});
node = new Cola.AST_Call(props);
} else
if(node instanceof Cola.AST_UnaryPostfix && node.operator == '??' || node instanceof Cola.AST_UnaryPrefix && node.operator == 'isset'){
$_cola_hash[$_cola_isset.i] = true;
$_cola_hash[Cola.$_cola_isset.i] = true;
props = {
args : [node.expression],
start : new Cola.AST_Token({ nlb : false, type : 'name', value : '$_cola_isset' }),
end : new Cola.AST_Token({ nlb : false, type : 'punc', value : ')' })
start : node.start, //new Cola.AST_Token({ nlb : false, type : 'name', value : '$_cola_isset' }),
end : node.end //new Cola.AST_Token({ nlb : false, type : 'punc', value : ')' })
};
props.expression = new Cola.AST_SymbolRef({
name : '$_cola_isset',
start : props.start,
end : props.start
name : '$_cola_isset'
//start : props.start,
//end : props.start
});
node = new Cola.AST_Call(props);
} else
if(node instanceof Cola.AST_UnaryPrefix && node.operator == 'clone'){
$_cola_hash[$_cola_clone.i] = true;
$_cola_hash[Cola.$_cola_clone.i] = true;
props = {
args : [node.expression],
start : new Cola.AST_Token({ nlb : false, type : 'name', value : '$_cola_clone' }),
end : new Cola.AST_Token({ nlb : false, type : 'punc', value : ')' })
start : node.start, //new Cola.AST_Token({ nlb : false, type : 'name', value : '$_cola_clone' }),
end : node.end //new Cola.AST_Token({ nlb : false, type : 'punc', value : ')' })
};
props.expression = new Cola.AST_SymbolRef({
name : '$_cola_clone',
start : props.start,
end : props.start
name : '$_cola_clone'
//start : props.start,
//end : props.start
});
node = new Cola.AST_Call(props);
} else
if(node instanceof Cola.AST_Assign && node.operator == "=" &&
node.left instanceof Cola.AST_Sub && node.left.property instanceof Cola.AST_Noop){
if(node instanceof Cola.AST_Assign && node.operator == "=" && node.left instanceof Cola.AST_Sub && node.left.property instanceof Cola.AST_Noop){
props = {
property : "push",
start : node.left.start,
end : new Cola.AST_Token({ nlb : false, type : 'name', value : 'push' }),
//start : node.left.start,
//end : new Cola.AST_Token({ nlb : false, type : 'name', value : 'push' }),
expression : node.left.expression
};
props = {
args : [node.right],
start : props.start,
end : new Cola.AST_Token({ nlb : false, type : 'punc', value : ')' }),
start : node.start, //props.start,
end : node.end, //new Cola.AST_Token({ nlb : false, type : 'punc', value : ')' }),
expression : new Cola.AST_Dot(props)
};
node = new Cola.AST_Call(props);
} else
if(node instanceof Cola.AST_Sub && node.property instanceof Cola.AST_Noop && !(parent instanceof Cola.AST_Assign) && parent.operator != "=" && node != parent.left){
$_cola_hash[$_cola_array_last.i] = true;
if(node instanceof Cola.AST_Assign && node.operator != "=" && node.left instanceof Cola.AST_Sub && node.left.property instanceof Cola.AST_Noop){
props = {
property : "length",
//start : node.left.start,
//end : new Cola.AST_Token({ nlb : false, type : 'name', value : 'push' }),
expression : node.left.expression
};
props = {
operator : "-",
left : new Cola.AST_Dot(props),
right : new Cola.AST_Number({ value : 1})
};
node.left.property = new Cola.AST_Binary(props);
} else
if(node instanceof Cola.AST_Sub && node.property instanceof Cola.AST_Noop){
$_cola_hash[Cola.$_cola_array_last.i] = true;
props = {
args : [node.expression],
start : new Cola.AST_Token({ nlb : false, type : 'name', value : '$_cola_array_last' }),
end : new Cola.AST_Token({ nlb : false, type : 'punc', value : ')' })
start : node.start, //new Cola.AST_Token({ nlb : false, type : 'name', value : '$_cola_array_last' }),
end : node.end //new Cola.AST_Token({ nlb : false, type : 'punc', value : ')' })
};
props.expression = new Cola.AST_SymbolRef({
name : '$_cola_array_last',
start : props.start,
end : props.start
name : '$_cola_array_last'
//start : props.start,
//end : props.start
});
node = new Cola.AST_Call(props);
} else
if(node instanceof Cola.AST_Assign && node.operator == '=' && node.left instanceof Cola.AST_Sub && node.left.property instanceof Cola.AST_ArrayRange){
$_cola_hash[Cola.$_cola_array_asplice.i] = true;
props = {
args : [node.left.expression, node.left.property.from, node.left.property.to, node.right],
start : node.start, //new Cola.AST_Token({ nlb : false, type : 'name', value : '$_cola_array_last' }),
end : node.end //new Cola.AST_Token({ nlb : false, type : 'punc', value : ')' })
};
props.expression = new Cola.AST_SymbolRef({
name : '$_cola_array_asplice'
//start : props.start,
//end : props.start
});
node = new Cola.AST_Call(props);
} else
if(node instanceof Cola.AST_Sub && node.property instanceof Cola.AST_ArrayRange){
props = {
property : "slice",
//start : node.left.start,
//end : new Cola.AST_Token({ nlb : false, type : 'name', value : 'push' }),
expression : node.expression
};
props = {
args : [node.property.from, new Cola.AST_Binary({
operator : "+",
left : node.property.to,
right : new Cola.AST_Number({ value : 1})
})],
start : node.start, //props.start,
end : node.end, //new Cola.AST_Token({ nlb : false, type : 'punc', value : ')' }),
expression : new Cola.AST_Dot(props)
};
node = new Cola.AST_Call(props);
} else
if(node instanceof Cola.AST_ArrayRange){
$_cola_hash[Cola.$_cola_array_range.i] = true;
props = {
args : [node.from, node.to],
start : node.start, //new Cola.AST_Token({ nlb : false, type : 'name', value : '$_cola_clone' }),
end : node.end //new Cola.AST_Token({ nlb : false, type : 'punc', value : ')' })
};
props.expression = new Cola.AST_SymbolRef({
name : '$_cola_array_range'
//start : props.start,
//end : props.start
});
node = new Cola.AST_Call(props);
@ -246,19 +348,22 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(){
newNode = new Cola.AST_Binary({
operator : '+',
left : node.body[0],
right : node.body[1],
start : node.body[0].start,
end : node.body[1].end
right : node.body[1]
//start : node.body[0].start,
//end : node.body[1].end
});
for(var i = 2; i < node.body.length; i++)
newNode = new Cola.AST_Binary({
operator : '+',
left : newNode,
right : node.body[i],
start : newNode.start,
end : node.body[i].end
right : node.body[i]
//start : newNode.start,
//end : node.body[i].end
});
newNode.start = node.start;
newNode.end = node.end;
node = newNode;
} else
@ -266,6 +371,7 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(){
node.value = node.value.replace(/[\r\n\s]/g,'').replace(/(\/[\w]*)x([\w]*$)/, '$1$2');
}
node._descend(node, this);
return node;
});

View File

@ -42,7 +42,7 @@
***********************************************************************/
"use strict";
!window.Cola && (window.Cola = {});
!this.Cola && (this.Cola = {});
Cola.array_to_hash = function (a) {
var ret = Object.create(null);
@ -336,4 +336,8 @@ Cola.clone = function (item) {
}
return item;
};
Cola.nodeCompare = function(_a, _b){
return _a.__proto__ === _b.__proto__ && _a.start.pos === _b.start.pos && _a.end.pos === _b.end.pos;
};