как заставить @ babel / parser распознавать 'undefined' как специальный токен? - PullRequest
0 голосов
/ 14 марта 2019

Я работаю над проектом, который включает проверку AST, предоставленной @ babel / parser, и в определенном (не супер-редком) случае он не ведет себя так, как я ожидал.Эта строка JavaScript:

const var1 = undefined;

при обработке этой командой:

babelParser.parse(data, {
    plugins: [ `jsx`, `classProperties` ],
    sourceType: `unambiguous`,
});

преобразуется в это поддерево:

{
  "type": "VariableDeclarator", // expected
  "start": 240,
  "end": 256,
  "loc": {
    "start": {
      "line": 17,
      "column": 4
    },
    "end": {
      "line": 17,
      "column": 20
    }
  },
  "id": {
    "type": "Identifier", // also expected
    "start": 240,
    "end": 244,
    "loc": {
      "start": {
        "line": 17,
        "column": 4
      },
      "end": {
        "line": 17,
        "column": 8
      },
      "identifierName": "var1"
    },
    "name": "var1"
  },
  "init": {
    "type": "Identifier", // dang, really?
    "start": 247,
    "end": 256,
    "loc": {
      "start": {
        "line": 17,
        "column": 11
      },
      "end": {
        "line": 17,
        "column": 20
      },
      "identifierName": "undefined"
    },
    "name": "undefined"
  }
}

Почему анализатор babel обрабатывает undefined как переменную вместо "UndefinedLiteral"?(Я имею в виду, помимо того факта, что «UndefinedLiteral», кажется, не является чем-то особенным согласно AST spec )

Есть ли способ изменить тип этого начального значенияузел?или мне придется добавить специальный код в мой код для поиска Identifier s со значением "undefined"?

1 Ответ

1 голос
/ 14 марта 2019

Вы не можете, потому что undefined не является специальным токеном в грамматике JS.Совершенно правильно делать

var undefined = 4;
console.log(undefined); // logs 4

, поэтому вам нужно проверить Identifier с именем undefined, и, если вы хотите быть осторожным, также проанализировать область действия переменной, чтобы увидеть, если онана самом деле это глобальная привязка undefined или локальная, которая может иметь другое значение.

...