JSPM

ast-traverse

0.1.1
  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 211894
  • Score
    100M100P100Q162620F
  • License MIT

simple but flexible AST traversal with pre and post visitors

Package Exports

  • ast-traverse

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (ast-traverse) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

ast-traverse.js

Simple but flexible AST traversal with pre and post visitors. Works in node and browsers.

Usage

// ast is a Mozilla Parser API compatible structure
// generated by Esprima or another parser
var ast = require("esprima").parse("f(1, x) + 2");

var traverse = require("ast-traverse");

// print AST node types, pre-order (node first, then its children)
traverse(ast, {pre: function(node, parent, prop, idx) {
    console.log(node.type + (parent ? " from parent " + parent.type +
        " via " + prop + (idx !== undefined ? "[" + idx + "]" : "") : ""));
}});
console.log();
/*
 =>
 Program
 ExpressionStatement from parent Program via body[0]
 BinaryExpression from parent ExpressionStatement via expression
 CallExpression from parent BinaryExpression via left
 Identifier from parent CallExpression via callee
 Literal from parent CallExpression via arguments[0]
 Identifier from parent CallExpression via arguments[1]
 Literal from parent BinaryExpression via right
 */


// you can also visit post-order, or both
// all four arguments are provided to both visitors (left out unused below)
var indent = 0;
traverse(ast, {
    pre: function(node) {
        console.log(Array(indent + 1).join(" ") + node.type);
        indent += 4;
    },
    post: function() {
        indent -= 4;
    }
});
console.log();
/*
=>
 Program
     ExpressionStatement
         BinaryExpression
             CallExpression
                 Identifier
                 Literal
                 Identifier
             Literal
*/


// return false from the pre-visitor to skip traversing its children
// throw an exception to abort traversal


// by default node property names beginning with $ are skipped
// but you can supply your own skipProperty function instead
traverse(ast, {
    pre: function(node) {
        console.log(node.type);
    },
    skipProperty: function(prop, node) {
        return prop === "parent" || prop === "expression";
    }
});
/*
=>
 Program
 ExpressionStatement
*/

Installation

Node

Install using npm

npm install ast-traverse
var traverse = require("ast-traverse");

Browser

Clone the repo and include it in a script tag

git clone https://github.com/olov/ast-traverse.git
<script src="ast-traverse/ast-traverse.js"></script>