use the appropriate constructor for symbols
authorMihai Bazon <mihai@bazon.net>
Thu, 4 Oct 2012 14:28:35 +0000 (17:28 +0300)
committerMihai Bazon <mihai@bazon.net>
Thu, 4 Oct 2012 14:28:35 +0000 (17:28 +0300)
lib/mozilla-ast.js

index 6bc3395..41cf13c 100644 (file)
                 end        : my_end_token(M),
                 properties : M.properties.map(function(prop){
                     var key = prop.key;
+                    var name = key.type == "Identifier" ? key.name : key.value;
                     var args = {
                         start    : my_start_token(key),
                         end      : my_end_token(prop.value),
-                        key      : key.type == "Identifier" ? key.name : key.value,
+                        key      : name,
                         value    : from_moz(prop.value)
                     };
                     switch (prop.kind) {
                       case "init":
                         return new AST_ObjectKeyVal(args);
                       case "set":
+                        args.value.name = from_moz(key);
                         return new AST_ObjectSetter(args);
                       case "get":
+                        args.value.name = from_moz(key);
                         return new AST_ObjectGetter(args);
                     }
                 })
             }
         },
         UnaryExpression: From_Moz_Unary,
-        UpdateExpression: From_Moz_Unary
+        UpdateExpression: From_Moz_Unary,
+        Identifier: function(M) {
+            var p = FROM_MOZ_STACK[FROM_MOZ_STACK.length - 2];
+            return new (M.name == "this" ? AST_This
+                        : p.type == "LabeledStatement" ? AST_Label
+                        : p.type == "VariableDeclarator" && p.id === M ? (p.kind == "const" ? AST_SymbolConst : AST_SymbolVar)
+                        : p.type == "FunctionExpression" ? (p.id === M ? AST_SymbolLambda : AST_SymbolFunarg)
+                        : p.type == "FunctionDeclaration" ? (p.id === M ? AST_SymbolDefun : AST_SymbolFunarg)
+                        : p.type == "CatchClause" ? AST_SymbolCatch
+                        : p.type == "BreakStatement" || p.type == "ContinueStatement" ? AST_LabelRef
+                        : AST_SymbolRef)({
+                            start : my_start_token(M),
+                            end   : my_end_token(M),
+                            name  : M.name
+                        });
+        }
     };
 
     function From_Moz_Unary(M) {
     map("ConditionalExpression", AST_Conditional, "test>condition, consequent>consequent, alternate>alternative");
     map("NewExpression", AST_New, "callee>expression, arguments@args");
     map("CallExpression", AST_Call, "callee>expression, arguments@args");
-    map("Identifier", AST_Symbol, "name=name");
 
     /* -----[ tools ]----- */
 
         return MOZ_TO_ME[moztype] = moz_to_me;
     };
 
+    var FROM_MOZ_STACK = null;
+
     function from_moz(node) {
-        return node != null ? MOZ_TO_ME[node.type](node) : null;
+        FROM_MOZ_STACK.push(node);
+        var ret = node != null ? MOZ_TO_ME[node.type](node) : null;
+        FROM_MOZ_STACK.pop();
+        return ret;
     };
 
-    AST_Node.from_mozilla_ast = from_moz;
+    AST_Node.from_mozilla_ast = function(node){
+        var save_stack = FROM_MOZ_STACK;
+        FROM_MOZ_STACK = [];
+        var ast = from_moz(node);
+        FROM_MOZ_STACK = save_stack;
+        return ast;
+    };
 
 })();