diff --git a/extensions/typescript-language-features/src/utils/snippetForFunctionCall.ts b/extensions/typescript-language-features/src/utils/snippetForFunctionCall.ts index 408a27b9caf..7167b8b6429 100644 --- a/extensions/typescript-language-features/src/utils/snippetForFunctionCall.ts +++ b/extensions/typescript-language-features/src/utils/snippetForFunctionCall.ts @@ -52,37 +52,47 @@ function getParameterListParts( let isInMethod = false; let hasOptionalParameters = false; let parenCount = 0; - for (let i = 0; i < displayParts.length; ++i) { + + outer: for (let i = 0; i < displayParts.length; ++i) { const part = displayParts[i]; - if ((part.kind === PConst.DisplayPartKind.methodName || part.kind === PConst.DisplayPartKind.functionName || part.kind === PConst.DisplayPartKind.text) && part.text === label) { - if (parenCount === 0) { - isInMethod = true; - } - } - if (part.kind === PConst.DisplayPartKind.parameterName && parenCount === 1 && isInMethod) { - // Only take top level paren names - const next = displayParts[i + 1]; - // Skip optional parameters - const nameIsFollowedByOptionalIndicator = next && next.text === '?'; - if (!nameIsFollowedByOptionalIndicator) { - parts.push(part); - } - hasOptionalParameters = hasOptionalParameters || nameIsFollowedByOptionalIndicator; - } - else if (part.kind === PConst.DisplayPartKind.punctuation) { - if (part.text === '(') { - ++parenCount; - } else if (part.text === ')') { - --parenCount; - if (parenCount <= 0 && isInMethod) { - break; + switch (part.kind) { + case PConst.DisplayPartKind.methodName: + case PConst.DisplayPartKind.functionName: + case PConst.DisplayPartKind.text: + if (part.text === label && parenCount === 0) { + isInMethod = true; + } + break; + + case PConst.DisplayPartKind.parameterName: + if (parenCount === 1 && isInMethod) { + // Only take top level paren names + const next = displayParts[i + 1]; + // Skip optional parameters + const nameIsFollowedByOptionalIndicator = next && next.text === '?'; + if (!nameIsFollowedByOptionalIndicator) { + parts.push(part); + } + hasOptionalParameters = hasOptionalParameters || nameIsFollowedByOptionalIndicator; + } + break; + + case PConst.DisplayPartKind.punctuation: + if (part.text === '(') { + ++parenCount; + } else if (part.text === ')') { + --parenCount; + if (parenCount <= 0 && isInMethod) { + break outer; + } + } else if (part.text === '...' && parenCount === 1) { + // Found rest parmeter. Do not fill in any further arguments + hasOptionalParameters = true; + break outer; } - } else if (part.text === '...' && parenCount === 1) { - // Found rest parmeter. Do not fill in any further arguments - hasOptionalParameters = true; break; - } } } + return { hasOptionalParameters, parts }; }