typescript - استفاده از SymbolInformation containerName برای سلسله مراتب نمای طرح کلی
من یک زبان سفارشی دارم و در تلاش هستم تا کد نمایه آن کار کند. من تا حدودی در تولید نمادها برای زبانم و نمایش عملکردها در نمایه موفق بودهام. حالا در تلاش هستم تا آیتمهایی مانند متغیرها در زیر عملکرد در نمایه نمایش داده شوند. در حال حاضر نمایه من به صورت مسطح است اما به نظر میرسد نمادهایم دارای مقدار 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);
});
}
}
بهروزرسانی شماره ۲:
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);
});
}
}
پاسخ شماره ۱
containerName در واقع مسئول سلسلهمراتب نیست. این فقط یک «جزئیات» اضافی است که پس از نماد با فونت خاکستری نمایش داده میشود.
ترفند این است که اصلاً از SymbolInformation استفاده نکنید، بلکه از API جدیدتر DocumentSymbol استفاده کنید (ارائهدهندگان نماد سند قبلاً از سلسلهمراتب پشتیبانی نمیکردند و این ویژگی تنها در نسخه 1.25 اضافه شد). هر DocumentSymbol میتواند یک آرایه از children داشته باشد، بنابراین سلسلهمراتب میتواند بهطور طبیعی به عنوان یک درخت نمایش داده شود.

