use transform insted treewalker

This commit is contained in:
Onoshko Dan 2014-04-15 21:48:09 +07:00
parent a2f7a07c11
commit 363019dc5a

View File

@ -37,9 +37,8 @@
"use strict"; "use strict";
function translate(tree){ function translate(tree){
var queue = [];
tree.walk(new TreeWalker(function(node){ var tt = new TreeTransformer(null, function(node){
var newNode, props; var newNode, props;
if(node instanceof AST_Binary && node.operator == '**'){ if(node instanceof AST_Binary && node.operator == '**'){
@ -55,10 +54,7 @@ function translate(tree){
expression : new AST_SymbolRef({ name : 'Math', start : props.start, end : props.start }) expression : new AST_SymbolRef({ name : 'Math', start : props.start, end : props.start })
}); });
newNode = new AST_Call(props); node = new AST_Call(props);
queue.push(function(){
ReplaceObject(node, newNode);
});
} else } else
if(node instanceof AST_Binary && node.operator == '%%'){ if(node instanceof AST_Binary && node.operator == '%%'){
@ -73,20 +69,14 @@ function translate(tree){
end : props.start end : props.start
}); });
newNode = new AST_Call(props); node = new AST_Call(props);
queue.push(function(){
ReplaceObject(node, newNode);
});
} else } else
if(node instanceof AST_Assign && node.operator == '?='){ if(node instanceof AST_SimpleStatement && node.body instanceof AST_Assign && node.body.operator == '?='){
var parent = this.parent(); node.body.operator = '=';
if(parent instanceof AST_SimpleStatement){
node.operator = '=';
props = { props = {
args : [node.left], args : [node.body.left],
start : new AST_Token({ nlb : false, type : 'name', value : '$_cola_isntset' }), start : new AST_Token({ nlb : false, type : 'name', value : '$_cola_isntset' }),
end : new AST_Token({ nlb : false, type : 'punc', value : ')' }) end : new AST_Token({ nlb : false, type : 'punc', value : ')' })
}; };
@ -96,16 +86,15 @@ function translate(tree){
end : props.start end : props.start
}); });
newNode = new AST_If({ node = new AST_If({
body : CopyObject(parent), body : node.clone(),
start : new AST_Token({ nlb : false, type : 'keyword', value : 'if' }), start : new AST_Token({ nlb : false, type : 'keyword', value : 'if' }),
end : new AST_Token({ nlb : false, type : 'punc', value : ';' }), end : new AST_Token({ nlb : false, type : 'punc', value : ';' }),
condition : new AST_Call(props) condition : new AST_Call(props)
}); });
queue.push(function(){ } else
ReplaceObject(parent, newNode);
}); if(node instanceof AST_Assign && node.operator == '?='){
} else {
node.operator = '='; node.operator = '=';
props = { props = {
@ -119,18 +108,13 @@ function translate(tree){
end : props.start end : props.start
}); });
newNode = new AST_Conditional({ node = new AST_Conditional({
start : new AST_Token({ nlb : false, type : 'punc', value : '(' }), start : new AST_Token({ nlb : false, type : 'punc', value : '(' }),
end : new AST_Token({ nlb : false, type : 'punc', value : ')' }), end : new AST_Token({ nlb : false, type : 'punc', value : ')' }),
condition : new AST_Call(props), condition : new AST_Call(props),
consequent : CopyObject(node), consequent : node.clone(),
alternative : node.left alternative : node.left
}); });
queue.push(function(){
ReplaceObject(node, newNode);
});
}
} else } else
if(node instanceof AST_Binary && node.operator == 'is'){ if(node instanceof AST_Binary && node.operator == 'is'){
@ -145,10 +129,7 @@ function translate(tree){
end : props.start end : props.start
}); });
newNode = new AST_Call(props); node = new AST_Call(props);
queue.push(function(){
ReplaceObject(node, newNode);
});
} else } else
if(node instanceof AST_Binary && node.operator == 'isnt'){ if(node instanceof AST_Binary && node.operator == 'isnt'){
@ -163,10 +144,7 @@ function translate(tree){
end : props.start end : props.start
}); });
newNode = new AST_Call(props); node = new AST_Call(props);
queue.push(function(){
ReplaceObject(node, newNode);
});
} else } else
if(node instanceof AST_StringTemplate){ if(node instanceof AST_StringTemplate){
@ -186,20 +164,15 @@ function translate(tree){
end : node.body[i].end end : node.body[i].end
}); });
queue.push(function(){ node = newNode;
ReplaceObject(node, newNode);
});
} else } else
if(node instanceof AST_RegExp && (node.value.indexOf('\n') != -1 || /\/[\w]*x[\w]*$/.test(node.value))){ if(node instanceof AST_RegExp && (node.value.indexOf('\n') != -1 || /\/[\w]*x[\w]*$/.test(node.value))){
node.value = node.value.replace(/[\r\n\s]/g,'').replace(/(\/[\w]*)x([\w]*$)/, '$1$2'); node.value = node.value.replace(/[\r\n\s]/g,'').replace(/(\/[\w]*)x([\w]*$)/, '$1$2');
} }
})); return node;
queue.forEach(function(f){
f();
}); });
return tree; return tree.transform(tt);
} }