Projekt

Obecné

Profil

Stáhnout (2.46 KB) Statistiky
| Větev: | Revize:
1
"use strict";
2

    
3
Object.defineProperty(exports, "__esModule", {
4
  value: true
5
});
6
exports.traverse = traverse;
7

    
8
var _nodePath = require("./node-path");
9

    
10
var _nodes = require("./nodes");
11

    
12
// recursively walks the AST starting at the given node. The callback is invoked for
13
// and object that has a 'type' property.
14
function walk(context, callback) {
15
  var stop = false;
16

    
17
  function innerWalk(context, callback) {
18
    if (stop) {
19
      return;
20
    }
21

    
22
    var node = context.node;
23

    
24
    if (node === undefined) {
25
      console.warn("traversing with an empty context");
26
      return;
27
    }
28

    
29
    if (node._deleted === true) {
30
      return;
31
    }
32

    
33
    var path = (0, _nodePath.createPath)(context);
34
    callback(node.type, path);
35

    
36
    if (path.shouldStop) {
37
      stop = true;
38
      return;
39
    }
40

    
41
    Object.keys(node).forEach(function (prop) {
42
      var value = node[prop];
43

    
44
      if (value === null || value === undefined) {
45
        return;
46
      }
47

    
48
      var valueAsArray = Array.isArray(value) ? value : [value];
49
      valueAsArray.forEach(function (childNode) {
50
        if (typeof childNode.type === "string") {
51
          var childContext = {
52
            node: childNode,
53
            parentKey: prop,
54
            parentPath: path,
55
            shouldStop: false,
56
            inList: Array.isArray(value)
57
          };
58
          innerWalk(childContext, callback);
59
        }
60
      });
61
    });
62
  }
63

    
64
  innerWalk(context, callback);
65
}
66

    
67
var noop = function noop() {};
68

    
69
function traverse(node, visitors) {
70
  var before = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : noop;
71
  var after = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : noop;
72
  Object.keys(visitors).forEach(function (visitor) {
73
    if (!_nodes.nodeAndUnionTypes.includes(visitor)) {
74
      throw new Error("Unexpected visitor ".concat(visitor));
75
    }
76
  });
77
  var context = {
78
    node: node,
79
    inList: false,
80
    shouldStop: false,
81
    parentPath: null,
82
    parentKey: null
83
  };
84
  walk(context, function (type, path) {
85
    if (typeof visitors[type] === "function") {
86
      before(type, path);
87
      visitors[type](path);
88
      after(type, path);
89
    }
90

    
91
    var unionTypes = _nodes.unionTypesMap[type];
92

    
93
    if (!unionTypes) {
94
      throw new Error("Unexpected node type ".concat(type));
95
    }
96

    
97
    unionTypes.forEach(function (unionType) {
98
      if (typeof visitors[unionType] === "function") {
99
        before(unionType, path);
100
        visitors[unionType](path);
101
        after(unionType, path);
102
      }
103
    });
104
  });
105
}
(8-8/9)