AST cleanup (dropped AST_StatementBase)
This commit is contained in:
42
lib/ast.js
42
lib/ast.js
@@ -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(){
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user