| Index: pkg/compiler/lib/src/parser/element_listener.dart
|
| diff --git a/pkg/compiler/lib/src/parser/element_listener.dart b/pkg/compiler/lib/src/parser/element_listener.dart
|
| index bc2101ec38175bff85b601ecc3ec55d6cfb72062..7852b571dffe24a6daf097966165f823cb30afa4 100644
|
| --- a/pkg/compiler/lib/src/parser/element_listener.dart
|
| +++ b/pkg/compiler/lib/src/parser/element_listener.dart
|
| @@ -124,12 +124,14 @@ class ElementListener extends Listener {
|
| library.entryCompilationUnit == compilationUnitElement;
|
| }
|
|
|
| + @override
|
| void endLibraryName(Token libraryKeyword, Token semicolon) {
|
| Expression name = popNode();
|
| addLibraryTag(new LibraryName(
|
| libraryKeyword, name, popMetadata(compilationUnitElement)));
|
| }
|
|
|
| + @override
|
| void endImport(Token importKeyword, Token deferredKeyword, Token asKeyword,
|
| Token semicolon) {
|
| NodeList combinators = popNode();
|
| @@ -145,11 +147,13 @@ class ElementListener extends Listener {
|
| isDeferred: isDeferred));
|
| }
|
|
|
| + @override
|
| void endDottedName(int count, Token token) {
|
| NodeList identifiers = makeNodeList(count, null, null, '.');
|
| pushNode(new DottedName(token, identifiers));
|
| }
|
|
|
| + @override
|
| void endConditionalUris(int count) {
|
| if (count == 0) {
|
| pushNode(null);
|
| @@ -158,6 +162,7 @@ class ElementListener extends Listener {
|
| }
|
| }
|
|
|
| + @override
|
| void endConditionalUri(Token ifToken, Token equalSign) {
|
| StringNode uri = popNode();
|
| LiteralString conditionValue = (equalSign != null) ? popNode() : null;
|
| @@ -165,6 +170,7 @@ class ElementListener extends Listener {
|
| pushNode(new ConditionalUri(ifToken, identifier, conditionValue, uri));
|
| }
|
|
|
| + @override
|
| void endEnum(Token enumKeyword, Token endBrace, int count) {
|
| NodeList names = makeNodeList(count, enumKeyword.next.next, endBrace, ",");
|
| Identifier name = popNode();
|
| @@ -176,6 +182,7 @@ class ElementListener extends Listener {
|
| rejectBuiltInIdentifier(name);
|
| }
|
|
|
| + @override
|
| void endExport(Token exportKeyword, Token semicolon) {
|
| NodeList combinators = popNode();
|
| NodeList conditionalUris = popNode();
|
| @@ -184,6 +191,7 @@ class ElementListener extends Listener {
|
| popMetadata(compilationUnitElement)));
|
| }
|
|
|
| + @override
|
| void endCombinators(int count) {
|
| if (0 == count) {
|
| pushNode(null);
|
| @@ -192,8 +200,10 @@ class ElementListener extends Listener {
|
| }
|
| }
|
|
|
| + @override
|
| void endHide(Token hideKeyword) => pushCombinator(hideKeyword);
|
|
|
| + @override
|
| void endShow(Token showKeyword) => pushCombinator(showKeyword);
|
|
|
| void pushCombinator(Token keywordToken) {
|
| @@ -201,20 +211,24 @@ class ElementListener extends Listener {
|
| pushNode(new Combinator(identifiers, keywordToken));
|
| }
|
|
|
| + @override
|
| void endIdentifierList(int count) {
|
| pushNode(makeNodeList(count, null, null, ","));
|
| }
|
|
|
| + @override
|
| void endTypeList(int count) {
|
| pushNode(makeNodeList(count, null, null, ","));
|
| }
|
|
|
| + @override
|
| void endPart(Token partKeyword, Token semicolon) {
|
| StringNode uri = popLiteralString();
|
| addLibraryTag(
|
| new Part(partKeyword, uri, popMetadata(compilationUnitElement)));
|
| }
|
|
|
| + @override
|
| void endPartOf(Token partKeyword, Token semicolon) {
|
| Expression name = popNode();
|
| addPartOfTag(
|
| @@ -225,6 +239,7 @@ class ElementListener extends Listener {
|
| compilationUnitElement.setPartOf(tag, reporter);
|
| }
|
|
|
| + @override
|
| void endMetadata(Token beginToken, Token periodBeforeName, Token endToken) {
|
| if (periodBeforeName != null) {
|
| popNode(); // Discard name.
|
| @@ -233,6 +248,7 @@ class ElementListener extends Listener {
|
| pushMetadata(new PartialMetadataAnnotation(beginToken, endToken));
|
| }
|
|
|
| + @override
|
| void endTopLevelDeclaration(Token token) {
|
| if (!metadata.isEmpty) {
|
| MetadataAnnotationX first = metadata.first;
|
| @@ -242,6 +258,7 @@ class ElementListener extends Listener {
|
| }
|
| }
|
|
|
| + @override
|
| void endClassDeclaration(int interfacesCount, Token beginToken,
|
| Token extendsKeyword, Token implementsKeyword, Token endToken) {
|
| makeNodeList(interfacesCount, implementsKeyword, null, ","); // interfaces
|
| @@ -264,6 +281,7 @@ class ElementListener extends Listener {
|
| }
|
| }
|
|
|
| + @override
|
| void endFunctionTypeAlias(Token typedefKeyword, Token endToken) {
|
| popNode(); // TODO(karlklose): do not throw away typeVariables.
|
| Identifier name = popNode();
|
| @@ -273,6 +291,7 @@ class ElementListener extends Listener {
|
| rejectBuiltInIdentifier(name);
|
| }
|
|
|
| + @override
|
| void endNamedMixinApplication(
|
| Token classKeyword, Token implementsKeyword, Token endToken) {
|
| NodeList interfaces = (implementsKeyword != null) ? popNode() : null;
|
| @@ -296,16 +315,19 @@ class ElementListener extends Listener {
|
| rejectBuiltInIdentifier(name);
|
| }
|
|
|
| + @override
|
| void endMixinApplication() {
|
| NodeList mixins = popNode();
|
| TypeAnnotation superclass = popNode();
|
| pushNode(new MixinApplication(superclass, mixins));
|
| }
|
|
|
| + @override
|
| void handleVoidKeyword(Token token) {
|
| pushNode(new TypeAnnotation(new Identifier(token), null));
|
| }
|
|
|
| + @override
|
| void endTopLevelMethod(Token beginToken, Token getOrSet, Token endToken) {
|
| bool hasParseError = currentMemberHasParseError;
|
| memberErrors = memberErrors.tail;
|
| @@ -319,6 +341,7 @@ class ElementListener extends Listener {
|
| pushElement(element);
|
| }
|
|
|
| + @override
|
| void endTopLevelFields(int count, Token beginToken, Token endToken) {
|
| bool hasParseError = currentMemberHasParseError;
|
| memberErrors = memberErrors.tail;
|
| @@ -355,20 +378,24 @@ class ElementListener extends Listener {
|
| }
|
| }
|
|
|
| + @override
|
| void handleIdentifier(Token token) {
|
| pushNode(new Identifier(token));
|
| }
|
|
|
| + @override
|
| void handleQualified(Token period) {
|
| Identifier last = popNode();
|
| Expression first = popNode();
|
| pushNode(new Send(first, last));
|
| }
|
|
|
| + @override
|
| void handleNoType(Token token) {
|
| pushNode(null);
|
| }
|
|
|
| + @override
|
| void endTypeVariable(Token token, Token extendsOrSuper) {
|
| TypeAnnotation bound = popNode();
|
| Identifier name = popNode();
|
| @@ -376,37 +403,45 @@ class ElementListener extends Listener {
|
| rejectBuiltInIdentifier(name);
|
| }
|
|
|
| + @override
|
| void endTypeVariables(int count, Token beginToken, Token endToken) {
|
| pushNode(makeNodeList(count, beginToken, endToken, ','));
|
| }
|
|
|
| + @override
|
| void handleNoTypeVariables(Token token) {
|
| pushNode(null);
|
| }
|
|
|
| + @override
|
| void endTypeArguments(int count, Token beginToken, Token endToken) {
|
| pushNode(makeNodeList(count, beginToken, endToken, ','));
|
| }
|
|
|
| + @override
|
| void handleNoTypeArguments(Token token) {
|
| pushNode(null);
|
| }
|
|
|
| + @override
|
| void endType(Token beginToken, Token endToken) {
|
| NodeList typeArguments = popNode();
|
| Expression typeName = popNode();
|
| pushNode(new TypeAnnotation(typeName, typeArguments));
|
| }
|
|
|
| + @override
|
| void handleParenthesizedExpression(BeginGroupToken token) {
|
| Expression expression = popNode();
|
| pushNode(new ParenthesizedExpression(expression, token));
|
| }
|
|
|
| + @override
|
| void handleModifier(Token token) {
|
| pushNode(new Identifier(token));
|
| }
|
|
|
| + @override
|
| void handleModifiers(int count) {
|
| if (count == 0) {
|
| pushNode(Modifiers.EMPTY);
|
| @@ -416,6 +451,7 @@ class ElementListener extends Listener {
|
| }
|
| }
|
|
|
| + @override
|
| Token expected(String string, Token token) {
|
| if (token is ErrorToken) {
|
| reportErrorToken(token);
|
| @@ -498,6 +534,7 @@ class ElementListener extends Listener {
|
| return null;
|
| }
|
|
|
| + @override
|
| Token expectedIdentifier(Token token) {
|
| if (token is KeywordToken) {
|
| reportError(token, MessageKind.EXPECTED_IDENTIFIER_NOT_RESERVED_WORD,
|
| @@ -511,6 +548,7 @@ class ElementListener extends Listener {
|
| return token;
|
| }
|
|
|
| + @override
|
| Token expectedType(Token token) {
|
| pushNode(null);
|
| if (token is ErrorToken) {
|
| @@ -522,6 +560,7 @@ class ElementListener extends Listener {
|
| }
|
| }
|
|
|
| + @override
|
| Token expectedExpression(Token token) {
|
| if (token is ErrorToken) {
|
| reportErrorToken(token);
|
| @@ -535,6 +574,7 @@ class ElementListener extends Listener {
|
| }
|
| }
|
|
|
| + @override
|
| Token unexpected(Token token) {
|
| if (token is ErrorToken) {
|
| reportErrorToken(token);
|
| @@ -548,6 +588,7 @@ class ElementListener extends Listener {
|
| return skipToEof(token);
|
| }
|
|
|
| + @override
|
| Token expectedBlockToSkip(Token token) {
|
| if (identical(token.stringValue, 'native')) {
|
| return native.handleNativeBlockToSkip(this, token);
|
| @@ -556,6 +597,7 @@ class ElementListener extends Listener {
|
| }
|
| }
|
|
|
| + @override
|
| Token expectedFunctionBody(Token token) {
|
| if (token is ErrorToken) {
|
| reportErrorToken(token);
|
| @@ -567,6 +609,7 @@ class ElementListener extends Listener {
|
| return skipToEof(token);
|
| }
|
|
|
| + @override
|
| Token expectedClassBody(Token token) {
|
| if (token is ErrorToken) {
|
| reportErrorToken(token);
|
| @@ -577,10 +620,12 @@ class ElementListener extends Listener {
|
| return skipToEof(token);
|
| }
|
|
|
| + @override
|
| Token expectedClassBodyToSkip(Token token) {
|
| return unexpected(token);
|
| }
|
|
|
| + @override
|
| Token expectedDeclaration(Token token) {
|
| if (token is ErrorToken) {
|
| reportErrorToken(token);
|
| @@ -591,6 +636,7 @@ class ElementListener extends Listener {
|
| return skipToEof(token);
|
| }
|
|
|
| + @override
|
| Token unmatched(Token token) {
|
| if (token is ErrorToken) {
|
| reportErrorToken(token);
|
| @@ -668,6 +714,7 @@ class ElementListener extends Listener {
|
| return new NodeList(beginToken, poppedNodes, endToken, delimiter);
|
| }
|
|
|
| + @override
|
| void beginLiteralString(Token token) {
|
| String source = token.value;
|
| StringQuoting quoting = StringValidator.quotingFromString(source);
|
| @@ -677,12 +724,14 @@ class ElementListener extends Listener {
|
| pushNode(new LiteralString(token, null));
|
| }
|
|
|
| + @override
|
| void handleStringPart(Token token) {
|
| // Just push an unvalidated token now, and replace it when we know the
|
| // end of the interpolation.
|
| pushNode(new LiteralString(token, null));
|
| }
|
|
|
| + @override
|
| void endLiteralString(int count) {
|
| StringQuoting quoting = popQuoting();
|
|
|
| @@ -716,6 +765,7 @@ class ElementListener extends Listener {
|
| }
|
| }
|
|
|
| + @override
|
| void handleStringJuxtaposition(int stringCount) {
|
| assert(stringCount != 0);
|
| Expression accumulator = popNode();
|
| @@ -728,14 +778,17 @@ class ElementListener extends Listener {
|
| pushNode(accumulator);
|
| }
|
|
|
| + @override
|
| void beginMember(Token token) {
|
| memberErrors = memberErrors.prepend(false);
|
| }
|
|
|
| + @override
|
| void beginTopLevelMember(Token token) {
|
| beginMember(token);
|
| }
|
|
|
| + @override
|
| void endMember() {
|
| memberErrors = memberErrors.tail;
|
| }
|
|
|