在 Acorn 中禁用重复声明验证

Disable duplicate declaration validation in Acorn

我正在使用 Acorn 将一些语法上有效的 JavaScript 代码解析为 ESTree 以供进一步处理。 Acorn 似乎也做了一些语义检查——特别是它会抛出重复声明的错误。比如解析下面的代码会抛出Identifier 'f' has already been declared:

的错误
function f() { return 1; }
function f() { return 2; }

我不想检查此类语义错误 - 我正在对生成的 ESTree 进行自定义处理,因此源代码的语义有效性对我来说并不重要。

我查看了 parse(input, options) 函数的 Acorn 选项,但找不到任何听起来像我想要的东西。

有没有办法禁用这种语义检查?

似乎没有合适的方法来禁用语义验证。通过覆盖 raiseRecoverable 方法,我设法通过一个丑陋的 hack 得到了我想要的东西。

这对我有用(请注意,我在这里使用的是 TypeScript,但当然也可以在普通 JavaScript 中做同样的事情):

import { Parser } from "acorn";
class SyntacticParser extends Parser {
  raiseRecoverable(pos: any, message: string) {
    if (message.includes("Identifier ") && message.includes(" has already been declared")) return;
    (Parser.prototype as any).raiseRecoverable.call(this, pos, message); // weird call syntax required because the TypeScript types for Parser doesn't contain the `raiseRecoverable` method
  }
}

这是一个丑陋的 hack,因为我正在根据字符串化的错误消息过滤掉重复的声明消息。但是,似乎没有更好的方法。