diff --git a/.vscode/launch.json b/.vscode/launch.json index 948bb4f25dc..0f9b66cf976 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -36,7 +36,7 @@ "type": "node", "request": "attach", "name": "Attach to Extension Host", - "port": 5870, + "port": 5873, "sourceMaps": true, "outFiles": [ "${workspaceRoot}/out/**/*.js" diff --git a/extensions/typescript/src/features/completionItemProvider.ts b/extensions/typescript/src/features/completionItemProvider.ts index ecd484ba479..da8fe8f087a 100644 --- a/extensions/typescript/src/features/completionItemProvider.ts +++ b/extensions/typescript/src/features/completionItemProvider.ts @@ -275,11 +275,23 @@ export default class TypeScriptCompletionItemProvider implements CompletionItemP } private snippetForFunctionCall(detail: CompletionEntryDetails): SnippetString { - let codeSnippet = detail.name; - const suggestionArgumentNames: string[] = detail.displayParts - .filter(part => part.kind === 'parameterName') - .map((part, i) => `\${${i + 1}:${part.text}}`); + const suggestionArgumentNames: string[] = []; + let parenCount = 0; + for (let i = 0; i < detail.displayParts.length; ++i) { + const part = detail.displayParts[i]; + // Only take top level paren names + if (part.kind === 'parameterName' && parenCount === 1) { + suggestionArgumentNames.push(`\${${i + 1}:${part.text}}`); + } else if (part.kind === 'punctuation') { + if (part.text === '(') { + ++parenCount; + } else if (part.text === ')') { + --parenCount; + } + } + } + let codeSnippet = detail.name; if (suggestionArgumentNames.length > 0) { codeSnippet += '(' + suggestionArgumentNames.join(', ') + ')$0'; } else {