Для начала я должен сказать, что это явно не просто и требует довольно больших усилий.По сути, вам придется самостоятельно анализировать код, а затем делать предложения на основе информации, которую вы собрали путем анализа.
Я не могу вдаваться в подробности о том, как вы можете или должны анализировать код, потому что этоэто огромная задача.Когда вы анализируете код, вы должны понимать, что к чему, и вы (вероятно) не можете сделать это с помощью простого регулярного выражения.Очень сложный пример - интеграция TypeScript , но есть и более простые примеры, например, HTML-плагин .Я могу только порекомендовать заглянуть туда для вдохновения.
Когда вы проанализировали код, вы в основном готовы идти.Затем вы можете угадать, что пользователь хочет сделать дальше, или, например, предложить методы или поля объекта, к которому он в данный момент обращается.
Затем вы можете предложить завершение, что делается путем передачи Монако JSON.объект закончен (на самом деле класс TypeScript, но об этом позже).На игровой площадке Monaco есть пример , который показывает, как это можно сделать.Минималистичный поставщик может выглядеть следующим образом:
monaco.languages.registerCompletionItemProvider ("lua", { // Or any other language...
provideCompletionItems: (model, position) => {
// Retrieve the text until the current cursor's position, anything
// after that doesn't really matter.
var textToMatch = model.getValueInRange ({
startLineNumber: 1,
startColumn: 1,
endLineNumber: position.lineNumber,
endColumn: position.column
});
// Return JSON array containing all completion suggestions.
return {
suggestions: [
// Example: io.write ()
{
label: "io.write (string)",
kind: monaco.languages.CompletionItemKind.Function,
documentation: "Writes a string to stdout.",
insertText: "io.write (\"\")" // Escape JSON as needed.
}, // Other items.
]
};
}
});
Ознакомьтесь с документацией Монако по CompletionItemKind
для различных типов элементов завершения и по CompletionItemProvider
для«класс», который мы передаем как объект JSON registerCompletionItemProvider ()
.В документации по Монако есть все эти различные типы и классы, потому что Монако изначально написано на TypeScript , но эти классы и типы также могут быть похожи на обычный старый объект JSON.
Вы можете в принципе«создать» «богатого» поставщика IntelliSense, вызвав все различные register...Provider ()
функции , задокументированные здесь .
Если вы хотите действительно полезную IntelliSense, то я бы рекомендовал не забывать ометод registerSignatureHelpProvider ()
, который отображает окна «Peek Definition» при наведении мыши на тип, для которого доступно определение.
В любом случае, это действительно утомительная задача.И если вы посмотрите на файл, который отвечает за TypeScript IntelliSense (src/lib/typescriptServices.js
в репозитории интеграции TypeScript), его размер составляет 6,51 МБ.Хотя он также содержит модуль форматирования и т. Д., Он дает вам хорошее представление о требуемой работе и о том, почему я не могу вдаваться в подробности о реализации IntelliSense прямо здесь.