AST cleanup (dropped AST_StatementBase)
authorMihai Bazon <mihai@bazon.net>
Wed, 3 Oct 2012 12:41:11 +0000 (15:41 +0300)
committerMihai Bazon <mihai@bazon.net>
Wed, 3 Oct 2012 12:41:11 +0000 (15:41 +0300)
lib/ast.js
lib/compress.js
test/run-tests.js

index 185328a..d80d715 100644 (file)
@@ -114,31 +114,28 @@ AST_Node.warn = function(txt, props) {
 
 /* -----[ statements ]----- */
 
-var AST_StatementBase = DEFNODE("StatementBase", null, {
+var AST_Statement = DEFNODE("Statement", null, {
+    $documentation: "Base class of all statements",
 });
 
-var AST_Statement = DEFNODE("Statement", "body", {
-    $documentation: "Base class of all statements",
+var AST_Debugger = DEFNODE("Debugger", null, {
+    $documentation: "Represents a debugger statement",
+}, AST_Statement);
+
+var AST_Directive = DEFNODE("Directive", "value scope", {
+    $documentation: "Represents a directive, like \"use strict\";",
+}, AST_Statement);
+
+var AST_SimpleStatement = DEFNODE("SimpleStatement", "body", {
+    $documentation: "A statement consisting of an expression, i.e. a = 1 + 2.",
     _walk: function(visitor) {
         return visitor._visit(this, function(){
             this.body._walk(visitor);
         });
     }
-}, AST_StatementBase);
-
-var AST_Debugger = DEFNODE("Debugger", null, {
-    $documentation: "Represents a debugger statement"
-}, AST_StatementBase);
-
-var AST_Directive = DEFNODE("Directive", "value scope", {
-    $documentation: "Represents a directive, like \"use strict\";"
-}, AST_StatementBase);
-
-var AST_SimpleStatement = DEFNODE("SimpleStatement", null, {
-    $documentation: "A statement consisting of an expression, i.e. a = 1 + 2."
 }, AST_Statement);
 
-var AST_BlockStatement = DEFNODE("BlockStatement", null, {
+var AST_BlockStatement = DEFNODE("BlockStatement", "body", {
     $documentation: "A block statement.",
     _walk: function(visitor) {
         return visitor._visit(this, function(){
@@ -158,7 +155,7 @@ function walk_body(node, visitor) {
     });
 };
 
-var AST_Block = DEFNODE("Block", null, {
+var AST_Block = DEFNODE("Block", "body", {
     $documentation: "A block of statements (usually always bracketed)",
     _walk: function(visitor) {
         return visitor._visit(this, function(){
@@ -174,8 +171,13 @@ var AST_EmptyStatement = DEFNODE("EmptyStatement", null, {
     }
 }, AST_Statement);
 
-var AST_StatementWithBody = DEFNODE("StatementWithBody", null, {
-    $documentation: "Base class for all statements that contain one nested body: `For`, `ForIn`, `Do`, `While`, `With`."
+var AST_StatementWithBody = DEFNODE("StatementWithBody", "body", {
+    $documentation: "Base class for all statements that contain one nested body: `For`, `ForIn`, `Do`, `While`, `With`.",
+    _walk: function(visitor) {
+        return visitor._visit(this, function(){
+            this.body._walk(visitor);
+        });
+    }
 }, AST_Statement);
 
 var AST_LabeledStatement = DEFNODE("LabeledStatement", "label", {
@@ -325,7 +327,7 @@ var AST_If = DEFNODE("If", "condition alternative", {
 
 /* -----[ SWITCH ]----- */
 
-var AST_Switch = DEFNODE("Switch", "expression", {
+var AST_Switch = DEFNODE("Switch", "body expression", {
     $documentation: "A `switch` statement",
     _walk: function(visitor) {
         return visitor._visit(this, function(){
index 423d049..1319d79 100644 (file)
@@ -162,7 +162,7 @@ merge(Compressor.prototype, {
         if (thing === null) return [];
         if (thing instanceof AST_BlockStatement) return thing.body;
         if (thing instanceof AST_EmptyStatement) return [];
-        if (thing instanceof AST_StatementBase) return [ thing ];
+        if (thing instanceof AST_Statement) return [ thing ];
         throw new Error("Can't convert thing to statement array");
     };
 
@@ -741,7 +741,7 @@ merge(Compressor.prototype, {
         return thing && thing.aborts();
     };
     (function(def){
-        def(AST_StatementBase, function(){ return null });
+        def(AST_Statement, function(){ return null });
         def(AST_Jump, function(){ return this });
         def(AST_BlockStatement, function(){
             var n = this.body.length;
index 8822f2a..abace39 100755 (executable)
@@ -46,7 +46,7 @@ function test_directory(dir) {
 
 function as_toplevel(input) {
     if (input instanceof U.AST_BlockStatement) input = input.body;
-    else if (input instanceof U.AST_StatementBase) input = [ input ];
+    else if (input instanceof U.AST_Statement) input = [ input ];
     else throw new Error("Unsupported input syntax");
     var toplevel = new U.AST_Toplevel({ body: input });
     toplevel.figure_out_scope();