заставить VS Code анализировать и отображать структуру нового языка в контурной области VSC - PullRequest
1 голос
/ 25 апреля 2019

Я пытаюсь заставить VSC отображать структуру документа, содержащего DSL (предметно-ориентированный язык), добавляя определение языка в VSC.Структура должна отображаться в «схематическом виде» VSC, где вся структура документа показана для установленных языков (таких как json, markdown, html и т. Д.)

DSL довольно прост, и должны отображаться только некоторые элементы заглавными буквамив общих чертах и ​​сохраняйте иерархию:

WORD xxx
GRAMMAR xxx
STRUCTURE xxx xxx
     xxx xxx xxx xxx
MEANING xxx xxx xxx 
    SUB_MEANING xxx xxx xxx xxx
        SUB_SUB_MEANING xxx xxx xxx

Я следовал всем указаниям на стекопотоки, которые все приводят к официальной документации VSC и / или протокола языкового сервера (LSP).Тем не менее, никто не помог, совсем нет. Да, я мог бы использовать расширение CodeMap, но я не хочу зависеть от этого, поскольку VSC действительно может понимать новые языки.Для хорошо известных языков нет необходимости создавать выделенный элемент древовидного представления или что-то еще, поэтому ОБЯЗАТЕЛЬНО должен быть способ заставить VSC анализировать структуру языка.

"представление схемы" в VSC остается пустым.Я выяснил, что установленная языковая поддержка (например) markdown или json также не создает никакого контента для «Outline», если удаляется папка «xxx-language-features» (xxx обозначает язык) в папке расширений VSC.,Так что, похоже, мне тоже нужно расширение языка.

Я прошел через https://code.visualstudio.com/api/language-extensions/language-configuration-guide и https://microsoft.github.io/language-server-protocol/ и многие другие вещи, включая пример LSP из Github-Repo VSC, но есть НИЧЕГО , которое помогаетна что.Я также пытался создать новый язык с помощью «кода йо».Ничего такого.LSP-пример, предоставленный Microsoft, предназначен для файлов открытого текста ... насколько полезно создать языковой сервер для открытого текста ?!Я хотел бы иметь пример на языке.Просмотр скомпилированных файлов внутри расширений не помогает, так как они минимизированы.

В этом вопросе нет полного «как» - поэтому любая помощь приветствуется!Как я могу сказать VSC разобрать структуру документа в «контурный вид»?

Ответы [ 2 ]

0 голосов
/ 02 мая 2019

Я искал неправильные места для решения и, возможно, пропустил лес за деревьями после нескольких потерянных дней.Затем коллега посмотрел на проблему с девственностью, и через несколько часов он нашел решение, приведенное ниже.По сути, DocumentSymbolProvider - это то, что нужно.

Поиск по этому ключевому слову дает несколько примеров, например, здесь .Официальные документы 1010 *, тем не менее, не предоставляют ничего, кроме информации о том, что вы можете создать экземпляр, тогда как важный код о том, КАК ИСПОЛЬЗОВАТЬ ЭТО, представлен ....ВАУ - это то, что я называю документом -.-

Тем не менее, есть некоторые вещи, неясные, но по крайней мере теперь мы можем работать с этой базой:

class MLWDocumentSymbolProvider implements vscode.DocumentSymbolProvider {
public provideDocumentSymbols(document: vscode.TextDocument,
        token: vscode.CancellationToken): Thenable<vscode.SymbolInformation[]> {
    return new Promise((resolve, reject) => {

      // that's the important variable. It must be a multidimensional array, one dimension for each level you need to display.
      let symbols = [];

      let icon_main = vscode.SymbolKind.Class;
      let icon_second = vscode.SymbolKind.Field;
      let icon_third = vscode.SymbolKind.String;

      // check each line of the document about your keywords
      for (let i = 0; i < document.lineCount; i++) {
        let line = document.lineAt(i);
        if(line.text.trim().startsWith("WORD")) {
          symbols.push(new vscode.DocumentSymbol("Level 1: WORD", document.lineAt(i+1).text.trim(), icon_main, line.range, line.range ));
        } /* elses for the levels below */
       }

      resolve(symbols);
        });
    }

}

Я думаю, что ответ Gamma11 был как-то близок.Из-за отсутствия информации в официальных документах о том, где и как ее использовать, к сожалению, она действительно не может нам помочь.

Получение знаний о VSC-кодировании кажется очень трудным из-за того, чтоДокументы не предоставляют много информации, кроме базовой структуры.Если кто-то знает сайт с полными примерами или описаниями классов / интерфейсов / функций, пожалуйста, оставьте комментарий.За почти 20 лет программирования я никогда не видел такого отсутствия документации такого огромного проекта, где основные части представлены ... или в объекте просто ничего нет .-

0 голосов
/ 25 апреля 2019

Представление структуры заполняется запросом на символы документа . То же самое верно для навигации по хлебным крошкам и, конечно же, всплывающих символов обычного документа ( Перейти → Перейти к символу в файле ... ).

Иерархия достигается путем использования DocumentSymbol.children вместо возврата плоского списка.

...