Skip to content

Commit 7e2679d

Browse files
chloestefantsovaCommit Queue
authored andcommitted
[cfe] Add function to check sufficiency of type shape checks
Part of #54998 Change-Id: Ib60e8fbce0ca3bef9b12b6a1950b1943ab86bd99 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/354861 Commit-Queue: Chloe Stefantsova <[email protected]> Reviewed-by: Martin Kustermann <[email protected]> Reviewed-by: Johnni Winther <[email protected]>
1 parent 511bffe commit 7e2679d

File tree

6 files changed

+383
-1
lines changed

6 files changed

+383
-1
lines changed

pkg/front_end/test/fasta/type_inference/type_schema_environment_nnbd_test.dart

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// BSD-style license that can be found in the LICENSE file.
44

55
import 'package:kernel/ast.dart';
6+
import 'package:kernel/type_environment.dart';
67
import 'package:test/test.dart';
78
import 'package:test_reflective_loader/test_reflective_loader.dart';
89

@@ -1637,6 +1638,93 @@ class TypeSchemaEnvironmentTest extends TypeSchemaEnvironmentTestBase {
16371638
checkUpperBound(type1: "E5<String>?", type2: "B", upperBound: "A<String>?");
16381639
}
16391640

1641+
void test_typeShapeCheckSufficiency() {
1642+
parseTestLibrary("""
1643+
class A<X>;
1644+
class B extends A<int>;
1645+
class C<Y> extends B;
1646+
1647+
class D<X>;
1648+
class E<Y> extends D<Y>;
1649+
1650+
class F<X>;
1651+
class G<Y, Z> extends F<Y>;
1652+
""");
1653+
1654+
checkTypeShapeCheckSufficiency(
1655+
expressionStaticType: "A<int>",
1656+
checkTargetType: "C<int>",
1657+
typeParameters: "",
1658+
sufficiency: TypeShapeCheckSufficiency.insufficient);
1659+
checkTypeShapeCheckSufficiency(
1660+
expressionStaticType: "A<int>",
1661+
checkTargetType: "C<String>",
1662+
typeParameters: "",
1663+
sufficiency: TypeShapeCheckSufficiency.insufficient);
1664+
checkTypeShapeCheckSufficiency(
1665+
expressionStaticType: "A<int>",
1666+
checkTargetType: "C<dynamic>",
1667+
typeParameters: "",
1668+
sufficiency: TypeShapeCheckSufficiency.interfaceShape);
1669+
checkTypeShapeCheckSufficiency(
1670+
expressionStaticType: "B",
1671+
checkTargetType: "C<int>",
1672+
typeParameters: "",
1673+
sufficiency: TypeShapeCheckSufficiency.insufficient);
1674+
checkTypeShapeCheckSufficiency(
1675+
expressionStaticType: "B",
1676+
checkTargetType: "C<Object?>",
1677+
typeParameters: "",
1678+
sufficiency: TypeShapeCheckSufficiency.interfaceShape);
1679+
1680+
checkTypeShapeCheckSufficiency(
1681+
expressionStaticType: "D<int>",
1682+
checkTargetType: "E<int>",
1683+
typeParameters: "",
1684+
sufficiency: TypeShapeCheckSufficiency.interfaceShape);
1685+
checkTypeShapeCheckSufficiency(
1686+
expressionStaticType: "D<int>",
1687+
checkTargetType: "E<num>",
1688+
typeParameters: "",
1689+
sufficiency: TypeShapeCheckSufficiency.interfaceShape);
1690+
checkTypeShapeCheckSufficiency(
1691+
expressionStaticType: "D<int>",
1692+
checkTargetType: "E<dynamic>",
1693+
typeParameters: "",
1694+
sufficiency: TypeShapeCheckSufficiency.interfaceShape);
1695+
checkTypeShapeCheckSufficiency(
1696+
expressionStaticType: "D<num>",
1697+
checkTargetType: "E<int>",
1698+
typeParameters: "",
1699+
sufficiency: TypeShapeCheckSufficiency.insufficient);
1700+
1701+
checkTypeShapeCheckSufficiency(
1702+
expressionStaticType: "F<int>",
1703+
checkTargetType: "G<int, String>",
1704+
typeParameters: "",
1705+
sufficiency: TypeShapeCheckSufficiency.insufficient);
1706+
checkTypeShapeCheckSufficiency(
1707+
expressionStaticType: "F<int>",
1708+
checkTargetType: "G<num, String>",
1709+
typeParameters: "",
1710+
sufficiency: TypeShapeCheckSufficiency.insufficient);
1711+
checkTypeShapeCheckSufficiency(
1712+
expressionStaticType: "F<int>",
1713+
checkTargetType: "G<dynamic, Object?>",
1714+
typeParameters: "",
1715+
sufficiency: TypeShapeCheckSufficiency.interfaceShape);
1716+
checkTypeShapeCheckSufficiency(
1717+
expressionStaticType: "F<int>",
1718+
checkTargetType: "G<int, Object?>",
1719+
typeParameters: "",
1720+
sufficiency: TypeShapeCheckSufficiency.interfaceShape);
1721+
checkTypeShapeCheckSufficiency(
1722+
expressionStaticType: "F<int>",
1723+
checkTargetType: "G<num, Object?>",
1724+
typeParameters: "",
1725+
sufficiency: TypeShapeCheckSufficiency.interfaceShape);
1726+
}
1727+
16401728
void checkUpperBound(
16411729
{required String type1,
16421730
required String type2,
@@ -1660,4 +1748,22 @@ class TypeSchemaEnvironmentTest extends TypeSchemaEnvironmentTestBase {
16601748
parseType(upperBound));
16611749
});
16621750
}
1751+
1752+
@override
1753+
void checkTypeShapeCheckSufficiency(
1754+
{required String expressionStaticType,
1755+
required String checkTargetType,
1756+
required String typeParameters,
1757+
required TypeShapeCheckSufficiency sufficiency}) {
1758+
typeParserEnvironment.withStructuralParameters(typeParameters,
1759+
(List<StructuralParameter> structuralParameters) {
1760+
expect(
1761+
typeSchemaEnvironment.computeTypeShapeCheckSufficiency(
1762+
expressionStaticType: parseType(expressionStaticType),
1763+
checkTargetType: parseType(checkTargetType),
1764+
subtypeCheckMode: SubtypeCheckMode.withNullabilities) ==
1765+
sufficiency,
1766+
isTrue);
1767+
});
1768+
}
16631769
}

