Index: pkg/compiler/lib/src/scanner/class_element_parser.dart |
diff --git a/pkg/compiler/lib/src/scanner/class_element_parser.dart b/pkg/compiler/lib/src/scanner/class_element_parser.dart |
deleted file mode 100644 |
index 6c43527c1404132e7689f7b9acba432bd0b6fe2d..0000000000000000000000000000000000000000 |
--- a/pkg/compiler/lib/src/scanner/class_element_parser.dart |
+++ /dev/null |
@@ -1,222 +0,0 @@ |
-// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE file. |
- |
-part of scanner; |
- |
-class ClassElementParser extends PartialParser { |
- ClassElementParser(Listener listener) : super(listener); |
- |
- Token parseClassBody(Token token) => fullParseClassBody(token); |
-} |
- |
-class PartialClassElement extends ClassElementX with PartialElement { |
- ClassNode cachedNode; |
- |
- PartialClassElement(String name, |
- Token beginToken, |
- Token endToken, |
- Element enclosing, |
- int id) |
- : super(name, enclosing, id, STATE_NOT_STARTED) { |
- this.beginToken = beginToken; |
- this.endToken = endToken; |
- } |
- |
- void set supertypeLoadState(int state) { |
- assert(state == supertypeLoadState + 1); |
- assert(state <= STATE_DONE); |
- super.supertypeLoadState = state; |
- } |
- |
- void set resolutionState(int state) { |
- assert(state == resolutionState + 1); |
- assert(state <= STATE_DONE); |
- super.resolutionState = state; |
- } |
- |
- bool get hasNode => cachedNode != null; |
- |
- ClassNode get node { |
- assert(invariant(this, cachedNode != null, |
- message: "Node has not been computed for $this.")); |
- return cachedNode; |
- } |
- |
- ClassNode parseNode(Compiler compiler) { |
- if (cachedNode != null) return cachedNode; |
- compiler.withCurrentElement(this, () { |
- compiler.parser.measure(() { |
- MemberListener listener = new MemberListener(compiler, this); |
- Parser parser = new ClassElementParser(listener); |
- Token token = parser.parseTopLevelDeclaration(beginToken); |
- assert(identical(token, endToken.next)); |
- cachedNode = listener.popNode(); |
- assert(invariant(beginToken, listener.nodes.isEmpty, |
- message: "Non-empty listener stack: ${listener.nodes}")); |
- }); |
- compiler.patchParser.measure(() { |
- if (isPatched) { |
- // TODO(lrn): Perhaps extract functionality so it doesn't |
- // need compiler. |
- compiler.patchParser.parsePatchClassNode(patch); |
- } |
- }); |
- }); |
- return cachedNode; |
- } |
- |
- Token get position => beginToken; |
- |
- // TODO(johnniwinther): Ensure that modifiers are always available. |
- Modifiers get modifiers => |
- cachedNode != null ? cachedNode.modifiers : Modifiers.EMPTY; |
- |
- accept(ElementVisitor visitor) => visitor.visitClassElement(this); |
-} |
- |
-class MemberListener extends NodeListener { |
- final ClassElement enclosingElement; |
- |
- MemberListener(DiagnosticListener listener, |
- Element enclosingElement) |
- : this.enclosingElement = enclosingElement, |
- super(listener, enclosingElement.compilationUnit); |
- |
- bool isConstructorName(Node nameNode) { |
- if (enclosingElement == null || |
- enclosingElement.kind != ElementKind.CLASS) { |
- return false; |
- } |
- String name; |
- if (nameNode.asIdentifier() != null) { |
- name = nameNode.asIdentifier().source; |
- } else { |
- Send send = nameNode.asSend(); |
- name = send.receiver.asIdentifier().source; |
- } |
- return enclosingElement.name == name; |
- } |
- |
- // TODO(johnniwinther): Remove this method. |
- String getMethodNameHack(Node methodName) { |
- Send send = methodName.asSend(); |
- if (send == null) { |
- if (isConstructorName(methodName)) return ''; |
- return methodName.asIdentifier().source; |
- } |
- Identifier receiver = send.receiver.asIdentifier(); |
- Identifier selector = send.selector.asIdentifier(); |
- Operator operator = selector.asOperator(); |
- if (operator != null) { |
- assert(identical(receiver.source, 'operator')); |
- // TODO(ahe): It is a hack to compare to ')', but it beats |
- // parsing the node. |
- bool isUnary = identical(operator.token.next.next.stringValue, ')'); |
- return Elements.constructOperatorName(operator.source, isUnary); |
- } else { |
- if (receiver == null || receiver.source != enclosingElement.name) { |
- listener.reportError(send.receiver, |
- MessageKind.INVALID_CONSTRUCTOR_NAME, |
- {'name': enclosingElement.name}); |
- } |
- return selector.source; |
- } |
- } |
- |
- void endMethod(Token getOrSet, Token beginToken, Token endToken) { |
- super.endMethod(getOrSet, beginToken, endToken); |
- FunctionExpression method = popNode(); |
- pushNode(null); |
- bool isConstructor = isConstructorName(method.name); |
- String name = getMethodNameHack(method.name); |
- Element memberElement; |
- if (isConstructor) { |
- if (getOrSet != null) { |
- recoverableError(getOrSet, 'illegal modifier'); |
- } |
- memberElement = new PartialConstructorElement( |
- name, beginToken, endToken, |
- ElementKind.GENERATIVE_CONSTRUCTOR, |
- method.modifiers, |
- enclosingElement); |
- } else { |
- ElementKind kind = ElementKind.FUNCTION; |
- if (getOrSet != null) { |
- kind = (identical(getOrSet.stringValue, 'get')) |
- ? ElementKind.GETTER : ElementKind.SETTER; |
- } |
- memberElement = |
- new PartialFunctionElement(name, beginToken, getOrSet, endToken, |
- kind, method.modifiers, enclosingElement, |
- !method.hasBody()); |
- } |
- addMember(memberElement); |
- } |
- |
- void endFactoryMethod(Token beginToken, Token endToken) { |
- super.endFactoryMethod(beginToken, endToken); |
- FunctionExpression method = popNode(); |
- pushNode(null); |
- String name = getMethodNameHack(method.name); |
- Identifier singleIdentifierName = method.name.asIdentifier(); |
- if (singleIdentifierName != null && singleIdentifierName.source == name) { |
- if (name != enclosingElement.name) { |
- listener.reportError(singleIdentifierName, |
- MessageKind.INVALID_UNNAMED_CONSTRUCTOR_NAME, |
- {'name': enclosingElement.name}); |
- } |
- } |
- ElementKind kind = ElementKind.FUNCTION; |
- Element memberElement = new PartialConstructorElement( |
- name, beginToken, endToken, |
- ElementKind.FUNCTION, |
- method.modifiers, |
- enclosingElement); |
- addMember(memberElement); |
- } |
- |
- void endFields(int count, Token beginToken, Token endToken) { |
- bool hasParseError = memberErrors.head; |
- super.endFields(count, beginToken, endToken); |
- VariableDefinitions variableDefinitions = popNode(); |
- Modifiers modifiers = variableDefinitions.modifiers; |
- pushNode(null); |
- void buildFieldElement(Identifier name, VariableList fields) { |
- Element element = |
- new FieldElementX(name, enclosingElement, fields); |
- addMember(element); |
- } |
- buildFieldElements(modifiers, variableDefinitions.definitions, |
- enclosingElement, |
- buildFieldElement, beginToken, endToken, |
- hasParseError); |
- } |
- |
- void endInitializer(Token assignmentOperator) { |
- pushNode(null); // Super expects an expression, but |
- // ClassElementParser just skips expressions. |
- super.endInitializer(assignmentOperator); |
- } |
- |
- void endInitializers(int count, Token beginToken, Token endToken) { |
- pushNode(null); |
- } |
- |
- void addMember(Element memberElement) { |
- for (Link link = metadata; !link.isEmpty; link = link.tail) { |
- memberElement.addMetadata(link.head); |
- } |
- metadata = const Link<MetadataAnnotation>(); |
- enclosingElement.addMember(memberElement, listener); |
- } |
- |
- void endMetadata(Token beginToken, Token periodBeforeName, Token endToken) { |
- popNode(); // Discard arguments. |
- if (periodBeforeName != null) { |
- popNode(); // Discard name. |
- } |
- popNode(); // Discard node (Send or Identifier). |
- pushMetadata(new PartialMetadataAnnotation(beginToken, endToken)); |
- } |
-} |