mirror of
https://github.com/dart-lang/sdk
synced 2024-10-14 09:12:08 +00:00
Add AstBuilder support for fields.
R=ahe@google.com, scheglov@google.com Review-Url: https://codereview.chromium.org/2723883002 .
This commit is contained in:
parent
9fa139215b
commit
8decc11ac0
|
@ -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() {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in a new issue