diff options
Diffstat (limited to 'lib/transform.js')
-rw-r--r-- | lib/transform.js | 132 |
1 files changed, 49 insertions, 83 deletions
diff --git a/lib/transform.js b/lib/transform.js index 41b24c54..5897aa77 100644 --- a/lib/transform.js +++ b/lib/transform.js @@ -43,8 +43,6 @@ "use strict"; -// Tree transformer helpers. - function TreeTransformer(before, after) { TreeWalker.call(this); this.before = before; @@ -52,168 +50,136 @@ function TreeTransformer(before, after) { } TreeTransformer.prototype = new TreeWalker; -(function(undefined){ - - function _(node, descend) { - node.DEFMETHOD("transform", function(tw, in_list){ - var x, y; - tw.push(this); - if (tw.before) x = tw.before(this, descend, in_list); - if (x === undefined) { - x = this; - descend(x, tw); - if (tw.after) { - y = tw.after(x, in_list); - if (y !== undefined) x = y; - } - } - tw.pop(); - return x; - }); - }; - +(function(DEF) { function do_list(list, tw) { - return MAP(list, function(node){ + return MAP(list, function(node) { return node.transform(tw, true); }); - }; + } - _(AST_Node, noop); - - _(AST_LabeledStatement, function(self, tw){ + DEF(AST_Node, noop); + DEF(AST_LabeledStatement, function(self, tw) { self.label = self.label.transform(tw); self.body = self.body.transform(tw); }); - - _(AST_SimpleStatement, function(self, tw){ + DEF(AST_SimpleStatement, function(self, tw) { self.body = self.body.transform(tw); }); - - _(AST_Block, function(self, tw){ + DEF(AST_Block, function(self, tw) { self.body = do_list(self.body, tw); }); - - _(AST_Do, function(self, tw){ + DEF(AST_Do, function(self, tw) { self.body = self.body.transform(tw); self.condition = self.condition.transform(tw); }); - - _(AST_While, function(self, tw){ + DEF(AST_While, function(self, tw) { self.condition = self.condition.transform(tw); self.body = self.body.transform(tw); }); - - _(AST_For, function(self, tw){ + DEF(AST_For, function(self, tw) { if (self.init) self.init = self.init.transform(tw); if (self.condition) self.condition = self.condition.transform(tw); if (self.step) self.step = self.step.transform(tw); self.body = self.body.transform(tw); }); - - _(AST_ForIn, function(self, tw){ + DEF(AST_ForIn, function(self, tw) { self.init = self.init.transform(tw); self.object = self.object.transform(tw); self.body = self.body.transform(tw); }); - - _(AST_With, function(self, tw){ + DEF(AST_With, function(self, tw) { self.expression = self.expression.transform(tw); self.body = self.body.transform(tw); }); - - _(AST_Exit, function(self, tw){ + DEF(AST_Exit, function(self, tw) { if (self.value) self.value = self.value.transform(tw); }); - - _(AST_LoopControl, function(self, tw){ + DEF(AST_LoopControl, function(self, tw) { if (self.label) self.label = self.label.transform(tw); }); - - _(AST_If, function(self, tw){ + DEF(AST_If, function(self, tw) { self.condition = self.condition.transform(tw); self.body = self.body.transform(tw); if (self.alternative) self.alternative = self.alternative.transform(tw); }); - - _(AST_Switch, function(self, tw){ + DEF(AST_Switch, function(self, tw) { self.expression = self.expression.transform(tw); self.body = do_list(self.body, tw); }); - - _(AST_Case, function(self, tw){ + DEF(AST_Case, function(self, tw) { self.expression = self.expression.transform(tw); self.body = do_list(self.body, tw); }); - - _(AST_Try, function(self, tw){ + DEF(AST_Try, function(self, tw) { self.body = do_list(self.body, tw); if (self.bcatch) self.bcatch = self.bcatch.transform(tw); if (self.bfinally) self.bfinally = self.bfinally.transform(tw); }); - - _(AST_Catch, function(self, tw){ + DEF(AST_Catch, function(self, tw) { self.argname = self.argname.transform(tw); self.body = do_list(self.body, tw); }); - - _(AST_Definitions, function(self, tw){ + DEF(AST_Definitions, function(self, tw) { self.definitions = do_list(self.definitions, tw); }); - - _(AST_VarDef, function(self, tw){ + DEF(AST_VarDef, function(self, tw) { self.name = self.name.transform(tw); if (self.value) self.value = self.value.transform(tw); }); - - _(AST_Lambda, function(self, tw){ + DEF(AST_Lambda, function(self, tw) { if (self.name) self.name = self.name.transform(tw); self.argnames = do_list(self.argnames, tw); self.body = do_list(self.body, tw); }); - - _(AST_Call, function(self, tw){ + DEF(AST_Call, function(self, tw) { self.expression = self.expression.transform(tw); self.args = do_list(self.args, tw); }); - - _(AST_Sequence, function(self, tw){ + DEF(AST_Sequence, function(self, tw) { self.expressions = do_list(self.expressions, tw); }); - - _(AST_Dot, function(self, tw){ + DEF(AST_Dot, function(self, tw) { self.expression = self.expression.transform(tw); }); - - _(AST_Sub, function(self, tw){ + DEF(AST_Sub, function(self, tw) { self.expression = self.expression.transform(tw); self.property = self.property.transform(tw); }); - - _(AST_Unary, function(self, tw){ + DEF(AST_Unary, function(self, tw) { self.expression = self.expression.transform(tw); }); - - _(AST_Binary, function(self, tw){ + DEF(AST_Binary, function(self, tw) { self.left = self.left.transform(tw); self.right = self.right.transform(tw); }); - - _(AST_Conditional, function(self, tw){ + DEF(AST_Conditional, function(self, tw) { self.condition = self.condition.transform(tw); self.consequent = self.consequent.transform(tw); self.alternative = self.alternative.transform(tw); }); - - _(AST_Array, function(self, tw){ + DEF(AST_Array, function(self, tw) { self.elements = do_list(self.elements, tw); }); - - _(AST_Object, function(self, tw){ + DEF(AST_Object, function(self, tw) { self.properties = do_list(self.properties, tw); }); - - _(AST_ObjectProperty, function(self, tw){ + DEF(AST_ObjectProperty, function(self, tw) { self.value = self.value.transform(tw); }); - -})(); +})(function(node, descend) { + node.DEFMETHOD("transform", function(tw, in_list) { + var x, y; + tw.push(this); + if (tw.before) x = tw.before(this, descend, in_list); + if (typeof x === "undefined") { + x = this; + descend(x, tw); + if (tw.after) { + y = tw.after(x, in_list); + if (typeof y !== "undefined") x = y; + } + } + tw.pop(); + return x; + }); +}); |