Index: pkg/compiler/lib/src/parser/node_listener.dart |
diff --git a/pkg/compiler/lib/src/parser/node_listener.dart b/pkg/compiler/lib/src/parser/node_listener.dart |
index a312b0752ce3e112b95f529239155a34e7a8ad83..1e2e6c6a186d72504f06c05fac5ee19c9ee36d37 100644 |
--- a/pkg/compiler/lib/src/parser/node_listener.dart |
+++ b/pkg/compiler/lib/src/parser/node_listener.dart |
@@ -20,14 +20,17 @@ class NodeListener extends ElementListener { |
CompilationUnitElement element) |
: super(scannerOptions, reporter, element, null); |
+ @override |
void addLibraryTag(LibraryTag tag) { |
pushNode(tag); |
} |
+ @override |
void addPartOfTag(PartOf tag) { |
pushNode(tag); |
} |
+ @override |
void endLibraryName(Token libraryKeyword, Token semicolon) { |
Expression name = popNode(); |
pushNode(new LibraryName( |
@@ -38,6 +41,7 @@ class NodeListener extends ElementListener { |
null)); |
} |
+ @override |
void endImport(Token importKeyword, Token deferredKeyword, Token asKeyword, |
Token semicolon) { |
NodeList combinators = popNode(); |
@@ -56,6 +60,7 @@ class NodeListener extends ElementListener { |
isDeferred: deferredKeyword != null)); |
} |
+ @override |
void endExport(Token exportKeyword, Token semicolon) { |
NodeList combinators = popNode(); |
NodeList conditionalUris = popNode(); |
@@ -70,6 +75,7 @@ class NodeListener extends ElementListener { |
null)); |
} |
+ @override |
void endPart(Token partKeyword, Token semicolon) { |
StringNode uri = popLiteralString(); |
pushNode(new Part( |
@@ -80,6 +86,7 @@ class NodeListener extends ElementListener { |
null)); |
} |
+ @override |
void endPartOf(Token partKeyword, Token semicolon) { |
Expression name = popNode(); // name |
pushNode(new PartOf( |
@@ -90,6 +97,7 @@ class NodeListener extends ElementListener { |
null)); |
} |
+ @override |
void endClassDeclaration(int interfacesCount, Token beginToken, |
Token extendsKeyword, Token implementsKeyword, Token endToken) { |
NodeList body = popNode(); |
@@ -103,6 +111,7 @@ class NodeListener extends ElementListener { |
interfaces, beginToken, extendsKeyword, body, endToken)); |
} |
+ @override |
void endTopLevelDeclaration(Token token) { |
// TODO(sigmund): consider moving metadata into each declaration |
// element instead. |
@@ -112,10 +121,12 @@ class NodeListener extends ElementListener { |
super.endTopLevelDeclaration(token); |
} |
+ @override |
void endCompilationUnit(int count, Token token) { |
pushNode(makeNodeList(count, null, null, '\n')); |
} |
+ @override |
void endFunctionTypeAlias(Token typedefKeyword, Token endToken) { |
NodeList formals = popNode(); |
NodeList typeParameters = popNode(); |
@@ -125,6 +136,7 @@ class NodeListener extends ElementListener { |
returnType, name, typeParameters, formals, typedefKeyword, endToken)); |
} |
+ @override |
void endNamedMixinApplication( |
Token classKeyword, Token implementsKeyword, Token endToken) { |
NodeList interfaces = (implementsKeyword != null) ? popNode() : null; |
@@ -136,16 +148,19 @@ class NodeListener extends ElementListener { |
mixinApplication, interfaces, classKeyword, endToken)); |
} |
+ @override |
void endEnum(Token enumKeyword, Token endBrace, int count) { |
NodeList names = makeNodeList(count, enumKeyword.next.next, endBrace, ","); |
Identifier name = popNode(); |
pushNode(new Enum(enumKeyword, name, names)); |
} |
+ @override |
void endClassBody(int memberCount, Token beginToken, Token endToken) { |
pushNode(makeNodeList(memberCount, beginToken, endToken, null)); |
} |
+ @override |
void endTopLevelFields(int count, Token beginToken, Token endToken) { |
NodeList variables = makeNodeList(count, null, endToken, ","); |
TypeAnnotation type = popNode(); |
@@ -153,6 +168,7 @@ class NodeListener extends ElementListener { |
pushNode(new VariableDefinitions(type, modifiers, variables)); |
} |
+ @override |
void endTopLevelMethod(Token beginToken, Token getOrSet, Token endToken) { |
Statement body = popNode(); |
AsyncModifier asyncModifier = popNode(); |
@@ -165,6 +181,7 @@ class NodeListener extends ElementListener { |
modifiers, null, getOrSet, asyncModifier)); |
} |
+ @override |
void endFormalParameter(Token thisKeyword) { |
Expression name = popNode(); |
if (thisKeyword != null) { |
@@ -182,22 +199,27 @@ class NodeListener extends ElementListener { |
metadata, type, modifiers, new NodeList.singleton(name))); |
} |
+ @override |
void endFormalParameters(int count, Token beginToken, Token endToken) { |
pushNode(makeNodeList(count, beginToken, endToken, ",")); |
} |
+ @override |
void handleNoFormalParameters(Token token) { |
pushNode(null); |
} |
+ @override |
void endArguments(int count, Token beginToken, Token endToken) { |
pushNode(makeNodeList(count, beginToken, endToken, ",")); |
} |
+ @override |
void handleNoArguments(Token token) { |
pushNode(null); |
} |
+ @override |
void endConstructorReference( |
Token start, Token periodBeforeName, Token endToken) { |
Identifier name = null; |
@@ -229,21 +251,25 @@ class NodeListener extends ElementListener { |
pushNode(constructor); |
} |
+ @override |
void endRedirectingFactoryBody(Token beginToken, Token endToken) { |
pushNode(new RedirectingFactoryBody(beginToken, endToken, popNode())); |
} |
+ @override |
void endReturnStatement( |
bool hasExpression, Token beginToken, Token endToken) { |
Expression expression = hasExpression ? popNode() : null; |
pushNode(new Return(beginToken, endToken, expression)); |
} |
+ @override |
void endYieldStatement(Token yieldToken, Token starToken, Token endToken) { |
Expression expression = popNode(); |
pushNode(new Yield(yieldToken, starToken, expression, endToken)); |
} |
+ @override |
void endExpressionStatement(Token token) { |
pushNode(new ExpressionStatement(popNode(), token)); |
} |
@@ -253,6 +279,7 @@ class NodeListener extends ElementListener { |
"'${token.value}': ${errorInformation}"); |
} |
+ @override |
Token expectedFunctionBody(Token token) { |
if (identical(token.stringValue, 'native')) { |
return native.handleNativeFunctionBody(this, token); |
@@ -266,6 +293,7 @@ class NodeListener extends ElementListener { |
return skipToEof(token); |
} |
+ @override |
Token expectedClassBody(Token token) { |
if (token is ErrorToken) { |
reportErrorToken(token); |
@@ -277,27 +305,33 @@ class NodeListener extends ElementListener { |
} |
} |
+ @override |
void handleLiteralInt(Token token) { |
pushNode(new LiteralInt(token, (t, e) => handleOnError(t, e))); |
} |
+ @override |
void handleLiteralDouble(Token token) { |
pushNode(new LiteralDouble(token, (t, e) => handleOnError(t, e))); |
} |
+ @override |
void handleLiteralBool(Token token) { |
pushNode(new LiteralBool(token, (t, e) => handleOnError(t, e))); |
} |
+ @override |
void handleLiteralNull(Token token) { |
pushNode(new LiteralNull(token)); |
} |
+ @override |
void endLiteralSymbol(Token hashToken, int identifierCount) { |
NodeList identifiers = makeNodeList(identifierCount, null, null, '.'); |
pushNode(new LiteralSymbol(hashToken, identifiers)); |
} |
+ @override |
void handleBinaryExpression(Token token) { |
Node argument = popNode(); |
Node receiver = popNode(); |
@@ -331,14 +365,17 @@ class NodeListener extends ElementListener { |
} |
} |
+ @override |
void beginCascade(Token token) { |
pushNode(new CascadeReceiver(popNode(), token)); |
} |
+ @override |
void endCascade() { |
pushNode(new Cascade(popNode())); |
} |
+ @override |
void handleAsOperator(Token operator, Token endToken) { |
TypeAnnotation type = popNode(); |
Expression expression = popNode(); |
@@ -346,6 +383,7 @@ class NodeListener extends ElementListener { |
pushNode(new Send(expression, new Operator(operator), arguments)); |
} |
+ @override |
void handleAssignmentExpression(Token token) { |
Node arg = popNode(); |
Node node = popNode(); |
@@ -373,6 +411,7 @@ class NodeListener extends ElementListener { |
reportFatalError(node, 'Not assignable.'); |
} |
+ @override |
void handleConditionalExpression(Token question, Token colon) { |
Node elseExpression = popNode(); |
Node thenExpression = popNode(); |
@@ -381,6 +420,7 @@ class NodeListener extends ElementListener { |
condition, thenExpression, elseExpression, question, colon)); |
} |
+ @override |
void endSend(Token token) { |
NodeList arguments = popNode(); |
NodeList typeArguments = popNode(); |
@@ -389,6 +429,7 @@ class NodeListener extends ElementListener { |
pushNode(new Send(null, selector, arguments, typeArguments)); |
} |
+ @override |
void endFunctionBody(int count, Token beginToken, Token endToken) { |
if (count == 0 && beginToken == null) { |
pushNode(new EmptyStatement(endToken)); |
@@ -397,6 +438,7 @@ class NodeListener extends ElementListener { |
} |
} |
+ @override |
void handleAsyncModifier(Token asyncToken, Token starToken) { |
if (asyncToken != null) { |
pushNode(new AsyncModifier(asyncToken, starToken)); |
@@ -405,14 +447,17 @@ class NodeListener extends ElementListener { |
} |
} |
+ @override |
void skippedFunctionBody(Token token) { |
pushNode(new Block(new NodeList.empty())); |
} |
+ @override |
void handleNoFunctionBody(Token token) { |
pushNode(new EmptyStatement(token)); |
} |
+ @override |
void endFunction(Token getOrSet, Token endToken) { |
Statement body = popNode(); |
AsyncModifier asyncModifier = popNode(); |
@@ -427,10 +472,12 @@ class NodeListener extends ElementListener { |
modifiers, initializers, getOrSet, asyncModifier)); |
} |
+ @override |
void endFunctionDeclaration(Token endToken) { |
pushNode(new FunctionDeclaration(popNode())); |
} |
+ @override |
void endVariablesDeclaration(int count, Token endToken) { |
// TODO(ahe): Pick one name for this concept, either |
// VariablesDeclaration or VariableDefinitions. |
@@ -440,6 +487,7 @@ class NodeListener extends ElementListener { |
pushNode(new VariableDefinitions(type, modifiers, variables)); |
} |
+ @override |
void endInitializer(Token assignmentOperator) { |
Expression initializer = popNode(); |
NodeList arguments = |
@@ -449,6 +497,7 @@ class NodeListener extends ElementListener { |
pushNode(new SendSet(null, name, op, arguments)); |
} |
+ @override |
void endIfStatement(Token ifToken, Token elseToken) { |
Statement elsePart = (elseToken == null) ? null : popNode(); |
Statement thenPart = popNode(); |
@@ -456,6 +505,7 @@ class NodeListener extends ElementListener { |
pushNode(new If(condition, thenPart, elsePart, ifToken, elseToken)); |
} |
+ @override |
void endForStatement( |
int updateExpressionCount, Token beginToken, Token endToken) { |
Statement body = popNode(); |
@@ -465,10 +515,12 @@ class NodeListener extends ElementListener { |
pushNode(new For(initializer, condition, updates, body, beginToken)); |
} |
+ @override |
void handleNoExpression(Token token) { |
pushNode(null); |
} |
+ @override |
void endDoWhileStatement( |
Token doKeyword, Token whileKeyword, Token endToken) { |
Expression condition = popNode(); |
@@ -476,26 +528,31 @@ class NodeListener extends ElementListener { |
pushNode(new DoWhile(body, condition, doKeyword, whileKeyword, endToken)); |
} |
+ @override |
void endWhileStatement(Token whileKeyword, Token endToken) { |
Statement body = popNode(); |
Expression condition = popNode(); |
pushNode(new While(condition, body, whileKeyword)); |
} |
+ @override |
void endBlock(int count, Token beginToken, Token endToken) { |
pushNode(new Block(makeNodeList(count, beginToken, endToken, null))); |
} |
+ @override |
void endThrowExpression(Token throwToken, Token endToken) { |
Expression expression = popNode(); |
pushNode(new Throw(expression, throwToken, endToken)); |
} |
+ @override |
void endAwaitExpression(Token awaitToken, Token endToken) { |
Expression expression = popNode(); |
pushNode(new Await(awaitToken, expression)); |
} |
+ @override |
void endRethrowStatement(Token throwToken, Token endToken) { |
pushNode(new Rethrow(throwToken, endToken)); |
if (identical(throwToken.stringValue, 'throw')) { |
@@ -505,14 +562,17 @@ class NodeListener extends ElementListener { |
} |
} |
+ @override |
void handleUnaryPrefixExpression(Token token) { |
pushNode(new Send.prefix(popNode(), new Operator(token))); |
} |
+ @override |
void handleSuperExpression(Token token) { |
pushNode(new Identifier(token)); |
} |
+ @override |
void handleThisExpression(Token token) { |
pushNode(new Identifier(token)); |
} |
@@ -540,22 +600,27 @@ class NodeListener extends ElementListener { |
} |
} |
+ @override |
void handleUnaryPostfixAssignmentExpression(Token token) { |
handleUnaryAssignmentExpression(token, false); |
} |
+ @override |
void handleUnaryPrefixAssignmentExpression(Token token) { |
handleUnaryAssignmentExpression(token, true); |
} |
+ @override |
void endInitializers(int count, Token beginToken, Token endToken) { |
pushNode(makeNodeList(count, beginToken, null, ',')); |
} |
+ @override |
void handleNoInitializers() { |
pushNode(null); |
} |
+ @override |
void endMember() { |
// TODO(sigmund): consider moving metadata into each declaration |
// element instead. |
@@ -565,6 +630,7 @@ class NodeListener extends ElementListener { |
super.endMember(); |
} |
+ @override |
void endFields(int count, Token beginToken, Token endToken) { |
NodeList variables = makeNodeList(count, null, endToken, ","); |
TypeAnnotation type = popNode(); |
@@ -572,6 +638,7 @@ class NodeListener extends ElementListener { |
pushNode(new VariableDefinitions(type, modifiers, variables)); |
} |
+ @override |
void endMethod(Token getOrSet, Token beginToken, Token endToken) { |
Statement body = popNode(); |
AsyncModifier asyncModifier = popNode(); |
@@ -585,6 +652,7 @@ class NodeListener extends ElementListener { |
returnType, modifiers, initializers, getOrSet, asyncModifier)); |
} |
+ @override |
void handleLiteralMap( |
int count, Token beginToken, Token constKeyword, Token endToken) { |
NodeList entries = makeNodeList(count, beginToken, endToken, ','); |
@@ -592,18 +660,21 @@ class NodeListener extends ElementListener { |
pushNode(new LiteralMap(typeArguments, entries, constKeyword)); |
} |
+ @override |
void endLiteralMapEntry(Token colon, Token endToken) { |
Expression value = popNode(); |
Expression key = popNode(); |
pushNode(new LiteralMapEntry(key, colon, value)); |
} |
+ @override |
void handleLiteralList( |
int count, Token beginToken, Token constKeyword, Token endToken) { |
NodeList elements = makeNodeList(count, beginToken, endToken, ','); |
pushNode(new LiteralList(popNode(), elements, constKeyword)); |
} |
+ @override |
void handleIndexedExpression( |
Token openSquareBracket, Token closeSquareBracket) { |
NodeList arguments = |
@@ -615,37 +686,44 @@ class NodeListener extends ElementListener { |
pushNode(new Send(receiver, selector, arguments)); |
} |
+ @override |
void handleNewExpression(Token token) { |
NodeList arguments = popNode(); |
Node name = popNode(); |
pushNode(new NewExpression(token, new Send(null, name, arguments))); |
} |
+ @override |
void handleConstExpression(Token token) { |
// [token] carries the 'const' information. |
handleNewExpression(token); |
} |
+ @override |
void handleOperator(Token token) { |
pushNode(new Operator(token)); |
} |
+ @override |
void handleOperatorName(Token operatorKeyword, Token token) { |
Operator op = new Operator(token); |
pushNode(new Send(new Identifier(operatorKeyword), op, null)); |
} |
+ @override |
void handleNamedArgument(Token colon) { |
Expression expression = popNode(); |
Identifier name = popNode(); |
pushNode(new NamedArgument(name, colon, expression)); |
} |
+ @override |
void endOptionalFormalParameters( |
int count, Token beginToken, Token endToken) { |
pushNode(makeNodeList(count, beginToken, endToken, ',')); |
} |
+ @override |
void handleFunctionTypedFormalParameter(Token endToken) { |
NodeList formals = popNode(); |
NodeList typeVariables = popNode(); |
@@ -656,6 +734,7 @@ class NodeListener extends ElementListener { |
returnType, Modifiers.EMPTY, null, null, null)); |
} |
+ @override |
void handleValuedFormalParameter(Token equals, Token token) { |
Expression defaultValue = popNode(); |
Expression parameterName = popNode(); |
@@ -663,6 +742,7 @@ class NodeListener extends ElementListener { |
new NodeList.singleton(defaultValue))); |
} |
+ @override |
void endTryStatement(int catchCount, Token tryKeyword, Token finallyKeyword) { |
Block finallyBlock = null; |
if (finallyKeyword != null) { |
@@ -674,10 +754,12 @@ class NodeListener extends ElementListener { |
tryBlock, catchBlocks, finallyBlock, tryKeyword, finallyKeyword)); |
} |
+ @override |
void handleCaseMatch(Token caseKeyword, Token colon) { |
pushNode(new CaseMatch(caseKeyword, popNode(), colon)); |
} |
+ @override |
void handleCatchBlock(Token onKeyword, Token catchKeyword) { |
Block block = popNode(); |
NodeList formals = catchKeyword != null ? popNode() : null; |
@@ -685,12 +767,14 @@ class NodeListener extends ElementListener { |
pushNode(new CatchBlock(type, formals, block, onKeyword, catchKeyword)); |
} |
+ @override |
void endSwitchStatement(Token switchKeyword, Token endToken) { |
NodeList cases = popNode(); |
ParenthesizedExpression expression = popNode(); |
pushNode(new SwitchStatement(expression, cases, switchKeyword)); |
} |
+ @override |
void endSwitchBlock(int caseCount, Token beginToken, Token endToken) { |
Link<Node> caseNodes = const Link<Node>(); |
while (caseCount > 0) { |
@@ -701,6 +785,7 @@ class NodeListener extends ElementListener { |
pushNode(new NodeList(beginToken, caseNodes, endToken, null)); |
} |
+ @override |
void handleSwitchCase(int labelCount, int caseCount, Token defaultKeyword, |
int statementCount, Token firstToken, Token endToken) { |
NodeList statements = makeNodeList(statementCount, null, null, null); |
@@ -710,6 +795,7 @@ class NodeListener extends ElementListener { |
new SwitchCase(labelsAndCases, defaultKeyword, statements, firstToken)); |
} |
+ @override |
void handleBreakStatement( |
bool hasTarget, Token breakKeyword, Token endToken) { |
Identifier target = null; |
@@ -719,6 +805,7 @@ class NodeListener extends ElementListener { |
pushNode(new BreakStatement(target, breakKeyword, endToken)); |
} |
+ @override |
void handleContinueStatement( |
bool hasTarget, Token continueKeyword, Token endToken) { |
Identifier target = null; |
@@ -728,10 +815,12 @@ class NodeListener extends ElementListener { |
pushNode(new ContinueStatement(target, continueKeyword, endToken)); |
} |
+ @override |
void handleEmptyStatement(Token token) { |
pushNode(new EmptyStatement(token)); |
} |
+ @override |
void endFactoryMethod(Token beginToken, Token endToken) { |
super.endFactoryMethod(beginToken, endToken); |
Statement body = popNode(); |
@@ -762,6 +851,7 @@ class NodeListener extends ElementListener { |
name, null, formals, body, null, modifiers, null, null, asyncModifier)); |
} |
+ @override |
void endForIn( |
Token awaitToken, Token forToken, Token inKeyword, Token endToken) { |
Statement body = popNode(); |
@@ -776,6 +866,7 @@ class NodeListener extends ElementListener { |
} |
} |
+ @override |
void endMetadataStar(int count, bool forParameter) { |
if (0 == count) { |
pushNode(null); |
@@ -784,6 +875,7 @@ class NodeListener extends ElementListener { |
} |
} |
+ @override |
void endMetadata(Token beginToken, Token periodBeforeName, Token endToken) { |
NodeList arguments = popNode(); |
if (arguments == null) { |
@@ -820,6 +912,7 @@ class NodeListener extends ElementListener { |
} |
} |
+ @override |
void handleAssertStatement( |
Token assertKeyword, Token commaToken, Token semicolonToken) { |
Node message; |
@@ -831,6 +924,7 @@ class NodeListener extends ElementListener { |
pushNode(new Assert(assertKeyword, condition, message, semicolonToken)); |
} |
+ @override |
void endUnnamedFunction(Token token) { |
Statement body = popNode(); |
AsyncModifier asyncModifier = popNode(); |
@@ -840,6 +934,7 @@ class NodeListener extends ElementListener { |
Modifiers.EMPTY, null, null, asyncModifier)); |
} |
+ @override |
void handleIsOperator(Token operator, Token not, Token endToken) { |
TypeAnnotation type = popNode(); |
Expression expression = popNode(); |
@@ -854,17 +949,20 @@ class NodeListener extends ElementListener { |
pushNode(new Send(expression, new Operator(operator), arguments)); |
} |
+ @override |
void handleLabel(Token colon) { |
Identifier name = popNode(); |
pushNode(new Label(name, colon)); |
} |
+ @override |
void endLabeledStatement(int labelCount) { |
Statement statement = popNode(); |
NodeList labels = makeNodeList(labelCount, null, null, null); |
pushNode(new LabeledStatement(labels, statement)); |
} |
+ @override |
void log(message) { |
reporter.log(message); |
} |