From 017d09e2fe0e917df03beb9e9fd7fd69dae1f7cc Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 13 Apr 2018 16:34:05 -0700 Subject: [PATCH] Be more lazy computing symbols --- .../src/features/workspaceSymbolProvider.ts | 11 ++++-- .../src/util/lazy.ts | 39 +++++++++++++++++++ 2 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 extensions/markdown-language-features/src/util/lazy.ts diff --git a/extensions/markdown-language-features/src/features/workspaceSymbolProvider.ts b/extensions/markdown-language-features/src/features/workspaceSymbolProvider.ts index f383a011778..ecf6f1b2140 100644 --- a/extensions/markdown-language-features/src/features/workspaceSymbolProvider.ts +++ b/extensions/markdown-language-features/src/features/workspaceSymbolProvider.ts @@ -6,6 +6,7 @@ import * as vscode from 'vscode'; import { disposeAll } from '../util/dispose'; import { isMarkdownFile } from '../util/file'; +import { Lazy, lazy } from '../util/lazy'; import MDDocumentSymbolProvider from './documentSymbolProvider'; export interface WorkspaceMarkdownDocumentProvider { @@ -87,7 +88,7 @@ class VSCodeWorkspaceMarkdownDocumentProvider implements WorkspaceMarkdownDocume export default class MarkdownWorkspaceSymbolProvider implements vscode.WorkspaceSymbolProvider { - private _symbolCache = new Map>(); + private _symbolCache = new Map>>(); private _symbolCachePopulated: boolean = false; private _disposables: vscode.Disposable[] = []; @@ -106,7 +107,7 @@ export default class MarkdownWorkspaceSymbolProvider implements vscode.Workspace this._workspaceMarkdownDocumentProvider.onDidDeleteMarkdownDocument(this.onDidDeleteDocument, this, this._disposables); } - const allSymbolsSets = await Promise.all(Array.from(this._symbolCache.values())); + const allSymbolsSets = await Promise.all(Array.from(this._symbolCache.values()).map(x => x.value)); const allSymbols: vscode.SymbolInformation[] = Array.prototype.concat.apply([], allSymbolsSets); return allSymbols.filter(symbolInformation => symbolInformation.name.toLowerCase().indexOf(query.toLowerCase()) !== -1); } @@ -122,8 +123,10 @@ export default class MarkdownWorkspaceSymbolProvider implements vscode.Workspace disposeAll(this._disposables); } - private getSymbols(document: vscode.TextDocument): Promise { - return this._symbolProvider.provideDocumentSymbols(document); + private getSymbols(document: vscode.TextDocument): Lazy> { + return lazy(async () => { + return this._symbolProvider.provideDocumentSymbols(document); + }); } private onDidChangeDocument(document: vscode.TextDocument) { diff --git a/extensions/markdown-language-features/src/util/lazy.ts b/extensions/markdown-language-features/src/util/lazy.ts new file mode 100644 index 00000000000..aa5effd3d31 --- /dev/null +++ b/extensions/markdown-language-features/src/util/lazy.ts @@ -0,0 +1,39 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +export interface Lazy { + readonly value: T; + readonly hasValue: boolean; + map(f: (x: T) => R): Lazy; +} + +class LazyValue implements Lazy { + private _hasValue: boolean = false; + private _value?: T; + + constructor( + private readonly _getValue: () => T + ) { } + + get value(): T { + if (!this._hasValue) { + this._hasValue = true; + this._value = this._getValue(); + } + return this._value!; + } + + get hasValue(): boolean { + return this._hasValue; + } + + public map(f: (x: T) => R): Lazy { + return new LazyValue(() => f(this.value)); + } +} + +export function lazy(getValue: () => T): Lazy { + return new LazyValue(getValue); +} \ No newline at end of file