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