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;