Version 2.15.0-230.0.dev

Merge commit '189aeead472ab6981187b0bfa8e8b23b40e57652' into 'dev'
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
index 5d85616..a5aab9e 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
@@ -365,7 +365,7 @@
       return;
     }
 
-    var completion = constructor.displayName;
+    var completion = constructor.name;
     if (!hasClassName && className.isNotEmpty) {
       if (completion.isEmpty) {
         completion = className;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_super_constructor_invocation.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_super_constructor_invocation.dart
index 092f566..fa1537b 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_super_constructor_invocation.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_super_constructor_invocation.dart
@@ -72,7 +72,7 @@
   List<Object> get fixArguments {
     var buffer = StringBuffer();
     buffer.write('super');
-    var constructorName = _constructor.displayName;
+    var constructorName = _constructor.name;
     if (constructorName.isNotEmpty) {
       buffer.write('.');
       buffer.write(constructorName);
@@ -86,7 +86,7 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
-    var constructorName = _constructor.displayName;
+    var constructorName = _constructor.name;
     await builder.addDartFileEdit(file, (builder) {
       builder.addInsertion(_insertOffset, (builder) {
         builder.write(_prefix);
diff --git a/pkg/analysis_server/lib/src/services/correction/util.dart b/pkg/analysis_server/lib/src/services/correction/util.dart
index 7fc3b9f..be7ef60 100644
--- a/pkg/analysis_server/lib/src/services/correction/util.dart
+++ b/pkg/analysis_server/lib/src/services/correction/util.dart
@@ -210,9 +210,7 @@
 /// Returns the name to display in the UI for the given [Element].
 String getElementQualifiedName(Element element) {
   var kind = element.kind;
-  if (kind == ElementKind.CONSTRUCTOR ||
-      kind == ElementKind.FIELD ||
-      kind == ElementKind.METHOD) {
+  if (kind == ElementKind.FIELD || kind == ElementKind.METHOD) {
     return '${element.enclosingElement!.displayName}.${element.displayName}';
   } else if (kind == ElementKind.LIBRARY) {
     // Libraries may not have names, so use a path relative to the context root.
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename.dart b/pkg/analysis_server/lib/src/services/refactoring/rename.dart
index 4f2271f..3ca9d77 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename.dart
@@ -66,7 +66,7 @@
       : searchEngine = workspace.searchEngine,
         _element = element,
         elementKindName = element.kind.displayName,
-        oldName = _getDisplayName(element);
+        oldName = _getOldName(element);
 
   Element get element => _element;
 
@@ -111,8 +111,10 @@
   /// Adds individual edits to [change].
   Future<void> fillChange();
 
-  static String _getDisplayName(Element element) {
-    if (element is ImportElement) {
+  static String _getOldName(Element element) {
+    if (element is ConstructorElement) {
+      return element.name;
+    } else if (element is ImportElement) {
       var prefix = element.prefix;
       if (prefix != null) {
         return prefix.displayName;
diff --git a/pkg/analysis_server/lib/src/services/search/hierarchy.dart b/pkg/analysis_server/lib/src/services/search/hierarchy.dart
index 7189bd6..05d4116 100644
--- a/pkg/analysis_server/lib/src/services/search/hierarchy.dart
+++ b/pkg/analysis_server/lib/src/services/search/hierarchy.dart
@@ -12,7 +12,7 @@
 List<Element> getChildren(Element parent, [String? name]) {
   var children = <Element>[];
   visitChildren(parent, (Element element) {
-    if (name == null || element.displayName == name) {
+    if (name == null || _getBaseName(element) == name) {
       children.add(element);
     }
     return false;
@@ -205,3 +205,11 @@
   }
   return element;
 }
+
+String? _getBaseName(Element element) {
+  if (element is PropertyAccessorElement && element.isSetter) {
+    var name = element.name;
+    return name.substring(0, name.length - 1);
+  }
+  return element.name;
+}
diff --git a/pkg/analysis_server/test/plugin/protocol_dart_test.dart b/pkg/analysis_server/test/plugin/protocol_dart_test.dart
index 25f7bdb..708a951 100644
--- a/pkg/analysis_server/test/plugin/protocol_dart_test.dart
+++ b/pkg/analysis_server/test/plugin/protocol_dart_test.dart
@@ -121,7 +121,7 @@
     // create notification Element
     var element = convertElement(engineElement, withNullability: true);
     expect(element.kind, ElementKind.CONSTRUCTOR);
-    expect(element.name, 'myConstructor');
+    expect(element.name, 'A.myConstructor');
     expect(element.typeParameters, isNull);
     {
       var location = element.location!;
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart b/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
index 55a731a..51ab571 100644
--- a/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
+++ b/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
@@ -267,20 +267,19 @@
     return cs;
   }
 
-  CompletionSuggestion assertSuggestConstructor(String name,
+  CompletionSuggestion assertSuggestConstructor(String suggestion,
       {String? elementName,
       int? elemOffset,
       String defaultArgListString = _UNCHECKED,
       List<int>? defaultArgumentListTextRanges}) {
-    var cs = assertSuggest(name,
+    elementName ??= suggestion;
+    var cs = assertSuggest(suggestion,
         elemKind: ElementKind.CONSTRUCTOR,
         elemOffset: elemOffset,
         defaultArgListString: defaultArgListString,
         defaultArgumentListTextRanges: defaultArgumentListTextRanges);
     var element = cs.element!;
     expect(element.kind, equals(ElementKind.CONSTRUCTOR));
-    var index = name.indexOf('.');
-    elementName ??= index >= 0 ? name.substring(index + 1) : '';
     expect(element.name, elementName);
     return cs;
   }
diff --git a/pkg/analysis_server/test/services/completion/dart/named_constructor_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/named_constructor_contributor_test.dart
index 1ff2987..0e35485 100644
--- a/pkg/analysis_server/test/services/completion/dart/named_constructor_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/named_constructor_contributor_test.dart
@@ -19,12 +19,17 @@
 @reflectiveTest
 class NamedConstructorContributorTest extends DartCompletionContributorTest {
   CompletionSuggestion assertSuggestNamedConstructor(
-      String name, String returnType,
-      [CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION]) {
-    var cs = assertSuggest(name, csKind: kind);
+    String completion,
+    String returnType, {
+    required String elementName,
+  }) {
+    var cs = assertSuggest(
+      completion,
+      csKind: CompletionSuggestionKind.INVOCATION,
+    );
     var element = cs.element!;
     expect(element.kind, equals(ElementKind.CONSTRUCTOR));
-    expect(element.name, equals(name));
+    expect(element.name, equals(elementName));
     var param = element.parameters!;
     expect(param[0], equals('('));
     expect(param[param.length - 1], equals(')'));
@@ -54,7 +59,7 @@
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    assertSuggestNamedConstructor('c', 'X');
+    assertSuggestNamedConstructor('c', 'X', elementName: 'X.c');
     assertNotSuggested('F1');
     assertNotSuggested('T1');
     assertNotSuggested('_d');
@@ -79,7 +84,7 @@
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    assertSuggestNamedConstructor('c', 'X');
+    assertSuggestNamedConstructor('c', 'X', elementName: 'X.c');
     assertNotSuggested('F1');
     assertNotSuggested('T1');
     assertNotSuggested('_d');
@@ -103,7 +108,7 @@
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    assertSuggestNamedConstructor('c', 'X');
+    assertSuggestNamedConstructor('c', 'X', elementName: 'X.c');
     assertNotSuggested('F1');
     assertNotSuggested('T1');
     assertNotSuggested('_d');
@@ -119,7 +124,11 @@
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 2);
     expect(replacementLength, 13);
-    assertSuggestNamedConstructor('fromCharCodes', 'String');
+    assertSuggestNamedConstructor(
+      'fromCharCodes',
+      'String',
+      elementName: 'String.fromCharCodes',
+    );
     assertNotSuggested('isEmpty');
     assertNotSuggested('isNotEmpty');
     assertNotSuggested('length');
@@ -138,8 +147,8 @@
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    assertSuggestNamedConstructor('c', 'X');
-    assertSuggestNamedConstructor('_d', 'X');
+    assertSuggestNamedConstructor('c', 'X', elementName: 'X.c');
+    assertSuggestNamedConstructor('_d', 'X', elementName: 'X._d');
     assertNotSuggested('F1');
     assertNotSuggested('T1');
     assertNotSuggested('z');
@@ -157,8 +166,8 @@
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    assertSuggestNamedConstructor('c', 'X');
-    assertSuggestNamedConstructor('_d', 'X');
+    assertSuggestNamedConstructor('c', 'X', elementName: 'X.c');
+    assertSuggestNamedConstructor('_d', 'X', elementName: 'X._d');
     assertNotSuggested('F1');
     assertNotSuggested('T1');
     assertNotSuggested('z');
diff --git a/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart
index 7253f49..0cecf86 100644
--- a/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart
@@ -170,8 +170,8 @@
 ''');
     await computeSuggestions();
 
-    assertSuggestConstructor('foo', elementName: 'foo');
-    assertSuggestConstructor('bar', elementName: 'bar');
+    assertSuggestConstructor('foo', elementName: 'A.foo');
+    assertSuggestConstructor('bar', elementName: 'A.bar');
   }
 
   Future<void> test_keyword() async {
@@ -399,7 +399,7 @@
     assertSuggestSetter('publicSetter');
     assertSuggestConstructor(
       'publicConstructor',
-      elementName: 'publicConstructor',
+      elementName: 'A.publicConstructor',
     );
   }
 
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index a067cd4..492681f 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -1,3 +1,6 @@
+## 2.7.0-dev
+* Updated `ConstructorElement.displayName` to either `Class` or `Class.constructor`.
+
 ## 2.6.0
 * Deprecated `AnalysisResult.state`, check for specific valid or invalid subtypes.
 * Deprecated `ResultState`.
diff --git a/pkg/analyzer/lib/src/dart/element/display_string_builder.dart b/pkg/analyzer/lib/src/dart/element/display_string_builder.dart
index 612db53..27fbe85 100644
--- a/pkg/analyzer/lib/src/dart/element/display_string_builder.dart
+++ b/pkg/analyzer/lib/src/dart/element/display_string_builder.dart
@@ -57,11 +57,7 @@
     _writeType(element.returnType);
     _write(' ');
 
-    _write(element.enclosingElement.displayName);
-    if (element.displayName.isNotEmpty) {
-      _write('.');
-      _write(element.displayName);
-    }
+    _write(element.displayName);
 
     _writeFormalParameters(
       element.parameters,
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 541f9db..1678bf8 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -1451,12 +1451,13 @@
 
   @override
   String get displayName {
-    final linkedData = this.linkedData;
-    if (linkedData != null) {
-      return linkedData.reference.name;
+    var className = enclosingElement.name;
+    var name = this.name;
+    if (name.isNotEmpty) {
+      return '$className.$name';
+    } else {
+      return className;
     }
-
-    return super.displayName;
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart
index 6ec3f7e..386da13 100644
--- a/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart
@@ -149,19 +149,21 @@
     required bool implicitReceiver,
   }) {
     var enclosingElement = element.enclosingElement;
-    if (_resolver.enclosingExtension != null) {
-      _resolver.errorReporter.reportErrorForNode(
-        CompileTimeErrorCode
-            .UNQUALIFIED_REFERENCE_TO_STATIC_MEMBER_OF_EXTENDED_TYPE,
-        nameNode,
-        [enclosingElement.displayName],
-      );
-    } else if (implicitReceiver) {
-      _resolver.errorReporter.reportErrorForNode(
-        CompileTimeErrorCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
-        nameNode,
-        [enclosingElement.displayName],
-      );
+    if (implicitReceiver) {
+      if (_resolver.enclosingExtension != null) {
+        _resolver.errorReporter.reportErrorForNode(
+          CompileTimeErrorCode
+              .UNQUALIFIED_REFERENCE_TO_STATIC_MEMBER_OF_EXTENDED_TYPE,
+          nameNode,
+          [enclosingElement.displayName],
+        );
+      } else {
+        _resolver.errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
+          nameNode,
+          [enclosingElement.displayName],
+        );
+      }
     } else {
       _resolver.errorReporter.reportErrorForNode(
         CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER,
diff --git a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
index 3d1d725..e75d2be 100644
--- a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
@@ -219,19 +219,21 @@
     bool nullReceiver,
   ) {
     var enclosingElement = element.enclosingElement;
-    if (_resolver.enclosingExtension != null) {
-      _resolver.errorReporter.reportErrorForNode(
-        CompileTimeErrorCode
-            .UNQUALIFIED_REFERENCE_TO_STATIC_MEMBER_OF_EXTENDED_TYPE,
-        nameNode,
-        [enclosingElement.displayName],
-      );
-    } else if (nullReceiver) {
-      _resolver.errorReporter.reportErrorForNode(
-        CompileTimeErrorCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
-        nameNode,
-        [enclosingElement.displayName],
-      );
+    if (nullReceiver) {
+      if (_resolver.enclosingExtension != null) {
+        _resolver.errorReporter.reportErrorForNode(
+          CompileTimeErrorCode
+              .UNQUALIFIED_REFERENCE_TO_STATIC_MEMBER_OF_EXTENDED_TYPE,
+          nameNode,
+          [enclosingElement.displayName],
+        );
+      } else {
+        _resolver.errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
+          nameNode,
+          [enclosingElement.displayName],
+        );
+      }
     } else {
       _resolver.errorReporter.reportErrorForNode(
         CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER,
diff --git a/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
index e8f3c35..787d963 100644
--- a/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
@@ -248,18 +248,6 @@
     );
   }
 
-  void _checkExtensionOverrideStaticMember(
-    SimpleIdentifier propertyName,
-    ExecutableElement? element,
-  ) {
-    if (element != null && element.isStatic) {
-      _errorReporter.reportErrorForNode(
-        CompileTimeErrorCode.EXTENSION_OVERRIDE_ACCESS_TO_STATIC_MEMBER,
-        propertyName,
-      );
-    }
-  }
-
   /// If the [element] is not static, report the error on the [identifier].
   void _checkForStaticAccessToInstanceMember(
     SimpleIdentifier identifier,
@@ -274,6 +262,33 @@
     );
   }
 
+  void _checkForStaticMember(
+    Expression target,
+    SimpleIdentifier propertyName,
+    ExecutableElement? element,
+  ) {
+    if (element != null && element.isStatic) {
+      if (target is ExtensionOverride) {
+        _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.EXTENSION_OVERRIDE_ACCESS_TO_STATIC_MEMBER,
+          propertyName,
+        );
+      } else {
+        var enclosingElement = element.enclosingElement;
+        _errorReporter.reportErrorForNode(
+            CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER,
+            propertyName, [
+          propertyName,
+          element.kind.displayName,
+          enclosingElement.name ?? '<unnamed>',
+          enclosingElement is ClassElement && enclosingElement.isMixin
+              ? 'mixin'
+              : enclosingElement.kind.displayName,
+        ]);
+      }
+    }
+  }
+
   DartType? _computeIndexContextType({
     required ExecutableElement? readElement,
     required ExecutableElement? writeElement,
@@ -417,21 +432,27 @@
         result.getter,
         result.getter?.returnType ?? _typeSystem.typeProvider.dynamicType);
 
-    if (hasRead && result.needsGetterError) {
-      _errorReporter.reportErrorForNode(
-        CompileTimeErrorCode.UNDEFINED_GETTER,
-        propertyName,
-        [propertyName.name, targetType],
-      );
+    if (hasRead) {
+      _checkForStaticMember(target, propertyName, result.getter);
+      if (result.needsGetterError) {
+        _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.UNDEFINED_GETTER,
+          propertyName,
+          [propertyName.name, targetType],
+        );
+      }
     }
 
-    if (hasWrite && result.needsSetterError) {
-      AssignmentVerifier(_definingLibrary, _errorReporter).verify(
-        node: propertyName,
-        requested: null,
-        recovery: result.getter,
-        receiverTypeObject: targetType,
-      );
+    if (hasWrite) {
+      _checkForStaticMember(target, propertyName, result.setter);
+      if (result.needsSetterError) {
+        AssignmentVerifier(_definingLibrary, _errorReporter).verify(
+          node: propertyName,
+          requested: null,
+          recovery: result.getter,
+          receiverTypeObject: targetType,
+        );
+      }
     }
 
     return PropertyElementResolverResult(
@@ -591,7 +612,7 @@
           [memberName, element.name],
         );
       }
-      _checkExtensionOverrideStaticMember(propertyName, readElement);
+      _checkForStaticMember(target, propertyName, readElement);
     }
 
     ExecutableElement? writeElement;
@@ -604,7 +625,7 @@
           [memberName, element.name],
         );
       }
-      _checkExtensionOverrideStaticMember(propertyName, writeElement);
+      _checkForStaticMember(target, propertyName, writeElement);
     }
 
     return PropertyElementResolverResult(
@@ -670,6 +691,7 @@
 
         if (readElement != null) {
           readElement = _resolver.toLegacyElement(readElement);
+          _checkForStaticMember(target, propertyName, readElement);
         } else {
           // We were not able to find the concrete dispatch target.
           // But we would like to give the user at least some resolution.
@@ -708,6 +730,7 @@
 
         if (writeElement != null) {
           writeElement = _resolver.toLegacyElement(writeElement);
+          _checkForStaticMember(target, propertyName, writeElement);
         } else {
           // We were not able to find the concrete dispatch target.
           // But we would like to give the user at least some resolution.
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index a4f8ff7..2b6b30d 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -2658,15 +2658,6 @@
           return;
         }
       }
-      errorReporter.reportErrorForNode(
-          CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, name, [
-        name.name,
-        _getKind(element),
-        enclosingElement.name ?? '<unnamed>',
-        enclosingElement is ClassElement && enclosingElement.isMixin
-            ? 'mixin'
-            : enclosingElement.kind.displayName
-      ]);
     }
   }
 
@@ -4856,30 +4847,6 @@
     return null;
   }
 
-  /// Return a human-readable representation of the kind of the [element].
-  String _getKind(ExecutableElement element) {
-    if (element is MethodElement) {
-      return 'method';
-    } else if (element is PropertyAccessorElement) {
-      if (element.isSynthetic) {
-        PropertyInducingElement variable = element.variable;
-        if (variable is FieldElement) {
-          return 'field';
-        }
-        return 'variable';
-      } else if (element.isGetter) {
-        return 'getter';
-      } else {
-        return 'setter';
-      }
-    } else if (element is ConstructorElement) {
-      return 'constructor';
-    } else if (element is FunctionElement) {
-      return 'function';
-    }
-    return 'member';
-  }
-
   /// Return the name of the library that defines given [element].
   String _getLibraryName(Element? element) {
     if (element == null) {
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 8ce05d6..ba8ebe2 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 2.6.0
+version: 2.7.0-dev
 description: This package provides a library that performs static analysis of Dart code.
 homepage: https://github.com/dart-lang/sdk/tree/main/pkg/analyzer
 
diff --git a/pkg/analyzer/test/generated/element_resolver_test.dart b/pkg/analyzer/test/generated/element_resolver_test.dart
index 074ada9..a82b0a3 100644
--- a/pkg/analyzer/test/generated/element_resolver_test.dart
+++ b/pkg/analyzer/test/generated/element_resolver_test.dart
@@ -59,12 +59,12 @@
       expect(name1!.staticElement, isClassElement);
       expect(name1.staticElement!.displayName, 'A');
       expect(name2!.staticElement, isConstructorElement);
-      expect(name2.staticElement!.displayName, 'named');
+      expect(name2.staticElement!.displayName, 'A.named');
       expect(name3, isNull);
       if (annotationElement is ConstructorElement) {
         expect(annotationElement, same(name2.staticElement));
         expect(annotationElement.enclosingElement, name1.staticElement);
-        expect(annotationElement.displayName, 'named');
+        expect(annotationElement.displayName, 'A.named');
         expect(annotationElement.parameters, isEmpty);
       } else {
         fail('Expected "annotationElement" is ConstructorElement, '
@@ -86,11 +86,11 @@
       expect(name2!.staticElement, isClassElement);
       expect(name2.staticElement!.displayName, 'A');
       expect(name3!.staticElement, isConstructorElement);
-      expect(name3.staticElement!.displayName, 'named');
+      expect(name3.staticElement!.displayName, 'A.named');
       if (annotationElement is ConstructorElement) {
         expect(annotationElement, same(name3.staticElement));
         expect(annotationElement.enclosingElement, name2.staticElement);
-        expect(annotationElement.displayName, 'named');
+        expect(annotationElement.displayName, 'A.named');
         expect(annotationElement.parameters, isEmpty);
       } else {
         fail('Expected "annotationElement" is ConstructorElement, '
@@ -139,7 +139,7 @@
       expect(name3, isNull);
       if (annotationElement is ConstructorElement) {
         expect(annotationElement.enclosingElement, name2.staticElement);
-        expect(annotationElement.displayName, '');
+        expect(annotationElement.displayName, 'A');
         expect(annotationElement.parameters, isEmpty);
       } else {
         fail('Expected "annotationElement" is ConstructorElement, '
@@ -186,7 +186,7 @@
       expect(name3, isNull);
       if (annotationElement is ConstructorElement) {
         expect(annotationElement.enclosingElement, name1.staticElement);
-        expect(annotationElement.displayName, '');
+        expect(annotationElement.displayName, 'A');
         expect(annotationElement.parameters, isEmpty);
       } else {
         fail('Expected "annotationElement" is ConstructorElement, '
@@ -259,7 +259,7 @@
       validator(name.prefix, name.identifier, annotation.constructorName,
           annotationElement);
     } else {
-      fail('Uknown "name": ${name.runtimeType} $name');
+      fail('Unknown "name": ${name.runtimeType} $name');
     }
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/instance_access_to_static_member_test.dart b/pkg/analyzer/test/src/diagnostics/instance_access_to_static_member_test.dart
index 470dbc7..1142a36 100644
--- a/pkg/analyzer/test/src/diagnostics/instance_access_to_static_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/instance_access_to_static_member_test.dart
@@ -98,6 +98,25 @@
     );
   }
 
+  test_extension_referring_to_class_member() async {
+    await assertErrorsInCode('''
+class C {
+  static void m() {}
+}
+extension on int {
+  foo(C c) {
+    c.m(); // ERROR
+  }
+}
+test(int i) {
+  i.foo(C());
+}
+''', [
+      error(CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 71, 1,
+          correctionContains: "class 'C'"),
+    ]);
+  }
+
   test_extension_setter() async {
     await assertErrorsInCode('''
 class C {}
diff --git a/pkg/analyzer/test/src/summary/element_text.dart b/pkg/analyzer/test/src/summary/element_text.dart
index c8d4d0e..96d9eb1 100644
--- a/pkg/analyzer/test/src/summary/element_text.dart
+++ b/pkg/analyzer/test/src/summary/element_text.dart
@@ -46,12 +46,14 @@
   LibraryElement library,
   String expected, {
   bool withCodeRanges = false,
+  bool withDisplayName = false,
   bool withExportScope = false,
   bool withNonSynthetic = false,
 }) {
   var writer = _ElementWriter(
     selfUriStr: '${library.source.uri}',
     withCodeRanges: withCodeRanges,
+    withDisplayName: withDisplayName,
     withExportScope: withExportScope,
     withNonSynthetic: withNonSynthetic,
   );
@@ -116,6 +118,7 @@
 class _ElementWriter {
   final String? selfUriStr;
   final bool withCodeRanges;
+  final bool withDisplayName;
   final bool withExportScope;
   final bool withNonSynthetic;
   final StringBuffer buffer = StringBuffer();
@@ -125,6 +128,7 @@
   _ElementWriter({
     this.selfUriStr,
     required this.withCodeRanges,
+    required this.withDisplayName,
     required this.withExportScope,
     required this.withNonSynthetic,
   });
@@ -364,6 +368,7 @@
       _writeDocumentation(e);
       _writeMetadata(e);
       _writeCodeRange(e);
+      _writeDisplayName(e);
 
       var periodOffset = e.periodOffset;
       var nameEnd = e.nameEnd;
@@ -399,6 +404,12 @@
     }
   }
 
+  void _writeDisplayName(Element e) {
+    if (withDisplayName) {
+      _writelnWithIndent('displayName: ${e.displayName}');
+    }
+  }
+
   void _writeDocumentation(Element element) {
     var documentation = element.documentationComment;
     if (documentation != null) {
@@ -571,7 +582,8 @@
   }
 
   void _writeName(Element e) {
-    var name = e.displayName;
+    // TODO(scheglov) Use 'name' everywhere.
+    var name = e is ConstructorElement ? e.name : e.displayName;
     buffer.write(name);
     buffer.write(name.isNotEmpty ? ' @' : '@');
     buffer.write(e.nameOffset);
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index adbe8fc..1a70ed9 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -1470,18 +1470,6 @@
 ''');
   }
 
-  test_class_constructor_implicit() async {
-    var library = await checkLibrary('class C {}');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        constructors
-          synthetic @-1
-''');
-  }
-
   test_class_constructor_implicit_type_params() async {
     var library = await checkLibrary('class C<T, U> {}');
     checkElementText(library, r'''
@@ -1516,21 +1504,84 @@
 ''');
   }
 
-  test_class_constructors() async {
-    var library = await checkLibrary('class C { C.foo(); C.bar(); }');
-    checkElementText(library, r'''
+  test_class_constructor_unnamed_implicit() async {
+    var library = await checkLibrary('class C {}');
+    checkElementText(
+        library,
+        r'''
 library
   definingUnit
     classes
       class C @6
         constructors
-          foo @12
-            periodOffset: 11
-            nameEnd: 15
-          bar @21
-            periodOffset: 20
-            nameEnd: 24
+          synthetic @-1
+            displayName: C
+''',
+        withDisplayName: true);
+  }
+
+  test_class_constructors_named() async {
+    var library = await checkLibrary('''
+class C {
+  C.foo();
+}
 ''');
+    checkElementText(
+        library,
+        r'''
+library
+  definingUnit
+    classes
+      class C @6
+        constructors
+          foo @14
+            displayName: C.foo
+            periodOffset: 13
+            nameEnd: 17
+''',
+        withDisplayName: true);
+  }
+
+  test_class_constructors_unnamed() async {
+    var library = await checkLibrary('''
+class C {
+  C();
+}
+''');
+    checkElementText(
+        library,
+        r'''
+library
+  definingUnit
+    classes
+      class C @6
+        constructors
+          @12
+            displayName: C
+''',
+        withDisplayName: true);
+  }
+
+  test_class_constructors_unnamed_new() async {
+    var library = await checkLibrary('''
+class C {
+  C.new();
+}
+''');
+    checkElementText(
+        library,
+        r'''
+library
+  definingUnit
+    classes
+      class C @6
+        constructors
+          @14
+            displayName: C
+            periodOffset: 13
+            nameEnd: 17
+''',
+        withDisplayName: true);
   }
 
   test_class_documented() async {
diff --git a/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart b/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart
index 2c17b0a..38487ab 100644
--- a/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart
+++ b/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart
@@ -238,7 +238,7 @@
     // create notification Element
     var element = converter.convertElement(engineElement);
     expect(element.kind, plugin.ElementKind.CONSTRUCTOR);
-    expect(element.name, 'myConstructor');
+    expect(element.name, 'A.myConstructor');
     expect(element.typeParameters, isNull);
     {
       var location = element.location!;
diff --git a/tests/language/getter/no_setter_test.dart b/tests/language/getter/no_setter_test.dart
index 260b5fc..6fa7014 100644
--- a/tests/language/getter/no_setter_test.dart
+++ b/tests/language/getter/no_setter_test.dart
@@ -15,7 +15,6 @@
 // [cfe] Setter not found: 'nextVar'.
     this.nextVar = 1;
     //   ^^^^^^^
-    // [analyzer] COMPILE_TIME_ERROR.INSTANCE_ACCESS_TO_STATIC_MEMBER
     // [cfe] The setter 'nextVar' isn't defined for the class 'Example'.
     //   ^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_FINAL_NO_SETTER
@@ -30,8 +29,6 @@
 // [analyzer] COMPILE_TIME_ERROR.INVALID_REFERENCE_TO_THIS
 // [cfe] Expected identifier, but got 'this'.
 //       ^^^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INSTANCE_ACCESS_TO_STATIC_MEMBER
-//       ^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_FINAL_NO_SETTER
   }
 }
diff --git a/tests/language_2/getter/no_setter_test.dart b/tests/language_2/getter/no_setter_test.dart
index 02bc833..9690f56 100644
--- a/tests/language_2/getter/no_setter_test.dart
+++ b/tests/language_2/getter/no_setter_test.dart
@@ -17,7 +17,6 @@
 // [cfe] Setter not found: 'nextVar'.
     this.nextVar = 1;
     //   ^^^^^^^
-    // [analyzer] COMPILE_TIME_ERROR.INSTANCE_ACCESS_TO_STATIC_MEMBER
     // [cfe] The setter 'nextVar' isn't defined for the class 'Example'.
     //   ^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_FINAL_NO_SETTER
@@ -32,8 +31,6 @@
 // [analyzer] COMPILE_TIME_ERROR.INVALID_REFERENCE_TO_THIS
 // [cfe] Expected identifier, but got 'this'.
 //       ^^^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INSTANCE_ACCESS_TO_STATIC_MEMBER
-//       ^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_FINAL_NO_SETTER
   }
 }
diff --git a/tools/VERSION b/tools/VERSION
index 67fc35f..3cd4c9b 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 15
 PATCH 0
-PRERELEASE 229
+PRERELEASE 230
 PRERELEASE_PATCH 0
\ No newline at end of file