add AST_SymbolConst for names defined with `const`
authorMihai Bazon <mihai@bazon.net>
Tue, 2 Oct 2012 09:22:39 +0000 (12:22 +0300)
committerMihai Bazon <mihai@bazon.net>
Tue, 2 Oct 2012 09:22:39 +0000 (12:22 +0300)
lib/ast.js
lib/parse.js
lib/scope.js

index 0b0273c..c62e142 100644 (file)
@@ -599,7 +599,11 @@ var AST_SymbolDeclaration = DEFNODE("SymbolDeclaration", "init", {
 }, AST_Symbol);
 
 var AST_SymbolVar = DEFNODE("SymbolVar", null, {
-    $documentation: "Symbol defining a variable or constant",
+    $documentation: "Symbol defining a variable",
+}, AST_SymbolDeclaration);
+
+var AST_SymbolConst = DEFNODE("SymbolConst", null, {
+    $documentation: "A constant declaration"
 }, AST_SymbolDeclaration);
 
 var AST_SymbolFunarg = DEFNODE("SymbolFunarg", null, {
index 981c129..b054c72 100644 (file)
@@ -1105,12 +1105,12 @@ function parse($TEXT, options) {
         });
     };
 
-    function vardefs(no_in) {
+    function vardefs(no_in, in_const) {
         var a = [];
         for (;;) {
             a.push(new AST_VarDef({
                 start : S.token,
-                name  : as_symbol(AST_SymbolVar),
+                name  : as_symbol(in_const ? AST_SymbolConst : AST_SymbolVar),
                 value : is("operator", "=") ? (next(), expression(false, no_in)) : null,
                 end   : prev()
             }));
@@ -1124,7 +1124,7 @@ function parse($TEXT, options) {
     var var_ = function(no_in) {
         return new AST_Var({
             start       : prev(),
-            definitions : vardefs(no_in),
+            definitions : vardefs(no_in, false),
             end         : prev()
         });
     };
@@ -1132,7 +1132,7 @@ function parse($TEXT, options) {
     var const_ = function() {
         return new AST_Const({
             start       : prev(),
-            definitions : vardefs(),
+            definitions : vardefs(false, true),
             end         : prev()
         });
     };
index 9f8981f..71ed066 100644 (file)
@@ -49,6 +49,7 @@ function SymbolDef(scope, orig) {
     this.global = false;
     this.mangled_name = null;
     this.undeclared = false;
+    this.constant = false;
 };
 
 SymbolDef.prototype = {
@@ -144,9 +145,11 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(){
             (node.scope = scope.parent_scope).def_function(node);
             node.init.push(tw.parent());
         }
-        else if (node instanceof AST_SymbolVar) {
-            scope.def_variable(node);
-            var def = tw.parent();
+        else if (node instanceof AST_SymbolVar
+                 || node instanceof AST_SymbolConst) {
+            var def = scope.def_variable(node);
+            def.constant = node instanceof AST_SymbolConst;
+            def = tw.parent();
             if (def.value) node.init.push(def);
         }
         else if (node instanceof AST_SymbolCatch) {