From f1b481a1b61cd0808317b78c9a19acaea1eefa77 Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Fri, 13 Jan 2017 14:08:44 -0800 Subject: [PATCH] Support completions for string literal in rest parameter --- src/compiler/checker.ts | 1 + src/compiler/types.ts | 5 +++++ src/services/completions.ts | 5 +---- tests/cases/fourslash/completionForStringLiteral7.ts | 10 ++++++++++ 4 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 tests/cases/fourslash/completionForStringLiteral7.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index a916e9cbba6..dbb1b53efc1 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -84,6 +84,7 @@ namespace ts { getIndexTypeOfType, getBaseTypes, getTypeFromTypeNode, + getParameterType: getTypeAtPosition, getReturnTypeOfSignature, getNonNullableType, getSymbolsInScope, diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 0906488ea33..23c55aacf26 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -2341,6 +2341,11 @@ namespace ts { getIndexTypeOfType(type: Type, kind: IndexKind): Type; getBaseTypes(type: InterfaceType): ObjectType[]; getReturnTypeOfSignature(signature: Signature): Type; + /** + * Gets the type of a parameter at a given position in a signature. + * Returns `any` if the index is not valid. + */ + /* @internal */ getParameterType(signature: Signature, parameterIndex: number): Type; getNonNullableType(type: Type): Type; getSymbolsInScope(location: Node, meaning: SymbolFlags): Symbol[]; diff --git a/src/services/completions.ts b/src/services/completions.ts index bb5922af9ad..8c0d52b2c34 100644 --- a/src/services/completions.ts +++ b/src/services/completions.ts @@ -204,10 +204,7 @@ namespace ts.Completions { typeChecker.getResolvedSignature(argumentInfo.invocation, candidates); for (const candidate of candidates) { - if (candidate.parameters.length > argumentInfo.argumentIndex) { - const parameter = candidate.parameters[argumentInfo.argumentIndex]; - addStringLiteralCompletionsFromType(typeChecker.getTypeAtLocation(parameter.valueDeclaration), entries); - } + addStringLiteralCompletionsFromType(typeChecker.getParameterType(candidate, argumentInfo.argumentIndex), entries); } if (entries.length) { diff --git a/tests/cases/fourslash/completionForStringLiteral7.ts b/tests/cases/fourslash/completionForStringLiteral7.ts new file mode 100644 index 00000000000..b2d250ac3fd --- /dev/null +++ b/tests/cases/fourslash/completionForStringLiteral7.ts @@ -0,0 +1,10 @@ +/// + +////type T = "foo" | "bar"; +////type U = "oof" | "rab"; +////function f(x: T, ...args: U[]) { }; +////f("/*1*/", "/*2*/", "/*3*/"); + +verify.completionsAt("1", ["foo", "bar"]); +verify.completionsAt("2", ["oof", "rab"]); +verify.completionsAt("3", ["oof", "rab"]);