Skip to content

Commit 511c333

Browse files
committed
get rid of hasMatchingArgument call
1 parent 24cc86a commit 511c333

File tree

5 files changed

+80
-11
lines changed

5 files changed

+80
-11
lines changed

src/compiler/checker.ts

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26740,11 +26740,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2674026740
function hasMatchingArgument(expression: CallExpression | NewExpression, reference: Node) {
2674126741
if (expression.arguments) {
2674226742
for (const argument of expression.arguments) {
26743-
if (
26744-
isOrContainsMatchingReference(reference, argument)
26745-
|| optionalChainContainsReference(argument, reference)
26746-
|| isAccessExpression(argument) && isMatchingReference(reference, argument.expression)
26747-
) {
26743+
if (isOrContainsMatchingReference(reference, argument) || optionalChainContainsReference(argument, reference)) {
2674826744
return true;
2674926745
}
2675026746
}
@@ -28758,12 +28754,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2875828754
}
2875928755

2876028756
function narrowTypeByCallExpression(type: Type, callExpression: CallExpression, assumeTrue: boolean): Type {
28761-
if (hasMatchingArgument(callExpression, reference)) {
28762-
const signature = assumeTrue || !isCallChain(callExpression) ? getEffectsSignature(callExpression) : undefined;
28763-
const predicate = signature && getTypePredicateOfSignature(signature);
28764-
if (predicate && (predicate.kind === TypePredicateKind.This || predicate.kind === TypePredicateKind.Identifier)) {
28765-
return narrowTypeByTypePredicate(type, predicate, callExpression, assumeTrue);
28766-
}
28757+
const signature = assumeTrue || !isCallChain(callExpression) ? getEffectsSignature(callExpression) : undefined;
28758+
const predicate = signature && getTypePredicateOfSignature(signature);
28759+
if (predicate && (predicate.kind === TypePredicateKind.This || predicate.kind === TypePredicateKind.Identifier)) {
28760+
return narrowTypeByTypePredicate(type, predicate, callExpression, assumeTrue);
2876728761
}
2876828762
if (containsMissingType(type) && isAccessExpression(reference) && isPropertyAccessExpression(callExpression.expression)) {
2876928763
const callAccess = callExpression.expression;

tests/baselines/reference/typePredicatesCanNarrowByDiscriminant.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,13 @@ declare function isOneOf<T, U extends T>(item: T, array: readonly U[]): item is
88
if (isOneOf(fruit.kind, ['apple', 'banana'] as const)) {
99
fruit.kind
1010
fruit
11+
}
12+
13+
declare const fruit2: { kind: 'apple'} | { kind: 'banana' } | { kind: 'cherry' }
14+
const kind = fruit2.kind;
15+
if (isOneOf(kind, ['apple', 'banana'] as const)) {
16+
fruit2.kind
17+
fruit2
1118
}
1219

1320
//// [typePredicatesCanNarrowByDiscriminant.js]
@@ -16,3 +23,8 @@ if (isOneOf(fruit.kind, ['apple', 'banana'])) {
1623
fruit.kind;
1724
fruit;
1825
}
26+
var kind = fruit2.kind;
27+
if (isOneOf(kind, ['apple', 'banana'])) {
28+
fruit2.kind;
29+
fruit2;
30+
}

tests/baselines/reference/typePredicatesCanNarrowByDiscriminant.symbols

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,29 @@ if (isOneOf(fruit.kind, ['apple', 'banana'] as const)) {
3535
fruit
3636
>fruit : Symbol(fruit, Decl(typePredicatesCanNarrowByDiscriminant.ts, 1, 13))
3737
}
38+
39+
declare const fruit2: { kind: 'apple'} | { kind: 'banana' } | { kind: 'cherry' }
40+
>fruit2 : Symbol(fruit2, Decl(typePredicatesCanNarrowByDiscriminant.ts, 9, 13))
41+
>kind : Symbol(kind, Decl(typePredicatesCanNarrowByDiscriminant.ts, 9, 23))
42+
>kind : Symbol(kind, Decl(typePredicatesCanNarrowByDiscriminant.ts, 9, 42))
43+
>kind : Symbol(kind, Decl(typePredicatesCanNarrowByDiscriminant.ts, 9, 63))
44+
45+
const kind = fruit2.kind;
46+
>kind : Symbol(kind, Decl(typePredicatesCanNarrowByDiscriminant.ts, 10, 5))
47+
>fruit2.kind : Symbol(kind, Decl(typePredicatesCanNarrowByDiscriminant.ts, 9, 23), Decl(typePredicatesCanNarrowByDiscriminant.ts, 9, 42), Decl(typePredicatesCanNarrowByDiscriminant.ts, 9, 63))
48+
>fruit2 : Symbol(fruit2, Decl(typePredicatesCanNarrowByDiscriminant.ts, 9, 13))
49+
>kind : Symbol(kind, Decl(typePredicatesCanNarrowByDiscriminant.ts, 9, 23), Decl(typePredicatesCanNarrowByDiscriminant.ts, 9, 42), Decl(typePredicatesCanNarrowByDiscriminant.ts, 9, 63))
50+
51+
if (isOneOf(kind, ['apple', 'banana'] as const)) {
52+
>isOneOf : Symbol(isOneOf, Decl(typePredicatesCanNarrowByDiscriminant.ts, 1, 79))
53+
>kind : Symbol(kind, Decl(typePredicatesCanNarrowByDiscriminant.ts, 10, 5))
54+
>const : Symbol(const)
55+
56+
fruit2.kind
57+
>fruit2.kind : Symbol(kind, Decl(typePredicatesCanNarrowByDiscriminant.ts, 9, 23), Decl(typePredicatesCanNarrowByDiscriminant.ts, 9, 42))
58+
>fruit2 : Symbol(fruit2, Decl(typePredicatesCanNarrowByDiscriminant.ts, 9, 13))
59+
>kind : Symbol(kind, Decl(typePredicatesCanNarrowByDiscriminant.ts, 9, 23), Decl(typePredicatesCanNarrowByDiscriminant.ts, 9, 42))
60+
61+
fruit2
62+
>fruit2 : Symbol(fruit2, Decl(typePredicatesCanNarrowByDiscriminant.ts, 9, 13))
63+
}

tests/baselines/reference/typePredicatesCanNarrowByDiscriminant.types

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,33 @@ if (isOneOf(fruit.kind, ['apple', 'banana'] as const)) {
3232
fruit
3333
>fruit : { kind: "apple"; } | { kind: "banana"; }
3434
}
35+
36+
declare const fruit2: { kind: 'apple'} | { kind: 'banana' } | { kind: 'cherry' }
37+
>fruit2 : { kind: 'apple'; } | { kind: 'banana'; } | { kind: 'cherry'; }
38+
>kind : "apple"
39+
>kind : "banana"
40+
>kind : "cherry"
41+
42+
const kind = fruit2.kind;
43+
>kind : "apple" | "banana" | "cherry"
44+
>fruit2.kind : "apple" | "banana" | "cherry"
45+
>fruit2 : { kind: "apple"; } | { kind: "banana"; } | { kind: "cherry"; }
46+
>kind : "apple" | "banana" | "cherry"
47+
48+
if (isOneOf(kind, ['apple', 'banana'] as const)) {
49+
>isOneOf(kind, ['apple', 'banana'] as const) : boolean
50+
>isOneOf : <T, U extends T>(item: T, array: readonly U[]) => item is U
51+
>kind : "apple" | "banana" | "cherry"
52+
>['apple', 'banana'] as const : readonly ["apple", "banana"]
53+
>['apple', 'banana'] : readonly ["apple", "banana"]
54+
>'apple' : "apple"
55+
>'banana' : "banana"
56+
57+
fruit2.kind
58+
>fruit2.kind : "apple" | "banana"
59+
>fruit2 : { kind: "apple"; } | { kind: "banana"; }
60+
>kind : "apple" | "banana"
61+
62+
fruit2
63+
>fruit2 : { kind: "apple"; } | { kind: "banana"; }
64+
}

tests/cases/compiler/typePredicatesCanNarrowByDiscriminant.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,11 @@ declare function isOneOf<T, U extends T>(item: T, array: readonly U[]): item is
77
if (isOneOf(fruit.kind, ['apple', 'banana'] as const)) {
88
fruit.kind
99
fruit
10+
}
11+
12+
declare const fruit2: { kind: 'apple'} | { kind: 'banana' } | { kind: 'cherry' }
13+
const kind = fruit2.kind;
14+
if (isOneOf(kind, ['apple', 'banana'] as const)) {
15+
fruit2.kind
16+
fruit2
1017
}

0 commit comments

Comments
 (0)