Skip to content

Commit 94271aa

Browse files
authored
Remove CFA discriminant check restrictions (#36114)
* Remove unnecessary containsMatchingReferenceDiscriminant logic * Accept new baselines
1 parent 79dcd3d commit 94271aa

File tree

3 files changed

+4
-227
lines changed

3 files changed

+4
-227
lines changed

src/compiler/checker.ts

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -18452,32 +18452,6 @@ namespace ts {
1845218452
return false;
1845318453
}
1845418454

18455-
// Return true if target is a property access xxx.yyy, source is a property access xxx.zzz, the declared
18456-
// type of xxx is a union type, and yyy is a property that is possibly a discriminant. We consider a property
18457-
// a possible discriminant if its type differs in the constituents of containing union type, and if every
18458-
// choice is a unit type or a union of unit types.
18459-
function containsMatchingReferenceDiscriminant(source: Node, target: Node) {
18460-
let name;
18461-
return isAccessExpression(target) &&
18462-
containsMatchingReference(source, target.expression) &&
18463-
(name = getAccessedPropertyName(target)) !== undefined &&
18464-
isDiscriminantProperty(getDeclaredTypeOfReference(target.expression), name);
18465-
}
18466-
18467-
function getDeclaredTypeOfReference(expr: Node): Type | undefined {
18468-
if (expr.kind === SyntaxKind.Identifier) {
18469-
return getTypeOfSymbol(getResolvedSymbol(<Identifier>expr));
18470-
}
18471-
if (isAccessExpression(expr)) {
18472-
const type = getDeclaredTypeOfReference(expr.expression);
18473-
if (type) {
18474-
const propName = getAccessedPropertyName(expr);
18475-
return propName !== undefined ? getTypeOfPropertyOfType(type, propName) : undefined;
18476-
}
18477-
}
18478-
return undefined;
18479-
}
18480-
1848118455
function isDiscriminantProperty(type: Type | undefined, name: __String) {
1848218456
if (type && type.flags & TypeFlags.Union) {
1848318457
const prop = getUnionOrIntersectionProperty(<UnionType>type, name);
@@ -19509,9 +19483,6 @@ namespace ts {
1950919483
type = narrowTypeByDiscriminant(type, expr as AccessExpression,
1951019484
t => narrowTypeBySwitchOnDiscriminant(t, flow.switchStatement, flow.clauseStart, flow.clauseEnd));
1951119485
}
19512-
else if (containsMatchingReferenceDiscriminant(reference, expr)) {
19513-
type = declaredType;
19514-
}
1951519486
}
1951619487
return createFlowType(type, isIncomplete(flowType));
1951719488
}
@@ -19696,9 +19667,6 @@ namespace ts {
1969619667
if (isMatchingReferenceDiscriminant(expr, declaredType)) {
1969719668
return narrowTypeByDiscriminant(type, <AccessExpression>expr, t => getTypeWithFacts(t, assumeTrue ? TypeFacts.Truthy : TypeFacts.Falsy));
1969819669
}
19699-
if (containsMatchingReferenceDiscriminant(reference, expr)) {
19700-
return declaredType;
19701-
}
1970219670
return type;
1970319671
}
1970419672

@@ -19758,9 +19726,6 @@ namespace ts {
1975819726
if (isMatchingReferenceDiscriminant(right, declaredType)) {
1975919727
return narrowTypeByDiscriminant(type, <AccessExpression>right, t => narrowTypeByEquality(t, operator, left, assumeTrue));
1976019728
}
19761-
if (containsMatchingReferenceDiscriminant(reference, left) || containsMatchingReferenceDiscriminant(reference, right)) {
19762-
return declaredType;
19763-
}
1976419729
break;
1976519730
case SyntaxKind.InstanceOfKeyword:
1976619731
return narrowTypeByInstanceof(type, expr, assumeTrue);
@@ -20172,9 +20137,6 @@ namespace ts {
2017220137
if (isMatchingReferenceDiscriminant(expr, declaredType)) {
2017320138
return narrowTypeByDiscriminant(type, <AccessExpression>expr, t => getTypeWithFacts(t, assumePresent ? TypeFacts.NEUndefinedOrNull : TypeFacts.EQUndefinedOrNull));
2017420139
}
20175-
if (containsMatchingReferenceDiscriminant(reference, expr)) {
20176-
return declaredType;
20177-
}
2017820140
return type;
2017920141
}
2018020142
}

tests/baselines/reference/discriminantPropertyCheck.errors.txt

Lines changed: 0 additions & 185 deletions
This file was deleted.

tests/baselines/reference/discriminantPropertyCheck.types

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,9 @@ function goo2(x: Item) {
8282

8383
x.foo.length; // Error, intervening discriminant guard
8484
>x.foo.length : number
85-
>x.foo : string | undefined
85+
>x.foo : string
8686
>x : Item1
87-
>foo : string | undefined
87+
>foo : string
8888
>length : number
8989
}
9090
}
@@ -226,9 +226,9 @@ function foo6(x: Item) {
226226

227227
x.foo.length; // Error, intervening discriminant guard
228228
>x.foo.length : number
229-
>x.foo : string | undefined
229+
>x.foo : string
230230
>x : Item1
231-
>foo : string | undefined
231+
>foo : string
232232
>length : number
233233
}
234234
}

0 commit comments

Comments
 (0)