Projekt

Obecné

Profil

Stáhnout (4.98 KB) Statistiky
| Větev: | Revize:
1
### Esrecurse [![Build Status](https://travis-ci.org/estools/esrecurse.svg?branch=master)](https://travis-ci.org/estools/esrecurse)
2

    
3
Esrecurse ([esrecurse](https://github.com/estools/esrecurse)) is
4
[ECMAScript](https://www.ecma-international.org/publications/standards/Ecma-262.htm)
5
recursive traversing functionality.
6

    
7
### Example Usage
8

    
9
The following code will output all variables declared at the root of a file.
10

    
11
```javascript
12
esrecurse.visit(ast, {
13
    XXXStatement: function (node) {
14
        this.visit(node.left);
15
        // do something...
16
        this.visit(node.right);
17
    }
18
});
19
```
20

    
21
We can use `Visitor` instance.
22

    
23
```javascript
24
var visitor = new esrecurse.Visitor({
25
    XXXStatement: function (node) {
26
        this.visit(node.left);
27
        // do something...
28
        this.visit(node.right);
29
    }
30
});
31

    
32
visitor.visit(ast);
33
```
34

    
35
We can inherit `Visitor` instance easily.
36

    
37
```javascript
38
class Derived extends esrecurse.Visitor {
39
    constructor()
40
    {
41
        super(null);
42
    }
43

    
44
    XXXStatement(node) {
45
    }
46
}
47
```
48

    
49
```javascript
50
function DerivedVisitor() {
51
    esrecurse.Visitor.call(/* this for constructor */  this  /* visitor object automatically becomes this. */);
52
}
53
util.inherits(DerivedVisitor, esrecurse.Visitor);
54
DerivedVisitor.prototype.XXXStatement = function (node) {
55
    this.visit(node.left);
56
    // do something...
57
    this.visit(node.right);
58
};
59
```
60

    
61
And you can invoke default visiting operation inside custom visit operation.
62

    
63
```javascript
64
function DerivedVisitor() {
65
    esrecurse.Visitor.call(/* this for constructor */  this  /* visitor object automatically becomes this. */);
66
}
67
util.inherits(DerivedVisitor, esrecurse.Visitor);
68
DerivedVisitor.prototype.XXXStatement = function (node) {
69
    // do something...
70
    this.visitChildren(node);
71
};
72
```
73

    
74
The `childVisitorKeys` option does customize the behaviour of `this.visitChildren(node)`.
75
We can use user-defined node types.
76

    
77
```javascript
78
// This tree contains a user-defined `TestExpression` node.
79
var 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
};
91
esrecurse.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

    
108
We can use the `fallback` option as well.
109
If the `fallback` option is `"iteration"`, `esrecurse` would visit all enumerable properties of unknown nodes.
110
Please 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
113
esrecurse.visit(
114
    ast,
115
    {
116
        Literal: function (node) {
117
            // do something...
118
        }
119
    },
120
    {
121
        fallback: 'iteration'
122
    }
123
);
124
```
125

    
126
If the `fallback` option is a function, `esrecurse` calls this function to determine the enumerable properties of unknown nodes.
127
Please 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
130
esrecurse.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

    
149
Copyright (C) 2014 [Yusuke Suzuki](https://github.com/Constellation)
150
 (twitter: [@Constellation](https://twitter.com/Constellation)) and other contributors.
151

    
152
Redistribution and use in source and binary forms, with or without
153
modification, 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

    
162
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
163
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
164
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
165
ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
166
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
167
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
168
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
169
ON 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
171
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
(2-2/5)