Expression/Statement visitor for ECMAScript5 Mozilla ASTs
npm install esvisitEsvisit is a simple npm module for visiting JavaScript abstract syntax trees that are compatible with Mozilla parser API as described in https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/Parser_API#Programs.
This module supports exclusvely ECMAScript5 as described in http://www.ecma-international.org/ecma-262/5.1/.
Benefits of using Esvisit includes:
* Process iteratively and avoid recursion.
* Get an alternative type that better reflects JavaScript semantic.
* Visit only actual statements and expressions.
``javascript
var Esvisit = require('esvisit');
var Esprima = require('esprima');
function indent () { return (new Array(depth+1)).join(" ") }
function visitStatement (type, stmt) { visit('Statement', type, stmt) }
function visitExpression (type, expr) { visit('Expression', type, expr) }
function visit (kind, type, node) {
var id = ++counter;
console.log(indent()+'Begin'+kind+id+': '+type+'('+Esvisit.ExtractInformation(type, node).join(", ")+')')
depth++
push(function () {
depth--
console.log(indent()+'End'+id)
})
}
var code = 'o.a = eval("2*"+x);' // Your JS code here...
var ast = Esprima.parse(code)
var counter = 0;
var depth = 0;
var push = Esvisit.Prepare(visitStatement, visitExpression)
push(ast)
`
Output:
``
BeginStatement1: Expression()
BeginExpression2: MemberAssignment(a, =)
BeginExpression3: EvalCall(1)
BeginExpression4: Binary(+)
BeginExpression5: Literal(2*)
End5
BeginExpression6: Identifier(x)
End6
End4
End3
BeginExpression7: Identifier(o)
End7
End2
End1
This module exposes four functions:
* Prepare(StatementCallback, ExpressionCallBack): prepare upcoming visits ; returns a function to push something on the worker list. Callbacks are called with: the Esvisit type of the current node and the current node itself. Esvisit types are described in the sections 'Statement Types' and 'Expression Types'ExtractInformation(EsvisitType, Node)
* ExtractStatementInformation(EsvisitType, Statement)
* ExtractExpressionInformation(EsvisitType, Expression)
*
Type | Interpretation | Information
:----|:---------------|:-----------
Empty | alias for EmptyStatement | []Strict | 'use strict'; | []Block | * | [Length]Expression | * | []If | * | [HasAlternate]Label | * | [Label]Break | * | [MaybeLabel]Continue | * | [MaybeLabel]With | * | []Switch | * | [Cases::[IsDefault, Length]]Return | * | [HasValue]Throw | * | []Try | * | [BodyLength, MaybeCatchParameter, MaybeCatchLength, MaybeFinalizerLength]While | * | []DoWhile | * | []DeclarationFor | for (VAR_DECL; EXPR; EXPR) STMT | [Declarators::[Name, HasInit], HasTest, HasUpdate]For | for (EXPR; EXPR; EXPR) STMT | [HasInit, HasTest, HasUpdate]IdentifierForIn | for (ID in EXPR) STMT | [Name]MemberForIn | for (MEMBER in EXPR) STMT | [MaybeProperty]DeclarationForIn | for (var ID [=EXPR] in EXPR) STMT | [Name, HasInit]Definition | alias for FunctionDeclaration | [Name, Parameters::[Name], BodyLength]Declaration | alias for VariableDeclaration | [Declarators::[Name, HasInit]]
(*): Add Statement to the type to obtain the Mozilla alias.
Type | Interpretation | Information
:----|:---------------|:-----------
This | alias for ThisExpression | []Array | ** | [Elements::[IsInitialized]]Object | ** | [Properties::[KeyValue, Kind, MaybeParameter, MaybeBodyLength]]Function | ** | [MaybeName, Parameters::[Name], BodyLength]Sequence | ** | [Length]IdentifierTypeof | typeof ID | [Name]IdentifierDelete | delete ID | [Name]MemberDelete | delete MEMBER | [MaybeProperty]Unary | ** | [Operator]Binary | ** | [Operator]IdentifierAssignment | ID ASS_OP EXPR | [Name, Operator]MemberAssignment | MEMBER ASS_OP EXPR | [MaybeProperty, Operator]IdentifierUpdate | ++ID, --ID, ID++, ID-- | [IsPrefix, Operator, Name]MemberUpdate | ++MEMBER, --MEMBER, MEMBER++, MEMBER-- | [IsPrefix, Operator, MaybeProperty]Logical | ** | [Operator]Conditional | ** | []New | ** | [ArgumentsLength]MemberCall | MEMBER(EXPRS) | [MaybeProperty, ArgumentsLength]EvalCall | eval(EXPRS) | [ArgumentsLength]Call | EXPR(EXPRS) | [ArgumentsLength]Member | ** | [MaybeProperty]Identifier | alias for Identifier | [Name]Literal | alias for Literal | [Value]
(**): Add Expression` to the type to obtain the Mozilla alias.