Установка этого контекста в редакторе Monaco для javascript

При создании редактора для использования с Javascript можно ли установить контекст, к которому изначально будет применяться ключевое слово this (возможно, глобальная область)?

В Monaco Editor Playground, если значение редактора изначально пустое и я набираю this., я хотел бы, чтобы список автозаполнения отображал возможности в зависимости от соответствующего контекста.

Даже внутри функции ввод this. приводит только к словам, которые появляются в функции. Других вариантов нет.


person Jim Bouquet    schedule 14.02.2018    source источник
comment
Не знаю, возможно это или нет, но это была бы крутая функция.   -  person freginold    schedule 14.02.2018


Ответы (1)


Конечно не из коробки. Проблема в том, что JavaScript — довольно сложный язык. Чтобы определить текущее значение this, вам нужен контекст. И, скорее всего, у вас его никогда не будет.

Для проверки кода у вас есть 3 уровня анализа:

  1. Синтаксический анализ. В Монако есть. Анализ синтаксиса может рассказать вам основные вещи о коде. Что var — это ключевое слово, что это — идентификатор (если я правильно помню), что строка 2, позиция 3 — это идентификатор, который находится в функции. Ничего больше.
  2. Семантический анализ. Этот тип анализа также может указать вам тип переменных. Это может дать вам больше информации об их типе, их членах, возможно, их значении для кода. Это не точно в JS, потому что вы можете добавлять или удалять члены типа в JS во время выполнения. Таким образом, вы можете получить совершенно другой тип. Например, у вас может быть тип, который имеет 1 свойство. Затем у вас может быть цикл for в коде, который добавляет столько свойств, сколько итераций (user1, user2 и т. д.). Таким образом, вы получите Company.User1, Company.User2 и т. д., в то время как вы начали с:

var Company = {}

Так что нет 100% точного анализа для этого в JS.

  1. Анализ во время выполнения — это более или менее то, что браузеры используют, чтобы иметь возможность определить тип переменной на самом деле во время выполнения кода (потому что с JS вы не знаете). Это делается во время выполнения кода.

С JS, если вы не дойдете до уровня 3 (анализ времени выполнения) - вы не гарантируете, что будете правы. Большинство редакторов будут частично использовать какой-то синтаксический анализ, какой-то семантический анализ и (возможно) просто немного анализа во время выполнения, чтобы попытаться сделать результаты более точными. Но они никогда не будут точными.

Если вы уверены, что это. должно быть - вы можете предоставить свои собственные элементы автозаполнения в редакторе monaco, подключив поставщика завершения:

https://microsoft.github.io/monaco-editor/api/interfaces/monaco.languages.completionitemprovider.html

person Pavel Donchev    schedule 12.07.2020