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>
This commit is contained in:
Konstantin Shcheglov 2019-06-18 03:43:38 +00:00 committed by commit-bot@chromium.org
parent f7d3e5bebf
commit 770675b668
4 changed files with 42 additions and 7 deletions

View file

@ -24,6 +24,11 @@ class AstBinaryFlags {
VariableDeclaration,
);
static final _hasName = _checkBit(
5,
ConstructorDeclaration,
);
static final _hasNot = _checkBit(
0,
IsExpression,
@ -217,6 +222,7 @@ class AstBinaryFlags {
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 @@ class AstBinaryFlags {
if (hasInitializer) {
result |= _hasInitializer;
}
if (hasName) {
result |= _hasName;
}
if (hasNot) {
result |= _hasNot;
}
@ -371,6 +380,10 @@ class AstBinaryFlags {
return (flags & _hasInitializer) != 0;
}
static bool hasName(int flags) {
return (flags & _hasName) != 0;
}
static bool hasNot(int flags) {
return (flags & _hasNot) != 0;
}

View file

@ -384,6 +384,16 @@ class AstBinaryReader {
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 @@ class AstBinaryReader {
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),

View file

@ -315,6 +315,7 @@ class AstBinaryWriter extends ThrowingAstVisitor<LinkedNodeBuilder> {
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,

View file

@ -32,6 +32,22 @@ class C {
''');
}
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;