From 42f0109569e52e51e403528de5fe74a83b25735b Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 13 Sep 2016 11:25:53 +0200 Subject: [PATCH] use heapService for workspace symbol provider, #11455 --- .../api/node/extHostLanguageFeatures.ts | 45 ++++++++----------- .../api/node/mainThreadLanguageFeatures.ts | 7 ++- 2 files changed, 25 insertions(+), 27 deletions(-) diff --git a/src/vs/workbench/api/node/extHostLanguageFeatures.ts b/src/vs/workbench/api/node/extHostLanguageFeatures.ts index 02b6c218188..048d4738bd7 100644 --- a/src/vs/workbench/api/node/extHostLanguageFeatures.ts +++ b/src/vs/workbench/api/node/extHostLanguageFeatures.ts @@ -403,30 +403,25 @@ class OnTypeFormattingAdapter { } } -interface MyWorkspaceSymbol extends IWorkspaceSymbol { - idx: number; -} class NavigateTypeAdapter implements IWorkspaceSymbolProvider { private _provider: vscode.WorkspaceSymbolProvider; - private _cache: vscode.SymbolInformation[]; + private _heapService: ExtHostHeapService; - constructor(provider: vscode.WorkspaceSymbolProvider) { + constructor(provider: vscode.WorkspaceSymbolProvider, heapService: ExtHostHeapService) { this._provider = provider; + this._heapService = heapService; } provideWorkspaceSymbols(search: string): TPromise { - this._cache = []; - return asWinJsPromise(token => this._provider.provideWorkspaceSymbols(search, token)).then(value => { if (Array.isArray(value)) { - this._cache = value; - return value.map((item, idx) => { - const result = TypeConverters.fromSymbolInformation(item); - result.idx = idx; - return result; + return value.map(item => { + const id = this._heapService.keep(item); + const result = TypeConverters.fromSymbolInformation(item); + return ObjectIdentifier.mixin(result, id); }); } }); @@ -435,17 +430,15 @@ class NavigateTypeAdapter implements IWorkspaceSymbolProvider { resolveWorkspaceSymbol(item: IWorkspaceSymbol): TPromise { if (typeof this._provider.resolveWorkspaceSymbol !== 'function') { - return; + return TPromise.as(item); } - const idx = (item).idx; - if(typeof idx !== 'number') { - return; + const symbolInfo = this._heapService.get(ObjectIdentifier.get(item)); + if (symbolInfo) { + return asWinJsPromise(token => this._provider.resolveWorkspaceSymbol(symbolInfo, token)).then(value => { + return value && TypeConverters.fromSymbolInformation(value); + }); } - - return asWinJsPromise(token => this._provider.resolveWorkspaceSymbol(this._cache[idx], token)).then(value => { - return value && TypeConverters.fromSymbolInformation(value); - }); } } @@ -505,9 +498,9 @@ class SuggestAdapter { private _provider: vscode.CompletionItemProvider; private _disposables: { [id: number]: IDisposable[] } = []; - constructor(documents: ExtHostDocuments, heapMonitor: ExtHostHeapService, provider: vscode.CompletionItemProvider) { + constructor(documents: ExtHostDocuments, heapService: ExtHostHeapService, provider: vscode.CompletionItemProvider) { this._documents = documents; - this._heapService = heapMonitor; + this._heapService = heapService; this._provider = provider; } @@ -662,7 +655,7 @@ export class ExtHostLanguageFeatures extends ExtHostLanguageFeaturesShape { private _proxy: MainThreadLanguageFeaturesShape; private _documents: ExtHostDocuments; private _commands: ExtHostCommands; - private _heapMonitor: ExtHostHeapService; + private _heapService: ExtHostHeapService; private _diagnostics: ExtHostDiagnostics; private _adapter: { [handle: number]: Adapter } = Object.create(null); @@ -677,7 +670,7 @@ export class ExtHostLanguageFeatures extends ExtHostLanguageFeaturesShape { this._proxy = threadService.get(MainContext.MainThreadLanguageFeatures); this._documents = documents; this._commands = commands; - this._heapMonitor = heapMonitor; + this._heapService = heapMonitor; this._diagnostics = diagnostics; } @@ -834,7 +827,7 @@ export class ExtHostLanguageFeatures extends ExtHostLanguageFeaturesShape { registerWorkspaceSymbolProvider(provider: vscode.WorkspaceSymbolProvider): vscode.Disposable { const handle = this._nextHandle(); - this._adapter[handle] = new NavigateTypeAdapter(provider); + this._adapter[handle] = new NavigateTypeAdapter(provider, this._heapService); this._proxy.$registerNavigateTypeSupport(handle); return this._createDisposable(handle); } @@ -864,7 +857,7 @@ export class ExtHostLanguageFeatures extends ExtHostLanguageFeaturesShape { registerCompletionItemProvider(selector: vscode.DocumentSelector, provider: vscode.CompletionItemProvider, triggerCharacters: string[]): vscode.Disposable { const handle = this._nextHandle(); - this._adapter[handle] = new SuggestAdapter(this._documents, this._heapMonitor, provider); + this._adapter[handle] = new SuggestAdapter(this._documents, this._heapService, provider); this._proxy.$registerSuggestSupport(handle, selector, triggerCharacters); return this._createDisposable(handle); } diff --git a/src/vs/workbench/api/node/mainThreadLanguageFeatures.ts b/src/vs/workbench/api/node/mainThreadLanguageFeatures.ts index ca3e536223a..3f918cbe1fe 100644 --- a/src/vs/workbench/api/node/mainThreadLanguageFeatures.ts +++ b/src/vs/workbench/api/node/mainThreadLanguageFeatures.ts @@ -155,7 +155,12 @@ export class MainThreadLanguageFeatures extends MainThreadLanguageFeaturesShape $registerNavigateTypeSupport(handle: number): TPromise { this._registrations[handle] = WorkspaceSymbolProviderRegistry.register({ provideWorkspaceSymbols: (search: string): TPromise => { - return this._proxy.$provideWorkspaceSymbols(handle, search); + return this._proxy.$provideWorkspaceSymbols(handle, search).then(result => { + for (const item of result) { + trackGarbageCollection(item, ObjectIdentifier.get(item)); + } + return result; + }); }, resolveWorkspaceSymbol: (item: IWorkspaceSymbol): TPromise => { return this._proxy.$resolveWorkspaceSymbol(handle, item); -- GitLab