Fix for naming constructor with missing name.

R=brianwilkerson@google.com

Change-Id: I89ef01033c9e14417286e5ea95d2d88e1c498982
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/106425
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_flags.dart b/pkg/analyzer/lib/src/summary2/ast_binary_flags.dart
index 5f973e1..95a829f 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_flags.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_flags.dart
@@ -24,6 +24,11 @@
     VariableDeclaration,
   );
 
+  static final _hasName = _checkBit(
+    5,
+    ConstructorDeclaration,
+  );
+
   static final _hasNot = _checkBit(
     0,
     IsExpression,
@@ -217,6 +222,7 @@
     bool hasAwait: false,
     bool hasEqual: false,
     bool hasInitializer: false,
+    bool hasName: false,
     bool hasNot: false,
     bool hasPeriod: false,
     bool hasPeriod2: false,
@@ -260,6 +266,9 @@
     if (hasInitializer) {
       result |= _hasInitializer;
     }
+    if (hasName) {
+      result |= _hasName;
+    }
     if (hasNot) {
       result |= _hasNot;
     }
@@ -371,6 +380,10 @@
     return (flags & _hasInitializer) != 0;
   }
 
+  static bool hasName(int flags) {
+    return (flags & _hasName) != 0;
+  }
+
   static bool hasNot(int flags) {
     return (flags & _hasNot) != 0;
   }
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
index 4121ee3..46f9ec4 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
@@ -384,6 +384,16 @@
     returnType.token.offset =
         informativeData?.constructorDeclaration_returnTypeOffset ?? 0;
 
+    Token periodToken;
+    SimpleIdentifier nameIdentifier;
+    if (AstBinaryFlags.hasName(data.flags)) {
+      periodToken = Token(
+        TokenType.PERIOD,
+        informativeData?.constructorDeclaration_periodOffset ?? 0,
+      );
+      nameIdentifier = _declaredIdentifier(data);
+    }
+
     var node = astFactory.constructorDeclaration(
       _readDocumentationComment(data),
       _readNodeListLazy(data.annotatedNode_metadata),
@@ -391,13 +401,8 @@
       AstBinaryFlags.isConst(data.flags) ? _Tokens.CONST : null,
       AstBinaryFlags.isFactory(data.flags) ? _Tokens.FACTORY : null,
       returnType,
-      data.name.isNotEmpty
-          ? Token(
-              TokenType.PERIOD,
-              informativeData?.constructorDeclaration_periodOffset ?? 0,
-            )
-          : null,
-      data.name.isNotEmpty ? _declaredIdentifier(data) : null,
+      periodToken,
+      nameIdentifier,
       _readNodeLazy(data.constructorDeclaration_parameters),
       _Tokens.choose(
         AstBinaryFlags.hasSeparatorColon(data.flags),
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
index 5d3ce26..3e362e7 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
@@ -315,6 +315,7 @@
       informativeId: getInformativeId(node),
     );
     builder.flags = AstBinaryFlags.encode(
+      hasName: node.name != null,
       hasSeparatorColon: node.separator?.type == TokenType.COLON,
       hasSeparatorEquals: node.separator?.type == TokenType.EQ,
       isAbstract: node.body is EmptyFunctionBody,
diff --git a/pkg/analyzer/test/generated/invalid_code_test.dart b/pkg/analyzer/test/generated/invalid_code_test.dart
index 73fb3ef..6b501b9 100644
--- a/pkg/analyzer/test/generated/invalid_code_test.dart
+++ b/pkg/analyzer/test/generated/invalid_code_test.dart
@@ -32,6 +32,22 @@
 ''');
   }
 
+  test_constructorDeclaration_named_missingName() async {
+    await _assertCanBeAnalyzed('''
+class C {
+  C.();
+}
+''');
+  }
+
+  test_constructorDeclaration_named_missingName_factory() async {
+    await _assertCanBeAnalyzed('''
+class C {
+  factory C.();
+}
+''');
+  }
+
   test_genericFunction_asTypeArgument_ofUnresolvedClass() async {
     await _assertCanBeAnalyzed(r'''
 C<int Function()> c;