Ошибка в атоме пакета ternjs

Для веб-разработки (и не только) мой любимый редактор - отличный редактор атомов, проект с открытым исходным кодом от github.

Как и многие редакторы кода, мы можем расширить его, установив множество плагинов. Среди прочего я использую atom-ternjs:

Интеллектуальный код Javascript для атома с помощью tern.js. Использует предложение поставщика по автозаполнению-плюс.

Сегодня я получаю эту ошибку в окне флеш-сообщения "в стиле оповещения" в правом верхнем углу окна редактора:

TypeError: Невозможно прочитать свойство 'CallExpression' неопределенного в findTypeFromContext.NewExpression (/home/poremil/.atom/packages/atom-ternjs/node_modules/tern/lib/infer.js:1588:18) в Object.exports.typeFromContext (/home/poremil/.atom/packages/atom-ternjs/node_modules/tern/lib/infer.js:1623:24) в Object.findCompletions [как запущено] (/home/poremil/.atom/packages/atom-ternjs/node_modules/tern/lib/tern.js:684:23) при запуске (/home/poremil/.atom/packages/atom-ternjs/node_modules/tern/lib/tern.js:218:30) в Object.exports.withContext (/home/poremil/.atom/packages/atom-ternjs/node_modules/tern/lib/infer.js:774:18) в /home/poremil/.atom/packages/atom-ternjs/node_modules/tern/lib/tern.js:225:13 at analysisAll (/home/poremil/.atom/packages/atom-ternjs/node_modules/tern/lib/tern.js:339:15) в doRequest (/home/poremil/.atom/packages/atom-ternjs/node_modules/tern/lib/tern.js:209:5) в Object.signal.mixin.request (/home/poremil/.atom/packages/atom-ternjs/node_modules/tern/lib/tern.js:149:7) при ответе (/ главная / poremil /.atom / пакеты / атом ternjs / node_modules / крачка / бен / крачка:224:10)

Тем не менее, я не заметил какой-либо конкретной ошибки в моем рабочем процессе. Тем не менее, я хотел бы понять, что случилось.

Я также открыл вопрос о проекте GitHub

1 ответ

Решение

Да, это похоже на ошибку. Вот упрощенная выдержка из взломанного кода:

var findTypeFromContext = {
  NewExpression: function() { return this.CallExpression() }
  ,CallExpression: function() { console.log('calling expression'); }
}
var finder = findTypeFromContext['NewExpression'];
finder();

Это ломается из-за этого ключевого слова.

  1. var finder = findTypeFromContext['NewExpression']; присваивание берет метод NewExpression "out" (отсоединение от родительского объекта).
  2. Посредством этого присваивания ключевое слово this теперь указывает на текущий родительский объект - где CallExpression не существует.

Мое быстрое решение было бы немедленно вызвать функцию на объекте, так что это все еще указывает на правильное место:

var findTypeFromContext = {
  NewExpression: function() { this.CallExpression() }
  ,CallExpression: function() { console.log('calling expression'); }
}
findTypeFromContext['NewExpression']();
Другие вопросы по тегам