Отключить проверку повторяющихся деклараций в Acorn
Я использую Acorn для синтаксического анализа синтаксически допустимого кода JavaScript в ESTree для дальнейшей обработки. Похоже, что Acorn также выполняет некоторые семантические проверки - в частности, он выдает ошибку при повторяющихся объявлениях. Например, при синтаксическом анализе следующего кода возникает ошибкаIdentifier 'f' has already been declared
:
function f() { return 1; }
function f() { return 2; }
Я не хочу, чтобы такие семантические ошибки проверялись - я выполняю специальную обработку полученного ESTree, поэтому семантическая достоверность исходного кода для меня не имеет значения.
Я просмотрел варианты Acorn для parse(input, options)
функция, но я не смог найти ничего, что звучало бы так, как я хочу.
Есть ли способ отключить такую семантическую проверку?
1 ответ
Похоже, что нет правильного способа отключить семантическую проверку. Мне удалось получить то, что я хочу, с помощью уродливого хака, переопределивraiseRecoverable
метод.
Это сработало для меня (обратите внимание, что я использую здесь 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
}
}
Это уродливый хакер, потому что я отфильтровываю повторяющееся сообщение объявления на основе строкового сообщения об ошибке. Однако лучшего способа не найти.