pkg/front_end/test/fasta/type_inference/type_schema_environment_test.dart

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// BSD-style license that can be found in the LICENSE file.
44

55
import 'package:kernel/ast.dart';
6+
import 'package:kernel/type_environment.dart';
67
import 'package:test/test.dart';
78
import 'package:test_reflective_loader/test_reflective_loader.dart';
89

@@ -442,7 +443,7 @@ class TypeSchemaEnvironmentTest extends TypeSchemaEnvironmentTestBase {
442443
parseTestLibrary("""
443444
class A;
444445
class B extends A;
445-
446+
446447
class C<T extends Object*>;
447448
class D<T extends Object*> extends C<T*>;
448449
""");
@@ -557,4 +558,22 @@ class TypeSchemaEnvironmentTest extends TypeSchemaEnvironmentTestBase {
557558
parseType(upperBound));
558559
});
559560
}
561+
562+
@override
563+
void checkTypeShapeCheckSufficiency(
564+
{required String expressionStaticType,
565+
required String checkTargetType,
566+
required String typeParameters,
567+
required TypeShapeCheckSufficiency sufficiency}) {
568+
typeParserEnvironment.withStructuralParameters(typeParameters,
569+
(List<StructuralParameter> structuralParameters) {
570+
expect(
571+
typeSchemaEnvironment.computeTypeShapeCheckSufficiency(
572+
expressionStaticType: parseType(expressionStaticType),
573+
checkTargetType: parseType(checkTargetType),
574+
subtypeCheckMode: SubtypeCheckMode.ignoringNullabilities) ==
575+
sufficiency,
576+
isTrue);
577+
});
578+
}
560579
}

pkg/front_end/test/fasta/type_inference/type_schema_environment_test_base.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import 'package:kernel/ast.dart';
1111
import 'package:kernel/core_types.dart';
1212
import 'package:kernel/class_hierarchy.dart';
1313
import 'package:kernel/testing/type_parser_environment.dart';
14+
import 'package:kernel/type_environment.dart';
1415
import 'package:test/test.dart';
1516

1617
abstract class TypeSchemaEnvironmentTestBase {
@@ -242,6 +243,12 @@ abstract class TypeSchemaEnvironmentTestBase {
242243
});
243244
}
244245

246+
void checkTypeShapeCheckSufficiency(
247+
{required String expressionStaticType,
248+
required String checkTargetType,
249+
required String typeParameters,
250+
required TypeShapeCheckSufficiency sufficiency});
251+
245252
/// Parses a string like "<: T <: S >: R" into a [TypeConstraint].
246253
///
247254
/// The [constraint] string is assumed to be a sequence of bounds added to the

pkg/front_end/test/spell_checking_list_code.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1340,6 +1340,7 @@ pv
13401340
q
13411341
q'i
13421342
qi
1343+
qk
13431344
qm
13441345
quad
13451346
qualify
@@ -1502,6 +1503,7 @@ right's
15021503
rightmost
15031504
ring
15041505
risk
1506+
rk
15051507
rn
15061508
rnystrom
15071509
robust

pkg/front_end/test/spell_checking_list_common.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,7 @@ below
291291
beneficial
292292
benefit
293293
benign
294+
besides
294295
best
295296
bets
296297
better
@@ -1616,6 +1617,7 @@ instruction
16161617
instructions
16171618
instrumentation
16181619
instrumented
1620+
insufficient
16191621
int
16201622
intact
16211623
integer
@@ -2091,6 +2093,7 @@ observed
20912093
obtain
20922094
obtained
20932095
obvious
2096+
obviously
20942097
occur
20952098
occurred
20962099
occurrence
@@ -2560,6 +2563,7 @@ relations
25602563
relationship
25612564
relationships
25622565
relative
2566+
relaxed
25632567
release
25642568
releases
25652569
relevant
@@ -3000,6 +3004,7 @@ successively
30003004
succinct
30013005
such
30023006
suffice
3007+
sufficiency
30033008
sufficient
30043009
sufficiently
30053010
suffix

0 commit comments

Comments
 (0)