SymbolInformation containerName用于大纲视图层次结构

时间:2019-07-12 17:36:21

标签: typescript visual-studio-code vscode-extensions

我有一种自定义语言,我正在尝试使代码大纲起作用。我已经成功地为我的语言生成了符号,并使函数在大纲视图中列出。现在,我试图使诸如变量之类的项显示在大纲视图的功能下。我目前具有平面轮廓视图,但是我的符号似乎包含正确的containerName值。

flat outline view

symbols

这是我目前在extension.ts中拥有的代码:

'use strict';
import * as vscode from 'vscode';

export function activate(context: vscode.ExtensionContext) {
    context.subscriptions.push(vscode.languages.registerDocumentSymbolProvider(
        {language: "as"}, new FooDocumentSymbolProvider()
    ));
}

class FooDocumentSymbolProvider implements vscode.DocumentSymbolProvider {
    public provideDocumentSymbols(document: vscode.TextDocument,token: vscode.CancellationToken): Thenable<vscode.SymbolInformation[]> {
        return new Promise((resolve, reject) => {
            var symbols = [];
            var sym = "";
            for (var i = 0; i < document.lineCount; i++) {
                var line = document.lineAt(i);
                if (line.text.startsWith(".PROGRAM")) {
                    var sym = "";
                    symbols.push({
                        name: line.text.substr(9).trimRight(),
                        kind: vscode.SymbolKind.Function,
                        containerName: sym,
                        location: new vscode.Location(document.uri, line.range)
                    })
                    sym = line.text.substr(9).trimRight();
                }
                if (line.text.includes("CALL") && !(line.text.startsWith(".*"))) {
                    symbols.push({
                        name: line.text.substr(0).trimLeft(),
                        kind: vscode.SymbolKind.Module,
                        containerName: sym,
                        location: new vscode.Location(document.uri, line.range)
                    })
                }
            }
            resolve(symbols);
        });
    }
}

1 个答案:

答案 0 :(得分:0)

containerName实际上不是造成层次结构的原因。它只是符号后面带有灰色字体的一些附加“详细信息”。

诀窍是完全不使用SymbolInformation,而是使用最新的DocumentSymbol API(文档符号提供者不曾使用过支持层次结构,它只是added in 1.25)。每个DocumentSymbol可以有一个children数组,因此层次结构可以很自然地表示为一棵树。