Implement AstBuilder.handleOperatorName.

R=scheglov@google.com

Review-Url: https://codereview.chromium.org/2723873002 .
This commit is contained in:
Paul Berry 2017-02-28 16:36:03 -08:00
parent c9442bb8a2
commit 8849a29406
3 changed files with 26 additions and 25 deletions

View file

@ -169,20 +169,6 @@ class ClassMemberParserTest_Fasta extends FastaParserTestCase
super.test_parseClassMember_operator_functionType();
}
@override
@failingTest
void test_parseClassMember_operator_index() {
// TODO(paulberry): Unhandled event: OperatorName
super.test_parseClassMember_operator_index();
}
@override
@failingTest
void test_parseClassMember_operator_indexAssign() {
// TODO(paulberry): Unhandled event: OperatorName
super.test_parseClassMember_operator_indexAssign();
}
@override
@failingTest
void test_parseClassMember_redirectingFactory_const() {
@ -256,7 +242,7 @@ class ClassMemberParserTest_Fasta extends FastaParserTestCase
@override
@failingTest
void test_parseOperator() {
// TODO(paulberry): Unhandled event: OperatorName
// TODO(paulberry): handle doc comments
super.test_parseOperator();
}

View file

@ -1147,7 +1147,6 @@ class AstBuilder extends ScopeListener {
FormalParameterList parameters = pop();
TypeParameterList typeParameters = pop(); // TODO(paulberry)
var name = pop();
Token operatorKeyword = null; // TODO(paulberry)
TypeAnnotation returnType = pop(); // TODO(paulberry)
Token modifierKeyword = null; // TODO(paulberry)
Token externalKeyword = null;
@ -1174,19 +1173,17 @@ class AstBuilder extends ScopeListener {
List<Annotation> metadata = pop();
// TODO(paulberry): capture doc comments. See dartbug.com/28851.
Comment comment = null;
SimpleIdentifier returnType2;
Token period;
SimpleIdentifier name2;
void unnamedConstructor() {
void unnamedConstructor(SimpleIdentifier returnType, SimpleIdentifier name) {
push(ast.constructorDeclaration(
comment,
metadata,
toAnalyzerToken(externalKeyword),
toAnalyzerToken(constKeyword),
toAnalyzerToken(factoryKeyword),
returnType2,
returnType,
toAnalyzerToken(period),
name2,
name,
parameters,
toAnalyzerToken(separator),
initializers,
@ -1194,7 +1191,7 @@ class AstBuilder extends ScopeListener {
body));
}
void method() {
void method(Token operatorKeyword, SimpleIdentifier name) {
push(ast.methodDeclaration(
comment,
metadata,
@ -1210,12 +1207,13 @@ class AstBuilder extends ScopeListener {
}
if (name is SimpleIdentifier) {
returnType2 = name;
if (name.name == className) {
unnamedConstructor();
unnamedConstructor(name, null);
} else {
method();
method(null, name);
}
} else if (name is _OperatorName) {
method(name.operatorKeyword, name.name);
} else {
throw new UnimplementedError();
}
@ -1312,6 +1310,13 @@ class AstBuilder extends ScopeListener {
toAnalyzerToken(beginToken), arguments, toAnalyzerToken(endToken)));
}
@override
void handleOperatorName(Token operatorKeyword, Token token) {
debugEvent("OperatorName");
push(new _OperatorName(operatorKeyword,
ast.simpleIdentifier(toAnalyzerToken(token), isDeclaration: true)));
}
/**
* Pop the modifiers list, if the list is empty return `null`, if the list
* has one item return it; otherwise return `null`.
@ -1390,3 +1395,12 @@ class _OptionalFormalParameters {
_OptionalFormalParameters(
this.parameters, this.leftDelimiter, this.rightDelimiter);
}
/// Data structure placed on the stack to represent the keyword "operator"
/// followed by a token.
class _OperatorName {
final Token operatorKeyword;
final SimpleIdentifier name;
_OperatorName(this.operatorKeyword, this.name);
}

View file

@ -854,6 +854,7 @@ class Listener {
logEvent("Operator");
}
/// Handle the end of a construct of the form "operator <token>".
void handleOperatorName(Token operatorKeyword, Token token) {
logEvent("OperatorName");
}