diff --git a/src/vs/workbench/api/electron-browser/mainThreadLanguageFeatures.ts b/src/vs/workbench/api/electron-browser/mainThreadLanguageFeatures.ts index 17a6ee5926b..1638a01d7f2 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadLanguageFeatures.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadLanguageFeatures.ts @@ -265,7 +265,7 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha $registerDocumentLinkProvider(handle: number, selector: vscode.DocumentSelector): TPromise { this._registrations[handle] = modes.LinkProviderRegistry.register(selector, { provideLinks: (model, token) => { - return wireCancellationToken(token, this._proxy.$provideDocumentLinks(handle, model.uri)); + return this._heapService.trackRecursive(wireCancellationToken(token, this._proxy.$provideDocumentLinks(handle, model.uri))); }, resolveLink: (link, token) => { return wireCancellationToken(token, this._proxy.$resolveDocumentLink(handle, link)); diff --git a/src/vs/workbench/api/node/extHostLanguageFeatures.ts b/src/vs/workbench/api/node/extHostLanguageFeatures.ts index fa223101e15..8e0c521684c 100644 --- a/src/vs/workbench/api/node/extHostLanguageFeatures.ts +++ b/src/vs/workbench/api/node/extHostLanguageFeatures.ts @@ -634,10 +634,12 @@ class SignatureHelpAdapter { class LinkProviderAdapter { private _documents: ExtHostDocuments; + private _heapService: ExtHostHeapService; private _provider: vscode.DocumentLinkProvider; - constructor(documents: ExtHostDocuments, provider: vscode.DocumentLinkProvider) { + constructor(documents: ExtHostDocuments, heapService: ExtHostHeapService, provider: vscode.DocumentLinkProvider) { this._documents = documents; + this._heapService = heapService; this._provider = provider; } @@ -645,23 +647,37 @@ class LinkProviderAdapter { const doc = this._documents.getDocumentData(resource).document; return asWinJsPromise(token => this._provider.provideDocumentLinks(doc, token)).then(links => { - if (Array.isArray(links)) { - return links.map(TypeConverters.DocumentLink.from); + if (!Array.isArray(links)) { + return undefined; } - return undefined; + const result: modes.ILink[] = []; + for (const link of links) { + let data = TypeConverters.DocumentLink.from(link); + let id = this._heapService.keep(link); + ObjectIdentifier.mixin(data, id); + result.push(data); + } + return result; }); } resolveLink(link: modes.ILink): TPromise { - if (typeof this._provider.resolveDocumentLink === 'function') { - return asWinJsPromise(token => this._provider.resolveDocumentLink(TypeConverters.DocumentLink.to(link), token)).then(value => { - if (value) { - return TypeConverters.DocumentLink.from(value); - } - return undefined; - }); + if (typeof this._provider.resolveDocumentLink !== 'function') { + return undefined; } - return undefined; + + const id = ObjectIdentifier.of(link); + const item = this._heapService.get(id); + if (!item) { + return undefined; + } + + return asWinJsPromise(token => this._provider.resolveDocumentLink(item, token)).then(value => { + if (value) { + return TypeConverters.DocumentLink.from(value); + } + return undefined; + }); } } @@ -993,7 +1009,7 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { registerDocumentLinkProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentLinkProvider): vscode.Disposable { const handle = this._nextHandle(); - this._adapter.set(handle, new LinkProviderAdapter(this._documents, provider)); + this._adapter.set(handle, new LinkProviderAdapter(this._documents, this._heapService, provider)); this._proxy.$registerDocumentLinkProvider(handle, selector); return this._createDisposable(handle); }