Esvisit 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.
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.