public documentSymbols()

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;
		}
	}