Skip to content

Commit 0cc19c6

Browse files
committed
FSDjkl;afsdjklsfdjksdfkjjk
1 parent 44434a3 commit 0cc19c6

File tree

4 files changed

+41
-20
lines changed

4 files changed

+41
-20
lines changed

src/compiler/checker.ts

+23-15
Original file line numberDiff line numberDiff line change
@@ -570,8 +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),
573+
getResolvedSignatureForStringLiteralCompletions: (node, candidatesOutArray, editingArgument) =>
574+
getResolvedSignatureWorker(node, candidatesOutArray, /*argumentCount*/ undefined, CheckMode.Normal, editingArgument),
575575
getResolvedSignatureForSignatureHelp: (node, candidatesOutArray, argumentCount) =>
576576
getResolvedSignatureWorker(node, candidatesOutArray, argumentCount, CheckMode.IsForSignatureHelp),
577577
getExpandedParameters,
@@ -741,29 +741,37 @@ namespace ts {
741741
getMemberOverrideModifierStatus,
742742
};
743743

744-
function getResolvedSignatureWorker(nodeIn: CallLikeExpression, candidatesOutArray: Signature[] | undefined, argumentCount: number | undefined, checkMode: CheckMode, argumentIndex?: number): Signature | undefined {
744+
function getResolvedSignatureWorker(nodeIn: CallLikeExpression, candidatesOutArray: Signature[] | undefined, argumentCount: number | undefined, checkMode: CheckMode, editingArgument?: Node): Signature | undefined {
745745
let node = getParseTreeNode(nodeIn, isCallLikeExpression);
746-
if (node && argumentIndex !== undefined) {
746+
if (node && editingArgument !== undefined) {
747747
const replacementArg = setParentRecursive(factory.createAsExpression(factory.createStringLiteral(""), factory.createKeywordTypeNode(SyntaxKind.UnknownKeyword)), /*incremental*/ false);
748748
switch (node.kind) {
749749
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-
]);
750+
node = factory.updateCallExpression(node, node.expression, node.typeArguments, node.arguments.map(arg => {
751+
return arg === editingArgument ? replacementArg : arg;
752+
}));
753+
setParent(replacementArg, node);
755754
break;
756755
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-
]);
756+
node = factory.updateNewExpression(node, node.expression, node.typeArguments, map(node.arguments, arg => {
757+
return arg === editingArgument ? replacementArg : arg;
758+
}));
759+
setParent(replacementArg, node);
760+
break;
761+
case SyntaxKind.JsxOpeningElement:
762+
case SyntaxKind.JsxSelfClosingElement:
763+
const replacementExpr = factory.createJsxExpression(/*dotDotDotToken*/ undefined, replacementArg);
764+
node = factory.updateJsxOpeningLikeElement(node, node.tagName, node.typeArguments, factory.updateJsxAttributes(node.attributes, map(node.attributes.properties, attr => {
765+
return tryCast(attr, isJsxAttribute)?.initializer === editingArgument
766+
? setParent(factory.updateJsxAttribute(attr as JsxAttribute, (attr as JsxAttribute).name, setParent(replacementExpr, attr)), attr.parent)
767+
: attr;
768+
})));
769+
setParent(replacementArg, replacementExpr);
770+
setParent(node.attributes, node);
762771
break;
763772
default:
764773
Debug.failBadSyntaxKind(node);
765774
}
766-
setParent(replacementArg, node);
767775
setParent(node, nodeIn.parent);
768776
}
769777
apparentArgumentCount = argumentCount;

src/compiler/factory/nodeFactory.ts

