Report MEMBER_WITH_CLASS_NAME for static getter/setter with the enclosing class name.
R=brianwilkerson@google.com
Bug: https://github.com/dart-lang/sdk/issues/34289
Change-Id: I8b593b4a652547e54ed06c80e34e82c11a14d7e8
Reviewed-on: https://dart-review.googlesource.com/73241
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 19b78b9..9e9f3b9 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -4183,7 +4183,7 @@
// check accessors
for (PropertyAccessorElement accessor in _enclosingClass.accessors) {
- if (className == accessor.name) {
+ if (className == accessor.displayName) {
_errorReporter.reportErrorForElement(
CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME, accessor);
}
diff --git a/pkg/analyzer/test/generated/non_error_resolver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_test.dart
index 2cce9bd..a215f04 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_test.dart
@@ -3700,16 +3700,6 @@
verify([source]);
}
- test_memberWithClassName_setter() async {
- Source source = addSource(r'''
-class A {
- set A(v) {}
-}''');
- await computeAnalysisResult(source);
- assertNoErrors(source);
- verify([source]);
- }
-
test_metadata_enumConstantDeclaration() async {
Source source = addSource(r'''
const x = 1;
diff --git a/pkg/analyzer/test/src/dart/resolution/class_test.dart b/pkg/analyzer/test/src/dart/resolution/class_test.dart
new file mode 100644
index 0000000..166176c
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/resolution/class_test.dart
@@ -0,0 +1,73 @@
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'driver_resolution.dart';
+import 'resolution.dart';
+import 'task_resolution.dart';
+
+main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(ClassDriverResolutionTest);
+ defineReflectiveTests(ClassTaskResolutionTest);
+ });
+}
+
+@reflectiveTest
+class ClassDriverResolutionTest extends DriverResolutionTest
+ with ClassResolutionMixin {}
+
+abstract class ClassResolutionMixin implements ResolutionTest {
+ test_error_memberWithClassName_getter() async {
+ addTestFile(r'''
+class C {
+ int get C => null;
+}
+''');
+ await resolveTestFile();
+ assertTestErrors([CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
+ }
+
+ test_error_memberWithClassName_getter_static() async {
+ addTestFile(r'''
+class C {
+ static int get C => null;
+}
+''');
+ await resolveTestFile();
+ assertTestErrors([CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
+
+ var method = findNode.methodDeclaration('C =>');
+ expect(method.isGetter, isTrue);
+ expect(method.isStatic, isTrue);
+ assertElement(method, findElement.getter('C'));
+ }
+
+ test_error_memberWithClassName_setter() async {
+ addTestFile(r'''
+class C {
+ set C(_) {}
+}
+''');
+ await resolveTestFile();
+ assertTestErrors([CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
+ }
+
+ test_error_memberWithClassName_setter_static() async {
+ addTestFile(r'''
+class C {
+ static set C(_) {}
+}
+''');
+ await resolveTestFile();
+ assertTestErrors([CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
+
+ var method = findNode.methodDeclaration('C(_)');
+ expect(method.isSetter, isTrue);
+ expect(method.isStatic, isTrue);
+ }
+}
+
+@reflectiveTest
+class ClassTaskResolutionTest extends TaskResolutionTest
+ with ClassResolutionMixin {}
diff --git a/pkg/analyzer/test/src/dart/resolution/mixin_test.dart b/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
index b57f7fe..2440c6a 100644
--- a/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
@@ -409,14 +409,34 @@
assertTestErrors([CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
}
- test_error_memberWithClassName_OK_setter() async {
+ test_error_memberWithClassName_getter_static() async {
+ addTestFile(r'''
+mixin M {
+ static int get M => 0;
+}
+''');
+ await resolveTestFile();
+ assertTestErrors([CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
+ }
+
+ test_error_memberWithClassName_setter() async {
addTestFile(r'''
mixin M {
void set M(_) {}
}
''');
await resolveTestFile();
- assertNoTestErrors();
+ assertTestErrors([CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
+ }
+
+ test_error_memberWithClassName_setter_static() async {
+ addTestFile(r'''
+mixin M {
+ static void set M(_) {}
+}
+''');
+ await resolveTestFile();
+ assertTestErrors([CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
}
test_error_methodAndGetterWithSameName() async {
diff --git a/pkg/analyzer/test/src/dart/resolution/test_all.dart b/pkg/analyzer/test/src/dart/resolution/test_all.dart
index b2b9dba..4417ef9 100644
--- a/pkg/analyzer/test/src/dart/resolution/test_all.dart
+++ b/pkg/analyzer/test/src/dart/resolution/test_all.dart
@@ -5,12 +5,14 @@
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'assignment_test.dart' as assignment_test;
+import 'class_test.dart' as class_test;
import 'for_in_test.dart' as for_in_test;
import 'mixin_test.dart' as mixin_test;
main() {
defineReflectiveSuite(() {
assignment_test.main();
+ class_test.main();
for_in_test.main();
mixin_test.main();
}, name: 'resolution');
diff --git a/pkg/front_end/testcases/compile.status b/pkg/front_end/testcases/compile.status
index dffedaf..ba0d63c 100644
--- a/pkg/front_end/testcases/compile.status
+++ b/pkg/front_end/testcases/compile.status
@@ -105,6 +105,7 @@
regress/issue_30836: RuntimeError # Issue 30836.
regress/issue_33452: RuntimeError # Test has an intentional error
regress/issue_32972: RuntimeError
+regress/issue_34225: RuntimeError
runtime_checks/implicit_downcast_constructor_initializer: RuntimeError # Test exercises strong mode semantics
runtime_checks/implicit_downcast_do: RuntimeError # Test exercises strong mode semantics
diff --git a/pkg/front_end/testcases/regress/issue_34225.dart.direct.expect b/pkg/front_end/testcases/regress/issue_34225.dart.direct.expect
index 6d82ff0..7c48338 100644
--- a/pkg/front_end/testcases/regress/issue_34225.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_34225.dart.direct.expect
@@ -1,10 +1,5 @@
// Errors:
//
-// pkg/front_end/testcases/regress/issue_34225.dart:6:3: Error: Constructors can't be static.
-// Try removing the keyword 'static'.
-// static set C(v) {} //# 01: compile-time error
-// ^^^^^^
-//
// pkg/front_end/testcases/regress/issue_34225.dart:6:14: Error: A class member can't have the same name as the enclosing class.
// static set C(v) {} //# 01: compile-time error
// ^
@@ -21,7 +16,7 @@
synthetic constructor •() → void
: super core::Object::•()
;
- set C(dynamic v) → dynamic {}
+ static set C(dynamic v) → dynamic {}
}
class D extends core::Object {
synthetic constructor •() → void
diff --git a/pkg/front_end/testcases/regress/issue_34225.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_34225.dart.direct.transformed.expect
index 6d82ff0..7c48338 100644
--- a/pkg/front_end/testcases/regress/issue_34225.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_34225.dart.direct.transformed.expect
@@ -1,10 +1,5 @@
// Errors:
//
-// pkg/front_end/testcases/regress/issue_34225.dart:6:3: Error: Constructors can't be static.
-// Try removing the keyword 'static'.
-// static set C(v) {} //# 01: compile-time error
-// ^^^^^^
-//
// pkg/front_end/testcases/regress/issue_34225.dart:6:14: Error: A class member can't have the same name as the enclosing class.
// static set C(v) {} //# 01: compile-time error
// ^
@@ -21,7 +16,7 @@
synthetic constructor •() → void
: super core::Object::•()
;
- set C(dynamic v) → dynamic {}
+ static set C(dynamic v) → dynamic {}
}
class D extends core::Object {
synthetic constructor •() → void
diff --git a/pkg/front_end/testcases/regress/issue_34225.dart.outline.expect b/pkg/front_end/testcases/regress/issue_34225.dart.outline.expect
index e8b5fad..3625d24 100644
--- a/pkg/front_end/testcases/regress/issue_34225.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_34225.dart.outline.expect
@@ -5,7 +5,7 @@
class C extends core::Object {
synthetic constructor •() → void
;
- set C(dynamic v) → dynamic
+ static set C(dynamic v) → dynamic
;
}
class D extends core::Object {
diff --git a/pkg/front_end/testcases/regress/issue_34225.dart.strong.expect b/pkg/front_end/testcases/regress/issue_34225.dart.strong.expect
index 94b326d..90b0ea1 100644
--- a/pkg/front_end/testcases/regress/issue_34225.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_34225.dart.strong.expect
@@ -1,10 +1,5 @@
// Errors:
//
-// pkg/front_end/testcases/regress/issue_34225.dart:6:3: Error: Constructors can't be static.
-// Try removing the keyword 'static'.
-// static set C(v) {} //# 01: compile-time error
-// ^^^^^^
-//
// pkg/front_end/testcases/regress/issue_34225.dart:6:14: Error: A class member can't have the same name as the enclosing class.
// static set C(v) {} //# 01: compile-time error
// ^
@@ -21,7 +16,7 @@
synthetic constructor •() → void
: super core::Object::•()
;
- set C(dynamic v) → void {}
+ static set C(dynamic v) → void {}
}
class D extends core::Object {
synthetic constructor •() → void
@@ -31,7 +26,10 @@
}
static method main() → dynamic {
self::C c = new self::C::•();
- c.{self::C::C} = 5;
+ let final dynamic #t1 = c in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/regress/issue_34225.dart:15:5: Error: The setter 'C' isn't defined for the class '#lib1::C'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'C'.
+ c.C = 5;
+ ^";
self::D d = new self::D::•();
d.{self::D::D} = 5;
}
diff --git a/pkg/front_end/testcases/regress/issue_34225.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_34225.dart.strong.transformed.expect
index 94b326d..45d4bcd 100644
--- a/pkg/front_end/testcases/regress/issue_34225.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_34225.dart.strong.transformed.expect
@@ -1,10 +1,5 @@
// Errors:
//
-// pkg/front_end/testcases/regress/issue_34225.dart:6:3: Error: Constructors can't be static.
-// Try removing the keyword 'static'.
-// static set C(v) {} //# 01: compile-time error
-// ^^^^^^
-//
// pkg/front_end/testcases/regress/issue_34225.dart:6:14: Error: A class member can't have the same name as the enclosing class.
// static set C(v) {} //# 01: compile-time error
// ^
@@ -21,7 +16,7 @@
synthetic constructor •() → void
: super core::Object::•()
;
- set C(dynamic v) → void {}
+ static set C(dynamic v) → void {}
}
class D extends core::Object {
synthetic constructor •() → void
@@ -31,7 +26,10 @@
}
static method main() → dynamic {
self::C c = new self::C::•();
- c.{self::C::C} = 5;
+ let final self::C #t1 = c in let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/regress/issue_34225.dart:15:5: Error: The setter 'C' isn't defined for the class '#lib1::C'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'C'.
+ c.C = 5;
+ ^";
self::D d = new self::D::•();
d.{self::D::D} = 5;
}
diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status
index 3545194..587ecbc 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -202,6 +202,7 @@
regress/issue_32972: TypeCheckError
regress/issue_33452: RuntimeError # Test has an intentional error
regress/issue_32660: TypeCheckError # Test has an intentional error
+regress/issue_34225: RuntimeError
runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast: RuntimeError
runtime_checks_new/mixin_forwarding_stub_field: TypeCheckError
diff --git a/tests/language_2/language_2_analyzer.status b/tests/language_2/language_2_analyzer.status
index 1e5ac40..01ea12e 100644
--- a/tests/language_2/language_2_analyzer.status
+++ b/tests/language_2/language_2_analyzer.status
@@ -131,7 +131,6 @@
regress_33235_16_test/03: MissingCompileTimeError
regress_33235_19_test: CompileTimeError
regress_33235_20_test: CompileTimeError
-regress_34225_test/02: MissingCompileTimeError # Issue #34225, #34289
setter3_test/01: CompileTimeError # Invalid test, see https://github.com/dart-lang/sdk/issues/33837
setter3_test/02: CompileTimeError # Invalid test, see https://github.com/dart-lang/sdk/issues/33837
setter_override2_test/02: MissingCompileTimeError # Issue 14736
diff --git a/tests/language_2/language_2_dartdevc.status b/tests/language_2/language_2_dartdevc.status
index 52ede30..440a3db 100644
--- a/tests/language_2/language_2_dartdevc.status
+++ b/tests/language_2/language_2_dartdevc.status
@@ -158,7 +158,6 @@
regress_33235_16_test/03: MissingCompileTimeError
regress_33235_19_test: CompileTimeError
regress_33235_20_test: CompileTimeError
-regress_34225_test/02: MissingCompileTimeError # Issue #34225, #34289
setter3_test/01: CompileTimeError # Invalid test, see https://github.com/dart-lang/sdk/issues/33837
setter3_test/02: CompileTimeError # Invalid test, see https://github.com/dart-lang/sdk/issues/33837
setter_override2_test/02: MissingCompileTimeError # Issue 14736