@@ -11672,8 +11672,8 @@ namespace ts {
11672
11672
}
11673
11673
11674
11674
function checkTypeRelatedToAndOptionallyElaborate(source: Type, target: Type, relation: Map<RelationComparisonResult>, errorNode: Node | undefined, expr: Expression | undefined, headMessage?: DiagnosticMessage, containingMessageChain?: () => DiagnosticMessageChain | undefined): boolean;
11675
- function checkTypeRelatedToAndOptionallyElaborate(source: Type, target: Type, relation: Map<RelationComparisonResult>, errorNode: Node | undefined, expr: Expression | undefined, headMessage?: DiagnosticMessage, containingMessageChain?: () => DiagnosticMessageChain | undefined, breakdown?: boolean): [Node, DiagnosticMessageChain] | false;
11676
- function checkTypeRelatedToAndOptionallyElaborate(source: Type, target: Type, relation: Map<RelationComparisonResult>, errorNode: Node | undefined, expr: Expression | undefined, headMessage?: DiagnosticMessage, containingMessageChain?: () => DiagnosticMessageChain | undefined, breakdown?: boolean): boolean | [Node, DiagnosticMessageChain] {
11675
+ function checkTypeRelatedToAndOptionallyElaborate(source: Type, target: Type, relation: Map<RelationComparisonResult>, errorNode: Node | undefined, expr: Expression | undefined, headMessage?: DiagnosticMessage, containingMessageChain?: () => DiagnosticMessageChain | undefined, breakdown?: boolean): [Node, DiagnosticMessageChain, DiagnosticRelatedInformation[]? ] | false;
11676
+ function checkTypeRelatedToAndOptionallyElaborate(source: Type, target: Type, relation: Map<RelationComparisonResult>, errorNode: Node | undefined, expr: Expression | undefined, headMessage?: DiagnosticMessage, containingMessageChain?: () => DiagnosticMessageChain | undefined, breakdown?: boolean): boolean | [Node, DiagnosticMessageChain, DiagnosticRelatedInformation[]? ] {
11677
11677
if (isTypeRelatedTo(source, target, relation)) return breakdown ? false : true;
11678
11678
if (!errorNode || !elaborateError(expr, source, target, relation, headMessage)) {
11679
11679
return checkTypeRelatedTo(source, target, relation, errorNode, headMessage, containingMessageChain, undefined, breakdown);
@@ -12361,7 +12361,7 @@ namespace ts {
12361
12361
containingMessageChain?: () => DiagnosticMessageChain | undefined,
12362
12362
errorOutputContainer?: { error?: Diagnostic },
12363
12363
breakdown?: boolean
12364
- ): false | [Node, DiagnosticMessageChain];
12364
+ ): false | [Node, DiagnosticMessageChain, DiagnosticRelatedInformation[]? ];
12365
12365
/**
12366
12366
* Checks if 'source' is related to 'target' (e.g.: is a assignable to).
12367
12367
* @param source The left-hand-side of the relation.
@@ -12381,7 +12381,7 @@ namespace ts {
12381
12381
containingMessageChain?: () => DiagnosticMessageChain | undefined,
12382
12382
errorOutputContainer?: { error?: Diagnostic },
12383
12383
breakdown?: boolean
12384
- ): boolean | [Node, DiagnosticMessageChain] {
12384
+ ): boolean | [Node, DiagnosticMessageChain, DiagnosticRelatedInformation[]? ] {
12385
12385
let errorInfo: DiagnosticMessageChain | undefined;
12386
12386
let relatedInfo: [DiagnosticRelatedInformation, ...DiagnosticRelatedInformation[]] | undefined;
12387
12387
let maybeKeys: string[];
@@ -12421,7 +12421,7 @@ namespace ts {
12421
12421
}
12422
12422
}
12423
12423
if (breakdown) {
12424
- return [errorNode!, errorInfo];
12424
+ return [errorNode!, errorInfo, relatedInfo ? [...(relatedInformation || []), ...relatedInfo]: relatedInformation ];
12425
12425
}
12426
12426
const diag = createDiagnosticForNodeFromMessageChain(errorNode!, errorInfo, relatedInformation);
12427
12427
if (relatedInfo) {
@@ -21129,9 +21129,6 @@ namespace ts {
21129
21129
return checkTypeRelatedToAndOptionallyElaborate(attributesType, paramType, relation, reportErrors ? node.tagName : undefined, node.attributes, undefined, undefined, /*breakdown*/ true);
21130
21130
}
21131
21131
21132
- // TODO: This function is only used in overload resolution; it should instead return a [errorNode, messageChain] pair if there is a failure and undefined if not
21133
- // The first-round callers can used undefined=pass and the second-round callers can build their own errors from the pair.
21134
- // TODO: Still need to thread BREAKDOWN through checkTypeRealtedToAndOptionallyElaborate and all other checkType calls
21135
21132
function getSignatureApplicabilityError(
21136
21133
node: CallLikeExpression,
21137
21134
args: ReadonlyArray<Expression>,
@@ -21518,19 +21515,19 @@ namespace ts {
21518
21515
chain = chainDiagnosticMessages(chain, Diagnostics.Failed_to_find_a_suitable_overload_for_this_call_from_0_overloads, candidatesForArgumentError.length);
21519
21516
}
21520
21517
const r = getSignatureApplicabilityError(node, args, last, assignableRelation, CheckMode.Normal, /*reportErrors*/ true, () => chain);
21521
- Debug.assert(!!r && !!r[0]);
21518
+ Debug.assert(!!r && !!r[0], "No error for last signature" );
21522
21519
if (r) {
21523
- diagnostics.add(createDiagnosticForNodeFromMessageChain(r[0], r[1], undefined ));
21520
+ diagnostics.add(createDiagnosticForNodeFromMessageChain(...r ));
21524
21521
}
21525
21522
}
21526
21523
else {
21527
21524
const related: DiagnosticRelatedInformation[] = [];
21528
21525
for (const c of candidatesForArgumentError) {
21529
21526
const chain = chainDiagnosticMessages(undefined, Diagnostics.Overload_0_gave_the_following_error, signatureToString(c));
21530
21527
const r = getSignatureApplicabilityError(node, args, c, assignableRelation, CheckMode.Normal, /*reportErrors*/ true, () => chain);
21531
- Debug.assert(!!r && !!r[0]);
21528
+ Debug.assert(!!r && !!r[0], "No error for signature (1)" );
21532
21529
if (r) {
21533
- related.push(createDiagnosticForNodeFromMessageChain(r[0], r[1] ));
21530
+ related.push(createDiagnosticForNodeFromMessageChain(...r ));
21534
21531
}
21535
21532
}
21536
21533
diagnostics.add(createDiagnosticForNodeFromMessageChain(node, chainDiagnosticMessages(undefined, Diagnostics.Failed_to_find_a_suitable_overload_for_this_call_from_0_overloads, candidatesForArgumentError.length), related));
0 commit comments