UNPKG

1.29 kBJavaScriptView Raw
1/**
2 * @author Toru Nagashima <https://github.com/mysticatea>
3 */
4"use strict";
5
6const espree = require("espree");
7const Traverser = require("../util/traverser");
8
9/**
10 * Define `start`/`end` properties as throwing error.
11 * @param {ASTNode} node The node to define.
12 * @returns {void}
13 */
14function defineStartEndAsError(node) {
15 Object.defineProperty(node, "start", {
16 get() {
17 throw new Error("Use node.range[0] instead of node.start");
18 },
19 configurable: true,
20 enumerable: false
21 });
22 Object.defineProperty(node, "end", {
23 get() {
24 throw new Error("Use node.range[1] instead of node.end");
25 },
26 configurable: true,
27 enumerable: false
28 });
29}
30
31/**
32 * Define `start`/`end` properties of all nodes of the given AST as throwing error.
33 * @param {ASTNode} ast The root node to errorize `start`/`end` properties.
34 * @returns {void}
35 */
36function defineStartEndAsErrorInTree(ast) {
37 new Traverser().traverse(ast, { enter: defineStartEndAsError });
38 ast.tokens.forEach(defineStartEndAsError);
39 ast.comments.forEach(defineStartEndAsError);
40}
41
42module.exports.parse = (code, options) => {
43 const ret = espree.parse(code, options);
44
45 defineStartEndAsErrorInTree(ret.ast || ret);
46
47 return ret;
48};