diff --git a/lib/rule-tester/rule-tester.js b/lib/rule-tester/rule-tester.js index 15c29bfde012..b73867c9899e 100644 --- a/lib/rule-tester/rule-tester.js +++ b/lib/rule-tester/rule-tester.js @@ -239,6 +239,21 @@ function defineStartEndAsError(objName, node) { }); } +/** + * define a property $parser to be original parser + * use `defineProperty` to make it non-enumerable + * @param {Parser} wrappedParser the wrapped parser + * @param {Parser} originalParser the original parser + * @returns {void} + */ +function defineOriginalParser(wrappedParser, originalParser) { + Object.defineProperty(wrappedParser, "$parser", { + value: originalParser, + writable: true, + enumerable: false + }); +} + /** * Define `start`/`end` properties of all nodes of the given AST as throwing error. * @param {ASTNode} ast The root node to errorize `start`/`end` properties. @@ -258,8 +273,10 @@ function defineStartEndAsErrorInTree(ast, visitorKeys) { * @returns {Parser} Wrapped parser object. */ function wrapParser(parser) { + let wrappedParser; + if (typeof parser.parseForESLint === "function") { - return { + wrappedParser = { $parser: parser, parseForESLint(...args) { const ret = parser.parseForESLint(...args); @@ -268,16 +285,22 @@ function wrapParser(parser) { return ret; } }; + } else { + wrappedParser = { + $parser: parser, + parse(...args) { + const ast = parser.parse(...args); + + defineStartEndAsErrorInTree(ast); + return ast; + } + }; } - return { - $parser: parser, - parse(...args) { - const ast = parser.parse(...args); - defineStartEndAsErrorInTree(ast); - return ast; - } - }; + defineOriginalParser(wrappedParser, parser); + + return wrappedParser; + } //------------------------------------------------------------------------------