From 8c7ca99740995aa43301fe50eccee6bd5b676661 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 12 Dec 2024 09:36:15 -0800 Subject: [PATCH] Make sure we sync file config before generating paste edits This could explain why we occasionally see the wrong style of import being generated --- .../src/languageFeatures/copyPaste.ts | 30 +++++++++++-------- .../src/languageFeatures/formatting.ts | 6 ++-- .../src/languageProvider.ts | 2 +- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/extensions/typescript-language-features/src/languageFeatures/copyPaste.ts b/extensions/typescript-language-features/src/languageFeatures/copyPaste.ts index 898e007bdb9..806573db323 100644 --- a/extensions/typescript-language-features/src/languageFeatures/copyPaste.ts +++ b/extensions/typescript-language-features/src/languageFeatures/copyPaste.ts @@ -5,12 +5,13 @@ import * as vscode from 'vscode'; import { DocumentSelector } from '../configuration/documentSelector'; +import { LanguageDescription } from '../configuration/languageDescription'; +import { API } from '../tsServer/api'; +import protocol from '../tsServer/protocol/protocol'; import * as typeConverters from '../typeConverters'; import { ClientCapability, ITypeScriptServiceClient } from '../typescriptService'; +import FileConfigurationManager from './fileConfigurationManager'; import { conditionalRegistration, requireGlobalConfiguration, requireMinVersion, requireSomeCapability } from './util/dependentRegistration'; -import protocol from '../tsServer/protocol/protocol'; -import { API } from '../tsServer/api'; -import { LanguageDescription } from '../configuration/languageDescription'; class CopyMetadata { constructor( @@ -48,6 +49,7 @@ class DocumentPasteProvider implements vscode.DocumentPasteEditProvider { constructor( private readonly _modeId: string, private readonly _client: ITypeScriptServiceClient, + private readonly fileConfigurationManager: FileConfigurationManager, ) { } async prepareDocumentPaste(document: vscode.TextDocument, ranges: readonly vscode.Range[], dataTransfer: vscode.DataTransfer, token: vscode.CancellationToken) { @@ -115,13 +117,17 @@ class DocumentPasteProvider implements vscode.DocumentPasteEditProvider { return; } - const response = await this._client.interruptGetErr(() => this._client.execute('getPasteEdits', { - file, - // TODO: only supports a single paste for now - pastedText: [text], - pasteLocations: ranges.map(typeConverters.Range.toTextSpan), - copiedFrom - }, token)); + const response = await this._client.interruptGetErr(() => { + this.fileConfigurationManager.ensureConfigurationForDocument(document, token); + + return this._client.execute('getPasteEdits', { + file, + // TODO: only supports a single paste for now + pastedText: [text], + pasteLocations: ranges.map(typeConverters.Range.toTextSpan), + copiedFrom + }, token); + }); if (response.type !== 'response' || !response.body?.edits.length || token.isCancellationRequested) { return; } @@ -152,13 +158,13 @@ class DocumentPasteProvider implements vscode.DocumentPasteEditProvider { } } -export function register(selector: DocumentSelector, language: LanguageDescription, client: ITypeScriptServiceClient) { +export function register(selector: DocumentSelector, language: LanguageDescription, client: ITypeScriptServiceClient, fileConfigurationManager: FileConfigurationManager) { return conditionalRegistration([ requireSomeCapability(client, ClientCapability.Semantic), requireMinVersion(client, API.v570), requireGlobalConfiguration(language.id, enabledSettingId), ], () => { - return vscode.languages.registerDocumentPasteEditProvider(selector.semantic, new DocumentPasteProvider(language.id, client), { + return vscode.languages.registerDocumentPasteEditProvider(selector.semantic, new DocumentPasteProvider(language.id, client, fileConfigurationManager), { providedPasteEditKinds: [DocumentPasteProvider.kind], copyMimeTypes: [DocumentPasteProvider.metadataMimeType], pasteMimeTypes: [DocumentPasteProvider.metadataMimeType], diff --git a/extensions/typescript-language-features/src/languageFeatures/formatting.ts b/extensions/typescript-language-features/src/languageFeatures/formatting.ts index 3b31499c37b..575487b502d 100644 --- a/extensions/typescript-language-features/src/languageFeatures/formatting.ts +++ b/extensions/typescript-language-features/src/languageFeatures/formatting.ts @@ -15,7 +15,7 @@ import { conditionalRegistration, requireGlobalConfiguration } from './util/depe class TypeScriptFormattingProvider implements vscode.DocumentRangeFormattingEditProvider, vscode.OnTypeFormattingEditProvider { public constructor( private readonly client: ITypeScriptServiceClient, - private readonly formattingOptionsManager: FileConfigurationManager + private readonly fileConfigurationManager: FileConfigurationManager ) { } public async provideDocumentRangeFormattingEdits( @@ -29,7 +29,7 @@ class TypeScriptFormattingProvider implements vscode.DocumentRangeFormattingEdit return undefined; } - await this.formattingOptionsManager.ensureConfigurationOptions(document, options, token); + await this.fileConfigurationManager.ensureConfigurationOptions(document, options, token); const args = typeConverters.Range.toFormattingRequestArgs(file, range); const response = await this.client.execute('format', args, token); @@ -52,7 +52,7 @@ class TypeScriptFormattingProvider implements vscode.DocumentRangeFormattingEdit return []; } - await this.formattingOptionsManager.ensureConfigurationOptions(document, options, token); + await this.fileConfigurationManager.ensureConfigurationOptions(document, options, token); const args: Proto.FormatOnKeyRequestArgs = { ...typeConverters.Position.toFileLocationRequestArgs(file, position), diff --git a/extensions/typescript-language-features/src/languageProvider.ts b/extensions/typescript-language-features/src/languageProvider.ts index 7b95591604b..feb47f09683 100644 --- a/extensions/typescript-language-features/src/languageProvider.ts +++ b/extensions/typescript-language-features/src/languageProvider.ts @@ -65,7 +65,7 @@ export default class LanguageProvider extends Disposable { import('./languageFeatures/codeLens/implementationsCodeLens').then(provider => this._register(provider.register(selector, this.description, this.client, cachedNavTreeResponse))), import('./languageFeatures/codeLens/referencesCodeLens').then(provider => this._register(provider.register(selector, this.description, this.client, cachedNavTreeResponse))), import('./languageFeatures/completions').then(provider => this._register(provider.register(selector, this.description, this.client, this.typingsStatus, this.fileConfigurationManager, this.commandManager, this.telemetryReporter, this.onCompletionAccepted))), - import('./languageFeatures/copyPaste').then(provider => this._register(provider.register(selector, this.description, this.client))), + import('./languageFeatures/copyPaste').then(provider => this._register(provider.register(selector, this.description, this.client, this.fileConfigurationManager))), import('./languageFeatures/definitions').then(provider => this._register(provider.register(selector, this.client))), import('./languageFeatures/directiveCommentCompletions').then(provider => this._register(provider.register(selector, this.client))), import('./languageFeatures/documentHighlight').then(provider => this._register(provider.register(selector, this.client))),