Skip to content

Commit 3b9bd27

Browse files
committed
Try something
1 parent c13d850 commit 3b9bd27

File tree

4 files changed

+45
-8
lines changed

4 files changed

+45
-8
lines changed

src/compiler/checker.ts

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -570,6 +570,8 @@ namespace ts {
570570
getFullyQualifiedName,
571571
getResolvedSignature: (node, candidatesOutArray, argumentCount) =>
572572
getResolvedSignatureWorker(node, candidatesOutArray, argumentCount, CheckMode.Normal),
573+
getResolvedSignatureForStringLiteralCompletions: (node, candidatesOutArray, argumentCount, argumentIndex) =>
574+
getResolvedSignatureWorker(node, candidatesOutArray, argumentCount, CheckMode.Normal, argumentIndex),
573575
getResolvedSignatureForSignatureHelp: (node, candidatesOutArray, argumentCount) =>
574576
getResolvedSignatureWorker(node, candidatesOutArray, argumentCount, CheckMode.IsForSignatureHelp),
575577
getExpandedParameters,
@@ -739,8 +741,31 @@ namespace ts {
739741
getMemberOverrideModifierStatus,
740742
};
741743

742-
function getResolvedSignatureWorker(nodeIn: CallLikeExpression, candidatesOutArray: Signature[] | undefined, argumentCount: number | undefined, checkMode: CheckMode): Signature | undefined {
743-
const node = getParseTreeNode(nodeIn, isCallLikeExpression);
744+
function getResolvedSignatureWorker(nodeIn: CallLikeExpression, candidatesOutArray: Signature[] | undefined, argumentCount: number | undefined, checkMode: CheckMode, argumentIndex?: number): Signature | undefined {
745+
let node = getParseTreeNode(nodeIn, isCallLikeExpression);
746+
if (node && argumentIndex !== undefined) {
747+
const replacementArg = setParentRecursive(factory.createAsExpression(factory.createStringLiteral(""), factory.createKeywordTypeNode(SyntaxKind.UnknownKeyword)), /*incremental*/ false);
748+
switch (node.kind) {
749+
case SyntaxKind.CallExpression:
750+
node = factory.updateCallExpression(node, node.expression, node.typeArguments, [
751+
...node.arguments.slice(0, argumentIndex),
752+
replacementArg,
753+
...node.arguments.slice(argumentIndex + 1),
754+
]);
755+
break;
756+
case SyntaxKind.NewExpression:
757+
node = factory.updateNewExpression(node, node.expression, node.typeArguments, [
758+
...node.arguments?.slice(0, argumentIndex) || emptyArray,
759+
replacementArg,
760+
...node.arguments?.slice(argumentIndex + 1) || emptyArray,
761+
]);
762+
break;
763+
default:
764+
Debug.failBadSyntaxKind(node);
765+
}
766+
setParent(replacementArg, node);
767+
setParent(node, nodeIn.parent);
768+
}
744769
apparentArgumentCount = argumentCount;
745770
const res = node ? getResolvedSignature(node, candidatesOutArray, checkMode) : undefined;
746771
apparentArgumentCount = undefined;

src/compiler/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4278,6 +4278,7 @@ namespace ts {
42784278
* @param argumentCount Apparent number of arguments, passed in case of a possibly incomplete call. This should come from an ArgumentListInfo. See `signatureHelp.ts`.
42794279
*/
42804280
getResolvedSignature(node: CallLikeExpression, candidatesOutArray?: Signature[], argumentCount?: number): Signature | undefined;
4281+
/* @internal */ getResolvedSignatureForStringLiteralCompletions(node: CallExpression | NewExpression, candidatesOutArray: Signature[], argumentCount: number, argumentIndex: number): Signature | undefined;
42814282
/* @internal */ getResolvedSignatureForSignatureHelp(node: CallLikeExpression, candidatesOutArray?: Signature[], argumentCount?: number): Signature | undefined;
42824283
/* @internal */ getExpandedParameters(sig: Signature): readonly (readonly Symbol[])[];
42834284
/* @internal */ hasEffectiveRestParameter(sig: Signature): boolean;

src/services/stringCompletions.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ namespace ts.Completions.StringCompletions {
215215
// Get string literal completions from specialized signatures of the target
216216
// i.e. declare function f(a: 'A');
217217
// f("/*completion position*/")
218-
return argumentInfo ? getStringLiteralCompletionsFromSignature(argumentInfo, typeChecker) : fromContextualType();
218+
return argumentInfo ? getStringLiteralCompletionsFromSignature(parent as CallExpression | NewExpression, argumentInfo, typeChecker) : fromContextualType();
219219
}
220220
// falls through (is `require("")` or `require(""` or `import("")`)
221221

@@ -257,12 +257,12 @@ namespace ts.Completions.StringCompletions {
257257
type !== current && isLiteralTypeNode(type) && isStringLiteral(type.literal) ? type.literal.text : undefined);
258258
}
259259

260-
function getStringLiteralCompletionsFromSignature(argumentInfo: SignatureHelp.ArgumentInfoForCompletions, checker: TypeChecker): StringLiteralCompletionsFromTypes {
260+
function getStringLiteralCompletionsFromSignature(node: CallExpression | NewExpression, argumentInfo: SignatureHelp.ArgumentInfoForCompletions, checker: TypeChecker): StringLiteralCompletionsFromTypes {
261261
let isNewIdentifier = false;
262262

263263
const uniques = new Map<string, true>();
264264
const candidates: Signature[] = [];
265-
checker.getResolvedSignature(argumentInfo.invocation, candidates, argumentInfo.argumentCount);
265+
checker.getResolvedSignatureForStringLiteralCompletions(node, candidates, argumentInfo.argumentCount, argumentInfo.argumentIndex);
266266
const types = flatMap(candidates, candidate => {
267267
if (!signatureHasRestParameter(candidate) && argumentInfo.argumentCount > candidate.parameters.length) return;
268268
const type = candidate.getTypeParameterAtPosition(argumentInfo.argumentIndex);
Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,25 @@
11
/// <reference path="fourslash.ts" />
22

3+
// @allowJs: true
4+
5+
// @Filename: /a.tsx
36
//// interface Events {
7+
//// "": any;
48
//// drag: any;
59
//// dragenter: any;
610
//// }
711
//// declare function addListener<K extends keyof Events>(type: K, listener: (ev: Events[K]) => any): void;
812
//// declare function addListener(type: string, listener: (ev: any) => any): void;
913
////
10-
//// addListener("/**/");
14+
//// declare function ListenerComponent<K extends keyof Events>(props: { type: K, onWhatever: (ev: Events[K]) => void }): JSX.Element;
15+
////
16+
//// addListener("/*ts*/");
17+
//// (<ListenerComponent type="/*tsx*/" />);
18+
19+
// @Filename: /b.js
20+
//// addListener("/*js*/");
1121

12-
verify.completions({ marker: "", isNewIdentifierLocation: true, exact: ["drag", "dragenter"] });
22+
verify.completions({ marker: ["ts", "js"], isNewIdentifierLocation: true, exact: ["", "drag", "dragenter"] });
23+
verify.completions({ marker: "tsx", exact: ["", "drag", "dragenter"] });
1324
edit.insert("drag");
14-
verify.completions({ isNewIdentifierLocation: true, exact: ["drag", "dragenter"] });
25+
verify.completions({ isNewIdentifierLocation: true, exact: ["", "drag", "dragenter"] });

0 commit comments

Comments
 (0)