Add AstBuilder support for fields.

R=ahe@google.com, scheglov@google.com

Review-Url: https://codereview.chromium.org/2723883002 .
This commit is contained in:
Paul Berry 2017-03-01 13:24:17 -08:00
parent 9fa139215b
commit 8decc11ac0
9 changed files with 67 additions and 68 deletions

View file

@ -71,55 +71,6 @@ class ClassMemberParserTest_Fasta extends FastaParserTestCase
super.test_parseClassMember_constructor_withInitializers();
}
@override
@failingTest
void test_parseClassMember_field_covariant() {
// TODO(paulberry): Unhandled event: Fields
super.test_parseClassMember_field_covariant();
}
@override
@failingTest
void test_parseClassMember_field_instance_prefixedType() {
// TODO(paulberry): Unhandled event: Fields
super.test_parseClassMember_field_instance_prefixedType();
}
@override
@failingTest
void test_parseClassMember_field_namedGet() {
// TODO(paulberry): Unhandled event: Fields
super.test_parseClassMember_field_namedGet();
}
@override
@failingTest
void test_parseClassMember_field_namedOperator() {
// TODO(paulberry): Unhandled event: Fields
super.test_parseClassMember_field_namedOperator();
}
@override
@failingTest
void test_parseClassMember_field_namedOperator_withAssignment() {
// TODO(paulberry): Unhandled event: Fields
super.test_parseClassMember_field_namedOperator_withAssignment();
}
@override
@failingTest
void test_parseClassMember_field_namedSet() {
// TODO(paulberry): Unhandled event: Fields
super.test_parseClassMember_field_namedSet();
}
@override
@failingTest
void test_parseClassMember_field_static() {
// TODO(paulberry): Unhandled event: Fields
super.test_parseClassMember_field_static();
}
@override
@failingTest
void test_parseClassMember_getter_functionType() {
@ -228,14 +179,14 @@ class ClassMemberParserTest_Fasta extends FastaParserTestCase
@override
@failingTest
void test_parseInitializedIdentifierList_type() {
// TODO(paulberry): Unhandled event: Fields
// TODO(paulberry): handle doc comments
super.test_parseInitializedIdentifierList_type();
}
@override
@failingTest
void test_parseInitializedIdentifierList_var() {
// TODO(paulberry): Unhandled event: Fields
// TODO(paulberry): handle doc comments
super.test_parseInitializedIdentifierList_var();
}
@ -1404,13 +1355,6 @@ class TopLevelParserTest_Fasta extends FastaParserTestCase
super.test_parseClassDeclaration_native();
}
@override
@failingTest
void test_parseClassDeclaration_nonEmpty() {
// TODO(paulberry): Unhandled event: NoFieldInitializer
super.test_parseClassDeclaration_nonEmpty();
}
@override
@failingTest
void test_parseClassDeclaration_typeAlias_withB() {

View file

@ -115,9 +115,10 @@ class MemberListener extends NodeListener {
}
@override
void endFields(int count, Token beginToken, Token endToken) {
void endFields(
int count, Token covariantKeyword, Token beginToken, Token endToken) {
bool hasParseError = memberErrors.head;
super.endFields(count, beginToken, endToken);
super.endFields(count, covariantKeyword, beginToken, endToken);
VariableDefinitions variableDefinitions = popNode();
Modifiers modifiers = variableDefinitions.modifiers;
pushNode(null);

View file

@ -657,7 +657,8 @@ class NodeListener extends ElementListener {
}
@override
void endFields(int count, Token beginToken, Token endToken) {
void endFields(
int count, Token covariantKeyword, Token beginToken, Token endToken) {
NodeList variables = makeNodeList(count, null, endToken, ",");
TypeAnnotation type = popNode();
Modifiers modifiers = popNode();

View file

@ -1345,6 +1345,42 @@ class AstBuilder extends ScopeListener {
toAnalyzerToken(beginToken), arguments, toAnalyzerToken(endToken)));
}
@override
void endFields(
int count, Token covariantKeyword, Token beginToken, Token endToken) {
debugEvent("Fields");
List<VariableDeclaration> variables = popList(count);
TypeAnnotation type = pop();
List<Token> modifiers = pop();
Token staticKeyword;
Token keyword;
for (Token modifier in modifiers) {
String value = modifier.stringValue;
if (identical('static', value)) {
// TODO(paulberry): Check the order and uniqueness.
staticKeyword = modifier;
} else if (identical('var', value)) {
// TODO(paulberry): Check the order and uniqueness.
keyword = modifier;
} else {
// TODO(paulberry): Report error.
internalError("Invalid modifier ($value). Report an error.");
}
}
var variableList = ast.variableDeclarationList(
null, null, toAnalyzerToken(keyword), type, variables);
List<Annotation> metadata = pop();
// TODO(paulberry): capture doc comments. See dartbug.com/28851.
Comment comment = null;
push(ast.fieldDeclaration2(
comment: comment,
metadata: metadata,
covariantKeyword: toAnalyzerToken(covariantKeyword),
staticKeyword: toAnalyzerToken(staticKeyword),
fieldList: variableList,
semicolon: toAnalyzerToken(endToken)));
}
@override
void handleOperatorName(Token operatorKeyword, Token token) {
debugEvent("OperatorName");

View file

@ -295,7 +295,8 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
}
@override
void endFields(int count, Token beginToken, Token endToken) {
void endFields(
int count, Token covariantKeyword, Token beginToken, Token endToken) {
debugEvent("Fields");
doFields(count);
pop(); // Metadata.

View file

@ -179,8 +179,15 @@ class Listener {
logEvent("FormalParameters");
}
/// Handle the end of a field declaration. Substructures:
/// - Metadata
/// - Modifiers
/// - Type
/// - Variable declarations (count times)
///
/// Doesn't have a corresponding begin event, use [beginMember] instead.
void endFields(int count, Token beginToken, Token endToken) {
void endFields(
int count, Token covariantKeyword, Token beginToken, Token endToken) {
logEvent("Fields");
}

View file

@ -1165,8 +1165,15 @@ class Parser {
Token getOrSet, Token name, bool isTopLevel) {
bool hasType = type != null;
Token covariantKeyword;
if (getOrSet == null && !isTopLevel) {
modifiers = removeOptCovariantTokenIfNotStatic(modifiers);
// TODO(ahe): replace the method removeOptCovariantTokenIfNotStatic with
// a better mechanism.
Link<Token> newModifiers = removeOptCovariantTokenIfNotStatic(modifiers);
if (!identical(newModifiers, modifiers)) {
covariantKeyword = modifiers.first;
modifiers = newModifiers;
}
}
Token varFinalOrConst =
@ -1219,7 +1226,7 @@ class Parser {
if (isTopLevel) {
listener.endTopLevelFields(fieldCount, start, semicolon);
} else {
listener.endFields(fieldCount, start, semicolon);
listener.endFields(fieldCount, covariantKeyword, start, semicolon);
}
return token;
}
@ -1716,7 +1723,7 @@ class Parser {
token = reportUnrecoverableError(token, ErrorKind.UnexpectedToken);
if (identical(token.kind, EOF_TOKEN)) {
// TODO(ahe): This is a hack, see parseTopLevelMember.
listener.endFields(1, start, token);
listener.endFields(1, null, start, token);
listener.endMember();
return token;
}

View file

@ -183,7 +183,8 @@ class DietListener extends StackListener {
}
@override
void endFields(int count, Token beginToken, Token endToken) {
void endFields(
int count, Token covariantToken, Token beginToken, Token endToken) {
debugEvent("Fields");
List<String> names = popList(count);
Builder builder = lookupBuilder(beginToken, null, names.first);

View file

@ -491,7 +491,8 @@ class OutlineBuilder extends UnhandledListener {
}
@override
void endFields(int count, Token beginToken, Token endToken) {
void endFields(
int count, Token covariantToken, Token beginToken, Token endToken) {
debugEvent("Fields");
List<String> names = popList(count);
TypeBuilder type = pop();