aboutsummaryrefslogtreecommitdiff
path: root/lib/transform.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/transform.js')
-rw-r--r--lib/transform.js132
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;
+ });
+});