• Home
  • History
  • Annotate
Name Date Size #Lines LOC

..23-May-2020-

.babelrcH A D26-Feb-201830 43

README.mdH A D26-Feb-20185 KiB172144

package.jsonH A D23-May-20202 KiB8180

README.md

1### Esrecurse [![Build Status](https://travis-ci.org/estools/esrecurse.svg?branch=master)](https://travis-ci.org/estools/esrecurse)
2
3Esrecurse ([esrecurse](https://github.com/estools/esrecurse)) is
4[ECMAScript](https://www.ecma-international.org/publications/standards/Ecma-262.htm)
5recursive traversing functionality.
6
7### Example Usage
8
9The following code will output all variables declared at the root of a file.
10
11```javascript
12esrecurse.visit(ast, {
13    XXXStatement: function (node) {
14        this.visit(node.left);
15        // do something...
16        this.visit(node.right);
17    }
18});
19```
20
21We can use `Visitor` instance.
22
23```javascript
24var visitor = new esrecurse.Visitor({
25    XXXStatement: function (node) {
26        this.visit(node.left);
27        // do something...
28        this.visit(node.right);
29    }
30});
31
32visitor.visit(ast);
33```
34
35We can inherit `Visitor` instance easily.
36
37```javascript
38class Derived extends esrecurse.Visitor {
39    constructor()
40    {
41        super(null);
42    }
43
44    XXXStatement(node) {
45    }
46}
47```
48
49```javascript
50function DerivedVisitor() {
51    esrecurse.Visitor.call(/* this for constructor */  this  /* visitor object automatically becomes this. */);
52}
53util.inherits(DerivedVisitor, esrecurse.Visitor);
54DerivedVisitor.prototype.XXXStatement = function (node) {
55    this.visit(node.left);
56    // do something...
57    this.visit(node.right);
58};
59```
60
61And you can invoke default visiting operation inside custom visit operation.
62
63```javascript
64function DerivedVisitor() {
65    esrecurse.Visitor.call(/* this for constructor */  this  /* visitor object automatically becomes this. */);
66}
67util.inherits(DerivedVisitor, esrecurse.Visitor);
68DerivedVisitor.prototype.XXXStatement = function (node) {
69    // do something...
70    this.visitChildren(node);
71};
72```
73
74The `childVisitorKeys` option does customize the behaviour of `this.visitChildren(node)`.
75We can use user-defined node types.
76
77```javascript
78// This tree contains a user-defined `TestExpression` node.
79var tree = {
80    type: 'TestExpression',
81
82    // This 'argument' is the property containing the other **node**.
83    argument: {
84        type: 'Literal',
85        value: 20
86    },
87
88    // This 'extended' is the property not containing the other **node**.
89    extended: true
90};
91esrecurse.visit(
92    ast,
93    {
94        Literal: function (node) {
95            // do something...
96        }
97    },
98    {
99        // Extending the existing traversing rules.
100        childVisitorKeys: {
101            // TargetNodeName: [ 'keys', 'containing', 'the', 'other', '**node**' ]
102            TestExpression: ['argument']
103        }
104    }
105);
106```
107
108We can use the `fallback` option as well.
109If the `fallback` option is `"iteration"`, `esrecurse` would visit all enumerable properties of unknown nodes.
110Please note circular references cause the stack overflow. AST might have circular references in additional properties for some purpose (e.g. `node.parent`).
111
112```javascript
113esrecurse.visit(
114    ast,
115    {
116        Literal: function (node) {
117            // do something...
118        }
119    },
120    {
121        fallback: 'iteration'
122    }
123);
124```
125
126If the `fallback` option is a function, `esrecurse` calls this function to determine the enumerable properties of unknown nodes.
127Please note circular references cause the stack overflow. AST might have circular references in additional properties for some purpose (e.g. `node.parent`).
128
129```javascript
130esrecurse.visit(
131    ast,
132    {
133        Literal: function (node) {
134            // do something...
135        }
136    },
137    {
138        fallback: function (node) {
139            return Object.keys(node).filter(function(key) {
140                return key !== 'argument'
141            });
142        }
143    }
144);
145```
146
147### License
148
149Copyright (C) 2014 [Yusuke Suzuki](https://github.com/Constellation)
150 (twitter: [@Constellation](https://twitter.com/Constellation)) and other contributors.
151
152Redistribution and use in source and binary forms, with or without
153modification, are permitted provided that the following conditions are met:
154
155  * Redistributions of source code must retain the above copyright
156    notice, this list of conditions and the following disclaimer.
157
158  * Redistributions in binary form must reproduce the above copyright
159    notice, this list of conditions and the following disclaimer in the
160    documentation and/or other materials provided with the distribution.
161
162THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
163AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
164IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
165ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
166DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
167(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
168LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
169ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
170(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
171THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
172