Add tests for extension members shadowed in classes.

Adding tests that unqualified identifiers referenced in classes are
looked up and resolved by basename when the same basename is declared
in the class lexical scope and in the external scope via an extension.

Change-Id: I487c082711350118bf1692771bea33b5621f1eca
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/114631
Reviewed-by: Lasse R.H. Nielsen <lrn@google.com>
This commit is contained in:
Leaf Petersen 2019-08-29 21:52:29 +00:00
parent d7c944b4c0
commit d548da74c0
2 changed files with 306 additions and 62 deletions

View file

@ -11,7 +11,7 @@
///////////////////////////////////////////////////////////////////////
int get topLevelGetter => -1;
void set topLevelSetter(int _) => -2;
void set topLevelSetter(int _) {}
int topLevelField = -3;
int topLevelMethod(int x) => -4;
@ -23,7 +23,7 @@ extension E1 on A1 {
int get topLevelMethod => 3;
void test() {
// The instance getter shadows the global setter
topLevelSetter = topLevelSetter+1;
topLevelSetter = topLevelSetter + 1;
// ^^
// [cfe] unspecified
// ^^^^^^^^^^^^^^
@ -33,14 +33,14 @@ extension E1 on A1 {
// [cfe] unspecified
// ^^^^^^^^^^^^^^
// [analyzer] STATIC_WARNING.ASSIGNMENT_TO_FINAL_NO_SETTER
topLevelSetter=0;
topLevelSetter = 0;
// ^^
// [cfe] unspecified
// ^^^^^^^^^^^^^^
// [analyzer] STATIC_WARNING.ASSIGNMENT_TO_FINAL_NO_SETTER
// The instance getter shadows the global field setter
topLevelField = topLevelField+1;
topLevelField = topLevelField + 1;
// ^^
// [cfe] unspecified
// ^^^^^^^^^^^^^
@ -50,7 +50,7 @@ extension E1 on A1 {
// [cfe] unspecified
// ^^^^^^^^^^^^^
// [analyzer] STATIC_WARNING.ASSIGNMENT_TO_FINAL_NO_SETTER
topLevelField=0;
topLevelField = 0;
// ^^
// [cfe] unspecified
// ^^^^^^^^^^^^^
@ -64,6 +64,7 @@ extension E1 on A1 {
// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION
}
}
class A1 {}
// Check that an instance setter in an extension shadows top level
@ -74,7 +75,7 @@ extension E2 on A2 {
void set topLevelMethod(int _) {}
void test() {
// The instance setter shadows the global getter
topLevelGetter = topLevelGetter+1;
topLevelGetter = topLevelGetter + 1;
// ^^
// [analyzer] unspecified
// [cfe] unspecified
@ -89,7 +90,7 @@ extension E2 on A2 {
topLevelGetter = 3;
// The instance setter shadows the global field getter
topLevelField = topLevelField+1;
topLevelField = topLevelField + 1;
// ^^
// [analyzer] unspecified
// [cfe] unspecified
@ -107,9 +108,9 @@ extension E2 on A2 {
// ^^
// [analyzer] unspecified
// [cfe] unspecified
}
}
class A2 {}
// Check that a static getter in an extension shadows top level
@ -120,7 +121,7 @@ extension E3 on A3 {
static int get topLevelMethod => 3;
void test() {
// The static getter shadows the global setter
topLevelSetter = topLevelSetter+1;
topLevelSetter = topLevelSetter + 1;
// ^^
// [cfe] unspecified
// ^^^^^^^^^^^^^^
@ -130,14 +131,14 @@ extension E3 on A3 {
// [cfe] unspecified
// ^^^^^^^^^^^^^^
// [analyzer] STATIC_WARNING.ASSIGNMENT_TO_FINAL_NO_SETTER
topLevelSetter=0;
topLevelSetter = 0;
// ^^
// [cfe] unspecified
// ^^^^^^^^^^^^^^
// [analyzer] STATIC_WARNING.ASSIGNMENT_TO_FINAL_NO_SETTER
// The static getter shadows the global field setter
topLevelField = topLevelField+1;
topLevelField = topLevelField + 1;
// ^^
// [cfe] unspecified
// ^^^^^^^^^^^^^
@ -147,7 +148,7 @@ extension E3 on A3 {
// [cfe] unspecified
// ^^^^^^^^^^^^^
// [analyzer] STATIC_WARNING.ASSIGNMENT_TO_FINAL_NO_SETTER
topLevelField=0;
topLevelField = 0;
// ^^
// [cfe] unspecified
// ^^^^^^^^^^^^^
@ -161,6 +162,7 @@ extension E3 on A3 {
// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION
}
}
class A3 {}
// Check that a static setter in an extension shadows top level
@ -171,7 +173,7 @@ extension E4 on A4 {
static void set topLevelMethod(int _) {}
void test() {
// The static setter shadows the global getter
topLevelGetter = topLevelGetter+1;
topLevelGetter = topLevelGetter + 1;
// ^^
// [analyzer] unspecified
// [cfe] unspecified
@ -185,7 +187,7 @@ extension E4 on A4 {
// [cfe] unspecified
// The static setter shadows the global field getter
topLevelField = topLevelField+1;
topLevelField = topLevelField + 1;
// ^^
// [analyzer] unspecified
// [cfe] unspecified
@ -205,11 +207,12 @@ extension E4 on A4 {
// [cfe] unspecified
}
}
class A4 {}
// Bring extensions on A6 into scope
// Define extensions on A6.
extension E5 on A6 {
void set extensionSetter(int _) => -1;
void set extensionSetter(int _) {};
int extensionMethod(int x) => -3;
}
@ -220,7 +223,7 @@ extension E6 on A6 {
int get extensionMethod => 3;
void test() {
// The instance getter shadows the other extension's setter
extensionSetter = extensionSetter+1;
extensionSetter = extensionSetter + 1;
// ^^
// [cfe] unspecified
// ^^^^^^^^^^^^^^^
@ -230,7 +233,7 @@ extension E6 on A6 {
// [cfe] unspecified
// ^^^^^^^^^^^^^^^
// [analyzer] STATIC_WARNING.ASSIGNMENT_TO_FINAL_NO_SETTER
extensionSetter=0;
extensionSetter = 0;
// ^^
// [cfe] unspecified
// ^^^^^^^^^^^^^^^
@ -244,9 +247,42 @@ extension E6 on A6 {
// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION
}
}
class A6 {}
// Bring extensions on A8 into scope
// Check that an instance getter in a class shadows extension
// members with the same basename from extension E5.
class A7 extends A6 {
int get extensionSetter => 1;
int get extensionMethod => 3;
void test() {
// The instance getter shadows the other extension's setter
extensionSetter = extensionSetter + 1;
// ^^
// [cfe] unspecified
// ^^^^^^^^^^^^^^^
// [analyzer] STATIC_WARNING.ASSIGNMENT_TO_FINAL_NO_SETTER
extensionSetter++;
// ^^
// [cfe] unspecified
// ^^^^^^^^^^^^^^^
// [analyzer] STATIC_WARNING.ASSIGNMENT_TO_FINAL_NO_SETTER
extensionSetter = 0;
// ^^
// [cfe] unspecified
// ^^^^^^^^^^^^^^^
// [analyzer] STATIC_WARNING.ASSIGNMENT_TO_FINAL_NO_SETTER
// The instance getter shadows the other extensions method
extensionMethod(4);
// ^^
// [cfe] unspecified
// ^^^^^^^^^^^^^^^
// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION
}
}
// Define extensions on A8.
extension E7 on A8 {
int get extensionGetter => -1;
int extensionMethod(int x) => -3;
@ -259,7 +295,7 @@ extension E8 on A8 {
void set extensionMethod(int _) {}
void test() {
// The instance setter shadows the other extension's getter
extensionGetter = extensionGetter+1;
extensionGetter = extensionGetter + 1;
// ^^
// [analyzer] unspecified
// [cfe] unspecified
@ -279,16 +315,43 @@ extension E8 on A8 {
// [cfe] unspecified
}
}
class A8 {}
// Check that an instance setter in a class shadows extension
// members with the same basename from extension E7.
class A9 extends A8 {
void set extensionGetter(int _) {}
void set extensionMethod(int _) {}
void test() {
// The instance setter shadows the other extension's getter
extensionGetter = extensionGetter + 1;
// ^^
// [analyzer] unspecified
// [cfe] unspecified
extensionGetter++;
// ^^
// [analyzer] unspecified
// [cfe] unspecified
extensionGetter;
// ^^
// [analyzer] unspecified
// [cfe] unspecified
// Bring extensions on A10 into scope
extension E9 on A10 {
void set extensionSetter(int _) => -1;
void set extensionFieldSetter(int _) => -2;
int extensionMethod(int x) => -3;
// The instance setter shadows the other extension's method.
extensionMethod(4);
// ^^
// [analyzer] unspecified
// [cfe] unspecified
}
}
// Define extensions on A10.
extension E9 on A10 {
void set extensionSetter(int _) {}
void set extensionFieldSetter(int _) {}
int extensionMethod(int x) => -3;
}
// Check that a static getter in an extension shadows extension
// members with the same basename from a different extension.
@ -298,7 +361,7 @@ extension E10 on A10 {
static int get extensionMethod => 3;
void test() {
// The static getter shadows the other extension's setter
extensionSetter = extensionSetter+1;
extensionSetter = extensionSetter + 1;
// ^^
// [cfe] unspecified
// ^^^^^^^^^^^^^^^
@ -308,14 +371,14 @@ extension E10 on A10 {
// [cfe] unspecified
// ^^^^^^^^^^^^^^^
// [analyzer] STATIC_WARNING.ASSIGNMENT_TO_FINAL_NO_SETTER
extensionSetter=0;
extensionSetter = 0;
// ^^
// [cfe] unspecified
// ^^^^^^^^^^^^^^^
// [analyzer] STATIC_WARNING.ASSIGNMENT_TO_FINAL_NO_SETTER
// The static field shadows the other extension's setter
extensionFieldSetter = extensionFieldSetter+1;
extensionFieldSetter = extensionFieldSetter + 1;
// ^^
// [analyzer] unspecified
// [cfe] unspecified
@ -323,7 +386,7 @@ extension E10 on A10 {
// ^^
// [analyzer] unspecified
// [cfe] unspecified
extensionFieldSetter=0;
extensionFieldSetter = 0;
// ^^
// [analyzer] unspecified
// [cfe] unspecified
@ -336,9 +399,57 @@ extension E10 on A10 {
// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION
}
}
class A10 {}
// Bring extensions on A12 into scope
// Check that a static getter in a class shadows extension
// members with the same basename from extension E9.
class A11 extends A10 {
static int get extensionSetter => 1;
static final int extensionFieldSetter = 2;
static int get extensionMethod => 3;
void test() {
// The static getter shadows the other extension's setter
extensionSetter = extensionSetter + 1;
// ^^
// [cfe] unspecified
// ^^^^^^^^^^^^^^^
// [analyzer] STATIC_WARNING.ASSIGNMENT_TO_FINAL_NO_SETTER
extensionSetter++;
// ^^
// [cfe] unspecified
// ^^^^^^^^^^^^^^^
// [analyzer] STATIC_WARNING.ASSIGNMENT_TO_FINAL_NO_SETTER
extensionSetter = 0;
// ^^
// [cfe] unspecified
// ^^^^^^^^^^^^^^^
// [analyzer] STATIC_WARNING.ASSIGNMENT_TO_FINAL_NO_SETTER
// The static field shadows the other extension's setter
extensionFieldSetter = extensionFieldSetter + 1;
// ^^
// [analyzer] unspecified
// [cfe] unspecified
extensionFieldSetter++;
// ^^
// [analyzer] unspecified
// [cfe] unspecified
extensionFieldSetter = 0;
// ^^
// [analyzer] unspecified
// [cfe] unspecified
// The static getter shadows the other extensions method
extensionMethod(4);
// ^^
// [cfe] unspecified
// ^^^^^^^^^^^^^^^
// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION
}
}
// Define extensions on A12.
extension E11 on A12 {
int get extensionGetter => -1;
int extensionMethod(int x) => -3;
@ -351,7 +462,7 @@ extension E12 on A12 {
static void set extensionMethod(int _) {}
void test() {
// The static setter shadows the other extension's getter
extensionGetter = extensionGetter+1;
extensionGetter = extensionGetter + 1;
// ^^
// [analyzer] unspecified
// [cfe] unspecified
@ -371,15 +482,48 @@ extension E12 on A12 {
// [cfe] unspecified
}
}
class A12 {}
// Check that a static setter in a class shadows extension
// members with the same basename from extension E11.
class A13 extends A12 {
static void set extensionGetter(int _) {}
static void set extensionMethod(int _) {}
void test() {
// The static setter shadows the other extension's getter
extensionGetter = extensionGetter + 1;
// ^^
// [analyzer] unspecified
// [cfe] unspecified
extensionGetter++;
// ^^
// [analyzer] unspecified
// [cfe] unspecified
extensionGetter;
// ^^
// [analyzer] unspecified
// [cfe] unspecified
// The static setter shadows the other extension's method.
extensionMethod(4);
// ^^
// [analyzer] unspecified
// [cfe] unspecified
}
}
void main() {
A1().test();
A2().test();
A3().test();
A4().test();
A6().test();
A7().test();
A8().test();
A9().test();
A10().test();
A11().test();
A12().test();
A13().test();
}

View file

@ -35,25 +35,36 @@ extension E1 on A1 {
int get topLevelMethod => 3;
void test() {
// Reading the local getters is valid
Expect.equals(topLevelSetter+1, 2);
Expect.equals(topLevelField+1, 3);
Expect.equals(topLevelMethod+1, 4);
Expect.equals(topLevelSetter + 1, 2);
Expect.equals(topLevelField + 1, 3);
Expect.equals(topLevelMethod + 1, 4);
}
}
class A1 {}
// Check that an instance setter in an extension shadows top level
// members with the same basename.
extension E2 on A2 {
void set topLevelGetter(int x) { _storeTo = x; }
void set topLevelField(int x) { _storeTo = x; }
void set topLevelMethod(int x) { _storeTo = x; }
void set topLevelGetter(int x) {
_storeTo = x;
}
void set topLevelField(int x) {
_storeTo = x;
}
void set topLevelMethod(int x) {
_storeTo = x;
}
void test() {
checkSetter(topLevelGetter = 42);
checkSetter(topLevelField = 42);
checkSetter(topLevelMethod = 42);
}
}
class A2 {}
// Check that a static getter in an extension shadows top level
@ -64,30 +75,41 @@ extension E3 on A3 {
static int get topLevelMethod => 3;
void test() {
// Reading the local getters is valid
Expect.equals(topLevelSetter+1, 2);
Expect.equals(topLevelField+1, 3);
Expect.equals(topLevelMethod+1, 4);
Expect.equals(topLevelSetter + 1, 2);
Expect.equals(topLevelField + 1, 3);
Expect.equals(topLevelMethod + 1, 4);
}
}
class A3 {}
// Check that a static setter in an extension shadows top level
// members with the same basename.
extension E4 on A4 {
static void set topLevelGetter(int x) { _storeTo = x; }
static void set topLevelField(int x) { _storeTo = x; }
static void set topLevelMethod(int x) { _storeTo = x; }
static void set topLevelGetter(int x) {
_storeTo = x;
}
static void set topLevelField(int x) {
_storeTo = x;
}
static void set topLevelMethod(int x) {
_storeTo = x;
}
void test() {
checkSetter(topLevelGetter = 42);
checkSetter(topLevelField = 42);
checkSetter(topLevelMethod = 42);
}
}
class A4 {}
// Bring extensions on A6 into scope
// Define extensions on A6.
extension E5 on A6 {
void set extensionSetter(int x) => -1;
void set extensionSetter(int x) {}
int extensionMethod(int x) => -3;
}
@ -98,13 +120,26 @@ extension E6 on A6 {
int get extensionMethod => 3;
void test() {
// Reading the local getters is valid
Expect.equals(extensionSetter+1, 2);
Expect.equals(extensionMethod+1, 4);
Expect.equals(extensionSetter + 1, 2);
Expect.equals(extensionMethod + 1, 4);
}
}
class A6 {}
// Bring extensions on A8 into scope
// Check that an instance getter in a class shadows extension
// members with the same basename from extension E5.
class A7 extends A6 {
int get extensionSetter => 1;
int get extensionMethod => 3;
void test() {
// Reading the local getters is valid
Expect.equals(extensionSetter + 1, 2);
Expect.equals(extensionMethod + 1, 4);
}
}
// Define extensions on A8.
extension E7 on A8 {
int get extensionGetter => -1;
int extensionMethod(int x) => -3;
@ -113,23 +148,45 @@ extension E7 on A8 {
// Check that an instance setter in an extension shadows extension
// members with the same basename from a different extension.
extension E8 on A8 {
void set extensionGetter(int x) { _storeTo = x; }
void set extensionMethod(int x) { _storeTo = x; }
void set extensionGetter(int x) {
_storeTo = x;
}
void set extensionMethod(int x) {
_storeTo = x;
}
void test() {
checkSetter(extensionGetter = 42);
checkSetter(extensionMethod = 42);
}
}
class A8 {}
// Check that an instance setter in a class shadows extension
// members with the same basename from extension E7.
class A9 extends A8 {
void set extensionGetter(int x) {
_storeTo = x;
}
// Bring extensions on A10 into scope
extension E9 on A10 {
void set extensionSetter(int x) => -1;
void set extensionFieldSetter(int x) => -2;
int extensionMethod(int x) => -3;
void set extensionMethod(int x) {
_storeTo = x;
}
void test() {
checkSetter(extensionGetter = 42);
checkSetter(extensionMethod = 42);
}
}
// Define extensions on A10.
extension E9 on A10 {
void set extensionSetter(int x) {}
void set extensionFieldSetter(int x) {}
int extensionMethod(int x) => -3;
}
// Check that a static getter in an extension shadows extension
// members with the same basename from a different extension.
@ -139,14 +196,29 @@ extension E10 on A10 {
static int get extensionMethod => 3;
void test() {
// Reading the local getters is valid
Expect.equals(extensionSetter+1, 2);
Expect.equals(extensionFieldSetter+1, 3);
Expect.equals(extensionMethod+1, 4);
Expect.equals(extensionSetter + 1, 2);
Expect.equals(extensionFieldSetter + 1, 3);
Expect.equals(extensionMethod + 1, 4);
}
}
class A10 {}
// Bring extensions on A12 into scope
// Check that a static getter in a class shadows extension
// members with the same basename from extension E9.
class A11 extends A10 {
static int get extensionSetter => 1;
static final int extensionFieldSetter = 2;
static int get extensionMethod => 3;
void test() {
// Reading the local getters is valid
Expect.equals(extensionSetter + 1, 2);
Expect.equals(extensionFieldSetter + 1, 3);
Expect.equals(extensionMethod + 1, 4);
}
}
// Define extensions on A12.
extension E11 on A12 {
int get extensionGetter => -1;
int extensionMethod(int x) => -3;
@ -155,22 +227,50 @@ extension E11 on A12 {
// Check that a static setter in an extension shadows extension
// members with the same basename from a different extension.
extension E12 on A12 {
static void set extensionGetter(int x) { _storeTo = x; }
static void set extensionMethod(int x) { _storeTo = x; }
static void set extensionGetter(int x) {
_storeTo = x;
}
static void set extensionMethod(int x) {
_storeTo = x;
}
void test() {
checkSetter(extensionGetter = 42);
checkSetter(extensionMethod = 42);
}
}
class A12 {}
// Check that a static setter in a class shadows extension
// members with the same basename from extension E11.
class A13 extends A12 {
static void set extensionGetter(int x) {
_storeTo = x;
}
static void set extensionMethod(int x) {
_storeTo = x;
}
void test() {
checkSetter(extensionGetter = 42);
checkSetter(extensionMethod = 42);
}
}
void main() {
A1().test();
A2().test();
A3().test();
A4().test();
A6().test();
A7().test();
A8().test();
A9().test();
A10().test();
A11().test();
A12().test();
}
A13().test();
}