Отключить проверку повторяющихся деклараций в 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
  }
}

Это уродливый хакер, потому что я отфильтровываю повторяющееся сообщение объявления на основе строкового сообщения об ошибке. Однако лучшего способа не найти.

Другие вопросы по тегам