| 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);
|
| }
|
|
|