From e8f34f3e53d6a9fdf7dd537b8c30c366e8966bbd Mon Sep 17 00:00:00 2001 From: paranoidjk Date: Sun, 26 Sep 2021 14:20:55 +0800 Subject: [PATCH] feat: support find reference to extaLib, treat extraLib as a normal model as well --- src/languageFeatures.ts | 33 +++++++++++++++++++++------------ src/tsMode.ts | 4 ++-- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/languageFeatures.ts b/src/languageFeatures.ts index 17138165..ad566aa3 100644 --- a/src/languageFeatures.ts +++ b/src/languageFeatures.ts @@ -98,7 +98,10 @@ export class LibFiles { private _hasFetchedLibFiles: boolean; private _fetchLibFilesPromise: Promise | null; - constructor(private readonly _worker: (...uris: Uri[]) => Promise) { + constructor( + private readonly modeId: string, + private readonly _worker: (...uris: Uri[]) => Promise + ) { this._libFiles = {}; this._hasFetchedLibFiles = false; this._fetchLibFilesPromise = null; @@ -120,7 +123,16 @@ export class LibFiles { return model; } if (this.isLibFile(uri) && this._hasFetchedLibFiles) { - return editor.createModel(this._libFiles[uri.path.slice(1)], 'typescript', uri); + return editor.createModel(this._libFiles[uri.path.slice(1)], this.modeId, uri); + } + const extraLibs = typescriptDefaults.getExtraLibs(); + const extraLibPaths = Object.keys(extraLibs); + for (let i = 0; i < extraLibPaths.length; i++) { + const currentPath = extraLibPaths[i]; + const currentUri = Uri.parse(currentPath); + if (currentUri.path === uri.path) { + return editor.createModel(extraLibs[currentPath].content, this.modeId, uri); + } } return null; } @@ -794,15 +806,6 @@ export class DefinitionAdapter extends Adapter { uri: uri, range: this._textSpanToRange(refModel, entry.textSpan) }); - } else { - const matchedLibFile = typescriptDefaults.getExtraLibs()[entry.fileName]; - if (matchedLibFile) { - const libModel = editor.createModel(matchedLibFile.content, 'typescript', uri); - return { - uri: uri, - range: this._textSpanToRange(libModel, entry.textSpan) - }; - } } } return result; @@ -1160,6 +1163,12 @@ export class CodeActionAdaptor extends FormatHelper implements languages.CodeAct // --- rename ---- export class RenameAdapter extends Adapter implements languages.RenameProvider { + constructor( + private readonly _libFiles: LibFiles, + worker: (...uris: Uri[]) => Promise + ) { + super(worker); + } public async provideRenameEdits( model: editor.ITextModel, position: Position, @@ -1204,7 +1213,7 @@ export class RenameAdapter extends Adapter implements languages.RenameProvider { const edits: languages.WorkspaceTextEdit[] = []; for (const renameLocation of renameLocations) { const resource = Uri.parse(renameLocation.fileName); - const model = editor.getModel(resource); + const model = this._libFiles.getOrCreateModel(resource); if (model) { edits.push({ resource, diff --git a/src/tsMode.ts b/src/tsMode.ts index 01de0376..1a57d547 100644 --- a/src/tsMode.ts +++ b/src/tsMode.ts @@ -50,7 +50,7 @@ function setupMode( return client.getLanguageServiceWorker(...uris); }; - const libFiles = new languageFeatures.LibFiles(worker); + const libFiles = new languageFeatures.LibFiles(modeId, worker); languages.registerCompletionItemProvider(modeId, new languageFeatures.SuggestAdapter(worker)); languages.registerSignatureHelpProvider( @@ -80,7 +80,7 @@ function setupMode( new languageFeatures.FormatOnTypeAdapter(worker) ); languages.registerCodeActionProvider(modeId, new languageFeatures.CodeActionAdaptor(worker)); - languages.registerRenameProvider(modeId, new languageFeatures.RenameAdapter(worker)); + languages.registerRenameProvider(modeId, new languageFeatures.RenameAdapter(libFiles, worker)); languages.registerInlayHintsProvider(modeId, new languageFeatures.InlayHintsAdapter(worker)); new languageFeatures.DiagnosticsAdapter(libFiles, defaults, modeId, worker); return worker;