From e8f34f3e53d6a9fdf7dd537b8c30c366e8966bbd Mon Sep 17 00:00:00 2001 From: paranoidjk Date: Sun, 26 Sep 2021 14:20:55 +0800 Subject: [PATCH 1/3] 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; From f2e2b1d3a4ea818cf2f14bf8b0f0accabe45abf6 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 8 Oct 2021 16:19:21 +0200 Subject: [PATCH 2/3] Always instantiate `.d.ts` models as `typescript` --- src/languageFeatures.ts | 9 +++------ src/tsMode.ts | 2 +- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/languageFeatures.ts b/src/languageFeatures.ts index ad566aa3..6a1add50 100644 --- a/src/languageFeatures.ts +++ b/src/languageFeatures.ts @@ -98,10 +98,7 @@ export class LibFiles { private _hasFetchedLibFiles: boolean; private _fetchLibFilesPromise: Promise | null; - constructor( - private readonly modeId: string, - private readonly _worker: (...uris: Uri[]) => Promise - ) { + constructor(private readonly _worker: (...uris: Uri[]) => Promise) { this._libFiles = {}; this._hasFetchedLibFiles = false; this._fetchLibFilesPromise = null; @@ -123,7 +120,7 @@ export class LibFiles { return model; } if (this.isLibFile(uri) && this._hasFetchedLibFiles) { - return editor.createModel(this._libFiles[uri.path.slice(1)], this.modeId, uri); + return editor.createModel(this._libFiles[uri.path.slice(1)], 'typescript', uri); } const extraLibs = typescriptDefaults.getExtraLibs(); const extraLibPaths = Object.keys(extraLibs); @@ -131,7 +128,7 @@ export class LibFiles { const currentPath = extraLibPaths[i]; const currentUri = Uri.parse(currentPath); if (currentUri.path === uri.path) { - return editor.createModel(extraLibs[currentPath].content, this.modeId, uri); + return editor.createModel(extraLibs[currentPath].content, 'typescript', uri); } } return null; diff --git a/src/tsMode.ts b/src/tsMode.ts index 1a57d547..9ebf59cf 100644 --- a/src/tsMode.ts +++ b/src/tsMode.ts @@ -50,7 +50,7 @@ function setupMode( return client.getLanguageServiceWorker(...uris); }; - const libFiles = new languageFeatures.LibFiles(modeId, worker); + const libFiles = new languageFeatures.LibFiles(worker); languages.registerCompletionItemProvider(modeId, new languageFeatures.SuggestAdapter(worker)); languages.registerSignatureHelpProvider( From 215112db6d0c43b9fd1e46a47f900f4f6e83dab0 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 8 Oct 2021 16:45:48 +0200 Subject: [PATCH 3/3] Avoid `Uri.parse` for fileName equality --- src/languageFeatures.ts | 34 +++++++++++++--------------------- 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/src/languageFeatures.ts b/src/languageFeatures.ts index 6a1add50..46efc82c 100644 --- a/src/languageFeatures.ts +++ b/src/languageFeatures.ts @@ -114,7 +114,8 @@ export class LibFiles { return false; } - public getOrCreateModel(uri: Uri): editor.ITextModel | null { + public getOrCreateModel(fileName: string): editor.ITextModel | null { + const uri = Uri.parse(fileName); const model = editor.getModel(uri); if (model) { return model; @@ -122,14 +123,9 @@ export class LibFiles { if (this.isLibFile(uri) && this._hasFetchedLibFiles) { return editor.createModel(this._libFiles[uri.path.slice(1)], 'typescript', 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, 'typescript', uri); - } + const matchedLibFile = typescriptDefaults.getExtraLibs()[fileName]; + if (matchedLibFile) { + return editor.createModel(matchedLibFile.content, 'typescript', uri); } return null; } @@ -390,8 +386,7 @@ export class DiagnosticsAdapter extends Adapter { relatedInformation.forEach((info) => { let relatedResource: editor.ITextModel | null = model; if (info.file) { - const relatedResourceUri = Uri.parse(info.file.fileName); - relatedResource = this._libFiles.getOrCreateModel(relatedResourceUri); + relatedResource = this._libFiles.getOrCreateModel(info.file.fileName); } if (!relatedResource) { @@ -796,11 +791,10 @@ export class DefinitionAdapter extends Adapter { const result: languages.Location[] = []; for (let entry of entries) { - const uri = Uri.parse(entry.fileName); - const refModel = this._libFiles.getOrCreateModel(uri); + const refModel = this._libFiles.getOrCreateModel(entry.fileName); if (refModel) { result.push({ - uri: uri, + uri: refModel.uri, range: this._textSpanToRange(refModel, entry.textSpan) }); } @@ -850,11 +844,10 @@ export class ReferenceAdapter extends Adapter implements languages.ReferenceProv const result: languages.Location[] = []; for (let entry of entries) { - const uri = Uri.parse(entry.fileName); - const refModel = this._libFiles.getOrCreateModel(uri); + const refModel = this._libFiles.getOrCreateModel(entry.fileName); if (refModel) { result.push({ - uri: uri, + uri: refModel.uri, range: this._textSpanToRange(refModel, entry.textSpan) }); } @@ -1209,18 +1202,17 @@ 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 = this._libFiles.getOrCreateModel(resource); + const model = this._libFiles.getOrCreateModel(renameLocation.fileName); if (model) { edits.push({ - resource, + resource: model.uri, edit: { range: this._textSpanToRange(model, renameLocation.textSpan), text: newName } }); } else { - throw new Error(`Unknown URI ${resource}.`); + throw new Error(`Unknown file ${renameLocation.fileName}.`); } }