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,64 +69,52 @@ function translate(tree){
end : props.start end : props.start
}); });
newNode = new AST_Call(props); node = new AST_Call(props);
queue.push(function(){ } else
ReplaceObject(node, newNode);
if(node instanceof AST_SimpleStatement && node.body instanceof AST_Assign && node.body.operator == '?='){
node.body.operator = '=';
props = {
args : [node.body.left],
start : new AST_Token({ nlb : false, type : 'name', value : '$_cola_isntset' }),
end : new AST_Token({ nlb : false, type : 'punc', value : ')' })
};
props.expression = new AST_SymbolRef({
name : '$_cola_isntset',
start : props.start,
end : props.start
});
node = new AST_If({
body : node.clone(),
start : new AST_Token({ nlb : false, type : 'keyword', value : 'if' }),
end : new AST_Token({ nlb : false, type : 'punc', value : ';' }),
condition : new AST_Call(props)
}); });
} else } else
if(node instanceof AST_Assign && node.operator == '?='){ if(node instanceof AST_Assign && node.operator == '?='){
var parent = this.parent(); node.operator = '=';
if(parent instanceof AST_SimpleStatement){ props = {
node.operator = '='; args : [node.left],
start : new AST_Token({ nlb : false, type : 'name', value : '$_cola_isntset' }),
props = { end : new AST_Token({ nlb : false, type : 'punc', value : ')' })
args : [node.left], };
start : new AST_Token({ nlb : false, type : 'name', value : '$_cola_isntset' }), props.expression = new AST_SymbolRef({
end : new AST_Token({ nlb : false, type : 'punc', value : ')' }) name : '$_cola_isntset',
}; start : props.start,
props.expression = new AST_SymbolRef({ end : props.start
name : '$_cola_isntset',
start : props.start,
end : props.start
}); });
newNode = new AST_If({ node = new AST_Conditional({
body : CopyObject(parent), start : new AST_Token({ nlb : false, type : 'punc', value : '(' }),
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) consequent : node.clone(),
}); alternative : node.left
queue.push(function(){ });
ReplaceObject(parent, newNode);
});
} else {
node.operator = '=';
props = {
args : [node.left],
start : new AST_Token({ nlb : false, type : 'name', value : '$_cola_isntset' }),
end : new AST_Token({ nlb : false, type : 'punc', value : ')' })
};
props.expression = new AST_SymbolRef({
name : '$_cola_isntset',
start : props.start,
end : props.start
});
newNode = new AST_Conditional({
start : new AST_Token({ nlb : false, type : 'punc', value : '(' }),
end : new AST_Token({ nlb : false, type : 'punc', value : ')' }),
condition : new AST_Call(props),
consequent : CopyObject(node),
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);
} }