在 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,因为我正在根据字符串化的错误消息过滤掉重复的声明消息。但是,似乎没有更好的方法。
我正在使用 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,因为我正在根据字符串化的错误消息过滤掉重复的声明消息。但是,似乎没有更好的方法。