in server/src/graphStore.ts [591:637]
public documentSymbols(uri: string): lsp.DocumentSymbol[] | undefined {
let symbolResult = this.getResultForDocument(this.toDatabase(uri), EdgeLabels.textDocument_documentSymbol);
if (symbolResult === undefined) {
return undefined;
}
if (symbolResult.result.length === 0) {
return [];
}
if (lsp.DocumentSymbol.is(symbolResult.result[0])) {
return symbolResult.result as lsp.DocumentSymbol[];
} else {
const vertexRetriever = new VertexRetriever(this.db, 16);
let collectRanges = (element: RangeBasedDocumentSymbol) => {
vertexRetriever.add(element.id);
if (element.children) {
element.children.forEach(collectRanges);
}
};
let convert = (result: lsp.DocumentSymbol[], elements: RangeBasedDocumentSymbol[], ranges: Map<Id, Range>) => {
for (let element of elements) {
let range = ranges.get(element.id);
if (range !== undefined) {
let symbol: lsp.DocumentSymbol | undefined = this.asDocumentSymbol(range);
if (symbol) {
result.push(symbol);
if (element.children !== undefined && element.children.length > 0) {
symbol.children = [];
convert(symbol.children, element.children, ranges);
}
}
}
}
};
(symbolResult.result as RangeBasedDocumentSymbol[]).forEach(collectRanges);
let data = vertexRetriever.run();
let ranges: Map<Id, Range> = new Map();
for (let element of data) {
let range: Range = this.decompress(JSON.parse(element.value));
if (range) {
ranges.set(range.id, range);
}
}
let result: lsp.DocumentSymbol[] = [];
convert(result, symbolResult.result as RangeBasedDocumentSymbol[], ranges);
return result;
}
}