Make sure we sync file config before generating paste edits

This could explain why we occasionally see the wrong style of import being generated
This commit is contained in:
Matt Bierner
2024-12-12 09:36:15 -08:00
parent a897802b2d
commit 8c7ca99740
3 changed files with 22 additions and 16 deletions

View File

@@ -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],

View File

@@ -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),

View File

@@ -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))),