added the workspace symbol provider for markdown #46406 (#47610)

* added the workspace symbol provider for markdown 46406

* fixed the review comments 46406
This commit is contained in:
Pradeep Murugesan 2018-04-14 00:03:50 +02:00 committed by Matt Bierner
parent 9e7763ccdb
commit 5e993f7160
2 changed files with 65 additions and 2 deletions

View file

@ -14,6 +14,7 @@ import { loadDefaultTelemetryReporter } from './telemetryReporter';
import { getMarkdownExtensionContributions } from './markdownExtensions';
import LinkProvider from './features/documentLinkProvider';
import MDDocumentSymbolProvider from './features/documentSymbolProvider';
import MarkdownWorkspaceSymbolProvider from './features/workspaceSymbolProvider';
import { MarkdownContentProvider } from './features/previewContentProvider';
import { MarkdownPreviewManager } from './features/previewManager';
import MarkdownFoldingProvider from './features/foldingProvider';
@ -32,13 +33,14 @@ export function activate(context: vscode.ExtensionContext) {
const selector = 'markdown';
const contentProvider = new MarkdownContentProvider(engine, context, cspArbiter, contributions, logger);
const symbolProvider = new MDDocumentSymbolProvider(engine);
const previewManager = new MarkdownPreviewManager(contentProvider, logger, contributions);
context.subscriptions.push(previewManager);
context.subscriptions.push(vscode.languages.registerDocumentSymbolProvider(selector, new MDDocumentSymbolProvider(engine)));
context.subscriptions.push(vscode.languages.registerDocumentSymbolProvider(selector, symbolProvider));
context.subscriptions.push(vscode.languages.registerDocumentLinkProvider(selector, new LinkProvider()));
context.subscriptions.push(vscode.languages.registerFoldingProvider(selector, new MarkdownFoldingProvider(engine)));
context.subscriptions.push(vscode.languages.registerWorkspaceSymbolProvider(new MarkdownWorkspaceSymbolProvider(symbolProvider)));
const previewSecuritySelector = new PreviewSecuritySelector(cspArbiter, previewManager);

View file

@ -0,0 +1,61 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { workspace, WorkspaceSymbolProvider, SymbolInformation, TextDocument, Disposable } from 'vscode';
import { isMarkdownFile } from '../util/file';
import MDDocumentSymbolProvider from './documentSymbolProvider';
import { Dictionary, flatMap } from 'lodash';
export default class MarkdownWorkspaceSymbolProvider implements WorkspaceSymbolProvider {
private symbolProvider: MDDocumentSymbolProvider;
private symbolCache: Dictionary<SymbolInformation[]> = {};
private symbolCachePopulated: boolean;
private deRegisterOnSaveEvent: Disposable;
public constructor(symbolProvider: MDDocumentSymbolProvider) {
this.symbolProvider = symbolProvider;
this.symbolCachePopulated = false;
this.deRegisterOnSaveEvent = this.registerOnSaveEvent();
}
public async provideWorkspaceSymbols(query: string): Promise<SymbolInformation[]> {
if (!this.symbolCachePopulated) {
await this.populateSymbolCache();
this.symbolCachePopulated = true;
}
return flatMap(this.symbolCache)
.filter(symbolInformation => symbolInformation.name.toLowerCase().indexOf(query.toLowerCase()) !== -1);
}
public async populateSymbolCache(): Promise<void> {
const markDownDocumentUris = await workspace.findFiles('**/*.md');
for (const uri of markDownDocumentUris) {
const document = await workspace.openTextDocument(uri);
if (isMarkdownFile(document)) {
const symbols = await this.getSymbol(document);
this.symbolCache[document.fileName] = symbols;
}
}
}
public dispose(): void {
this.deRegisterOnSaveEvent.dispose();
}
private async getSymbol(document: TextDocument): Promise<SymbolInformation[]> {
return this.symbolProvider.provideDocumentSymbols(document);
}
private registerOnSaveEvent(): Disposable {
return workspace.onDidSaveTextDocument(async document => {
if (isMarkdownFile(document)) {
const symbols = await this.getSymbol(document);
this.symbolCache[document.fileName] = symbols;
}
});
}
}