+11
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,7 @@ namespace ts {
398398
updateJsxSelfClosingElement,
399399
createJsxOpeningElement,
400400
updateJsxOpeningElement,
401+
updateJsxOpeningLikeElement,
401402
createJsxClosingElement,
402403
updateJsxClosingElement,
403404
createJsxFragment,
@@ -4833,6 +4834,16 @@ namespace ts {
48334834
: node;
48344835
}
48354836

4837+
// @api
4838+
function updateJsxOpeningLikeElement(node: JsxOpeningLikeElement, tagName: JsxTagNameExpression, typeArguments: readonly TypeNode[] | undefined, attributes: JsxAttributes): JsxOpeningLikeElement {
4839+
if (node.kind === SyntaxKind.JsxOpeningElement) {
4840+
return updateJsxOpeningElement(node, tagName, typeArguments, attributes);
4841+
}
4842+
else {
4843+
return updateJsxSelfClosingElement(node, tagName, typeArguments, attributes);
4844+
}
4845+
}
4846+
48364847
// @api
48374848
function createJsxClosingElement(tagName: JsxTagNameExpression) {
48384849
const node = createBaseNode<JsxClosingElement>(SyntaxKind.JsxClosingElement);

src/compiler/types.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -4278,7 +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;
4281+
/* @internal */ getResolvedSignatureForStringLiteralCompletions(node: CallLikeExpression, candidatesOutArray: Signature[], editingArgument: Node): Signature | undefined;
42824282
/* @internal */ getResolvedSignatureForSignatureHelp(node: CallLikeExpression, candidatesOutArray?: Signature[], argumentCount?: number): Signature | undefined;
42834283
/* @internal */ getExpandedParameters(sig: Signature): readonly (readonly Symbol[])[];
42844284
/* @internal */ hasEffectiveRestParameter(sig: Signature): boolean;
@@ -7626,6 +7626,7 @@ namespace ts {
76267626
updateJsxSelfClosingElement(node: JsxSelfClosingElement, tagName: JsxTagNameExpression, typeArguments: readonly TypeNode[] | undefined, attributes: JsxAttributes): JsxSelfClosingElement;
76277627
createJsxOpeningElement(tagName: JsxTagNameExpression, typeArguments: readonly TypeNode[] | undefined, attributes: JsxAttributes): JsxOpeningElement;
76287628
updateJsxOpeningElement(node: JsxOpeningElement, tagName: JsxTagNameExpression, typeArguments: readonly TypeNode[] | undefined, attributes: JsxAttributes): JsxOpeningElement;
7629+
updateJsxOpeningLikeElement(node: JsxOpeningLikeElement, tagName: JsxTagNameExpression, typeArguments: readonly TypeNode[] | undefined, attributes: JsxAttributes): JsxOpeningLikeElement;
76297630
createJsxClosingElement(tagName: JsxTagNameExpression): JsxClosingElement;
76307631
updateJsxClosingElement(node: JsxClosingElement, tagName: JsxTagNameExpression): JsxClosingElement;
76317632
createJsxFragment(openingFragment: JsxOpeningFragment, children: readonly JsxChild[], closingFragment: JsxClosingFragment): JsxFragment;

src/services/stringCompletions.ts

+5-4
Original file line numberDiff line numberDiff line change
@@ -210,12 +210,13 @@ namespace ts.Completions.StringCompletions {
210210

211211
case SyntaxKind.CallExpression:
212212
case SyntaxKind.NewExpression:
213+
case SyntaxKind.JsxAttribute:
213214
if (!isRequireCallArgument(node) && !isImportCall(parent)) {
214-
const argumentInfo = SignatureHelp.getArgumentInfoForCompletions(node, position, sourceFile);
215+
const argumentInfo = SignatureHelp.getArgumentInfoForCompletions(parent.kind === SyntaxKind.JsxAttribute ? parent.parent : node, position, sourceFile);
215216
// Get string literal completions from specialized signatures of the target
216217
// i.e. declare function f(a: 'A');
217218
// f("/*completion position*/")
218-
return argumentInfo ? getStringLiteralCompletionsFromSignature(parent as CallExpression | NewExpression, argumentInfo, typeChecker) : fromContextualType();
219+
return argumentInfo ? getStringLiteralCompletionsFromSignature(argumentInfo, node, typeChecker) : fromContextualType();
219220
}
220221
// falls through (is `require("")` or `require(""` or `import("")`)
221222

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

260-
function getStringLiteralCompletionsFromSignature(node: CallExpression | NewExpression, argumentInfo: SignatureHelp.ArgumentInfoForCompletions, checker: TypeChecker): StringLiteralCompletionsFromTypes {
261+
function getStringLiteralCompletionsFromSignature(argumentInfo: SignatureHelp.ArgumentInfoForCompletions, arg: StringLiteralLike, checker: TypeChecker): StringLiteralCompletionsFromTypes {
261262
let isNewIdentifier = false;
262263

263264
const uniques = new Map<string, true>();
264265
const candidates: Signature[] = [];
265-
checker.getResolvedSignatureForStringLiteralCompletions(node, candidates, argumentInfo.argumentCount, argumentInfo.argumentIndex);
266+
checker.getResolvedSignatureForStringLiteralCompletions(argumentInfo.invocation, candidates, arg);
266267
const types = flatMap(candidates, candidate => {
267268
if (!signatureHasRestParameter(candidate) && argumentInfo.argumentCount > candidate.parameters.length) return;
268269
const type = candidate.getTypeParameterAtPosition(argumentInfo.argumentIndex);

0 commit comments

Comments
 (0)