Skip to content

Commit

Permalink
fix(completions): don't insert call snippet if already a call (#646)
Browse files Browse the repository at this point in the history
  • Loading branch information
jadestrong committed Dec 27, 2022
1 parent 1116235 commit 5d34de5
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 18 deletions.
36 changes: 19 additions & 17 deletions src/completion.ts
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,7 @@ function asCommitCharacters(kind: ScriptElementKind): string[] | undefined {
export async function asResolvedCompletionItem(
item: lsp.CompletionItem,
details: tsp.CompletionEntryDetails,
document: LspDocument | undefined,
client: TspClient,
filePathConverter: IFilePathToResourceConverter,
options: WorkspaceConfigurationCompletionOptions,
Expand All @@ -234,10 +235,11 @@ export async function asResolvedCompletionItem(
item.additionalTextEdits = asAdditionalTextEdits(details.codeActions, filepath);
item.command = asCommand(details.codeActions, item.data.file);
}
if (features.completionSnippets && canCreateSnippetOfFunctionCall(item.kind, options)) {

if (document && features.completionSnippets && canCreateSnippetOfFunctionCall(item.kind, options)) {
const { line, offset } = item.data;
const position = Position.fromLocation({ line, offset });
const shouldCompleteFunction = await isValidFunctionCompletionContext(filepath, position, client);
const shouldCompleteFunction = await isValidFunctionCompletionContext(filepath, position, client, document);
if (shouldCompleteFunction) {
createSnippetOfFunctionCall(item, details);
}
Expand All @@ -246,29 +248,29 @@ export async function asResolvedCompletionItem(
return item;
}

async function isValidFunctionCompletionContext(filepath: string, position: lsp.Position, client: TspClient): Promise<boolean> {
async function isValidFunctionCompletionContext(filepath: string, position: lsp.Position, client: TspClient, document: LspDocument): Promise<boolean> {
// Workaround for https://github.com/Microsoft/TypeScript/issues/12677
// Don't complete function calls inside of destructive assigments or imports
try {
const args: tsp.FileLocationRequestArgs = Position.toFileLocationRequestArgs(filepath, position);
const response = await client.request(tsp.CommandTypes.Quickinfo, args);
if (response.type !== 'response') {
return true;
}

const { body } = response;
switch (body?.kind) {
case 'var':
case 'let':
case 'const':
case 'alias':
return false;
default:
return true;
if (response.type === 'response' && response.body) {
switch (response.body.kind) {
case 'var':
case 'let':
case 'const':
case 'alias':
return false;
}
}
} catch {
return true;
// Noop
}

// Don't complete function call if there is already something that looks like a function call
// https://github.com/microsoft/vscode/issues/18131
const after = document.getLine(position.line).slice(position.character);
return after.match(/^[a-z_$0-9]*\s*\(/gi) === null;
}

function canCreateSnippetOfFunctionCall(kind: lsp.CompletionItemKind | undefined, options: WorkspaceConfigurationCompletionOptions): boolean {
Expand Down
3 changes: 2 additions & 1 deletion src/lsp-server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -632,13 +632,14 @@ export class LspServer {

async completionResolve(item: lsp.CompletionItem): Promise<lsp.CompletionItem> {
this.logger.log('completion/resolve', item);
const document = item.data?.file ? this.documents.get(item.data.file) : undefined;
await this.configurationManager.configureGloballyFromDocument(item.data.file);
const { body } = await this.interuptDiagnostics(() => this.tspClient.request(CommandTypes.CompletionDetails, item.data));
const details = body?.length && body[0];
if (!details) {
return item;
}
return asResolvedCompletionItem(item, details, this.tspClient, this.documents, this.configurationManager.workspaceConfiguration.completions || {}, this.features);
return asResolvedCompletionItem(item, details, document, this.tspClient, this.documents, this.configurationManager.workspaceConfiguration.completions || {}, this.features);
}

async hover(params: lsp.TextDocumentPositionParams): Promise<lsp.Hover> {
Expand Down

0 comments on commit 5d34de5

Please sign in to comment.