【问题标题】:SymbolInformation containerName use for outline view hierarchySymbolInformation containerName 用于大纲视图层次结构
【发布时间】:2019-07-12 17:36:21
【问题描述】:

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

这是我目前在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);
        });
    }
}

更新 #2:

public provideDocumentSymbols(document: vscode.TextDocument,token: vscode.CancellationToken): Thenable<vscode.DocumentSymbol[]> {
        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 = "";
                    var childrens = [];
                    symbols.push({
                        name: line.text.substr(9).trimRight(),
                        kind: vscode.SymbolKind.Function,
                        children: [],
                        range: line.range,
                        detail: "",
                        selectionRange: line.range
                        //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,
                        children: [],
                        range: line.range,
                        detail: "",
                        selectionRange: line.range
                        //location: new vscode.Location(document.uri, line.range)
                    })
                }
            }
            resolve(symbols);
        });
    }
}

【问题讨论】:

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


    【解决方案1】:

    containerName 实际上不是负责层次结构的。这只是符号后以灰色字体显示的一些附加“细节”。

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

    【讨论】:

    • 谢谢,我会改用 DocumentSymbol
    • 不确定是否正确构建它,因为我丢失了所有符号信息,请参阅更新 #2 中的代码。
    • 我在那个 sn-p 中没有看到任何 resolve() 调用,还是你忽略了它?
    • 由于某种原因我刚刚省略了。
    • 那么我看不出它不起作用的明显原因。
    猜你喜欢
    • 2017-07-03
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多