| OLD | NEW |
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 class ClassElementParser extends PartialParser { | 5 class ClassElementParser extends PartialParser { |
| 6 ClassElementParser(Listener listener) : super(listener); | 6 ClassElementParser(Listener listener) : super(listener); |
| 7 | 7 |
| 8 Token parseClassBody(Token token) => fullParseClassBody(token); | 8 Token parseClassBody(Token token) => fullParseClassBody(token); |
| 9 } | 9 } |
| 10 | 10 |
| 11 class PartialClassElement extends ClassElement { | 11 class PartialClassElement extends ClassElement { |
| 12 final Token beginToken; | 12 final Token beginToken; |
| 13 final Token endToken; | 13 final Token endToken; |
| 14 Node cachedNode; | 14 Node cachedNode; |
| 15 | 15 |
| 16 PartialClassElement(SourceString name, | 16 PartialClassElement(SourceString name, |
| 17 Token this.beginToken, | 17 Token this.beginToken, |
| 18 Token this.endToken, | 18 Token this.endToken, |
| 19 CompilationUnitElement enclosing) | 19 CompilationUnitElement enclosing) |
| 20 : super(name, enclosing); | 20 : super(name, enclosing); |
| 21 | 21 |
| 22 ClassNode parseNode(Canceler canceler, Logger logger) { | 22 ClassNode parseNode(Canceler canceler, Logger logger) { |
| 23 if (cachedNode != null) return cachedNode; | 23 if (cachedNode != null) return cachedNode; |
| 24 MemberListener listener = new MemberListener(canceler, logger, this); | 24 MemberListener listener = new MemberListener(canceler, logger, this); |
| 25 Parser parser = new ClassElementParser(listener); | 25 Parser parser = new ClassElementParser(listener); |
| 26 Token token = parser.parseClass(beginToken); | 26 Token token = parser.parseClass(beginToken); |
| 27 assert(token === endToken.next); | 27 assert(token === endToken.next); |
| 28 cachedNode = listener.popNode(); | 28 cachedNode = listener.popNode(); |
| 29 assert(listener.nodes.isEmpty()); | 29 assert(listener.nodes.isEmpty()); |
| 30 assert(listener.topLevelElements.isEmpty()); | |
| 31 return cachedNode; | 30 return cachedNode; |
| 32 } | 31 } |
| 33 | 32 |
| 34 Token position() => beginToken; | 33 Token position() => beginToken; |
| 35 } | 34 } |
| 36 | 35 |
| 37 class MemberListener extends NodeListener { | 36 class MemberListener extends NodeListener { |
| 38 final ClassElement enclosingElement; | 37 final ClassElement enclosingElement; |
| 39 | 38 |
| 40 MemberListener(Canceler canceler, Logger logger, | 39 MemberListener(Canceler canceler, Logger logger, |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 80 recoverableError('illegal modifier', token: getOrSet); | 79 recoverableError('illegal modifier', token: getOrSet); |
| 81 } | 80 } |
| 82 kind = ElementKind.GENERATIVE_CONSTRUCTOR; | 81 kind = ElementKind.GENERATIVE_CONSTRUCTOR; |
| 83 } else if (getOrSet !== null) { | 82 } else if (getOrSet !== null) { |
| 84 kind = (getOrSet.stringValue === 'get') | 83 kind = (getOrSet.stringValue === 'get') |
| 85 ? ElementKind.GETTER : ElementKind.SETTER; | 84 ? ElementKind.GETTER : ElementKind.SETTER; |
| 86 } | 85 } |
| 87 Element memberElement = | 86 Element memberElement = |
| 88 new PartialFunctionElement(name, beginToken, endToken, | 87 new PartialFunctionElement(name, beginToken, endToken, |
| 89 kind, method.modifiers, enclosingElement); | 88 kind, method.modifiers, enclosingElement); |
| 90 enclosingElement.addMember(memberElement); | 89 enclosingElement.addMember(memberElement, canceler); |
| 91 } | 90 } |
| 92 | 91 |
| 93 void endFactoryMethod(Token factoryKeyword, Token periodBeforeName, | 92 void endFactoryMethod(Token factoryKeyword, Token periodBeforeName, |
| 94 Token endToken) { | 93 Token endToken) { |
| 95 super.endFactoryMethod(factoryKeyword, periodBeforeName, endToken); | 94 super.endFactoryMethod(factoryKeyword, periodBeforeName, endToken); |
| 96 FunctionExpression method = popNode(); | 95 FunctionExpression method = popNode(); |
| 97 pushNode(null); | 96 pushNode(null); |
| 98 // TODO(ahe): Named constructors. | 97 // TODO(ahe): Named constructors. |
| 99 if (method.name.asIdentifier() == null) { | 98 if (method.name.asIdentifier() == null) { |
| 100 canceler.cancel('Qualified factory names not implemented', node: method); | 99 canceler.cancel('Qualified factory names not implemented', node: method); |
| 101 } | 100 } |
| 102 Identifier name = method.name; | 101 Identifier name = method.name; |
| 103 ElementKind kind = ElementKind.FUNCTION; | 102 ElementKind kind = ElementKind.FUNCTION; |
| 104 Element memberElement = | 103 Element memberElement = |
| 105 new PartialFunctionElement(name.source, factoryKeyword, endToken, kind, | 104 new PartialFunctionElement(name.source, factoryKeyword, endToken, kind, |
| 106 method.modifiers, enclosingElement); | 105 method.modifiers, enclosingElement); |
| 107 enclosingElement.addMember(memberElement); | 106 enclosingElement.addMember(memberElement, canceler); |
| 108 } | 107 } |
| 109 | 108 |
| 110 void endFields(int count, Token beginToken, Token endToken) { | 109 void endFields(int count, Token beginToken, Token endToken) { |
| 111 super.endFields(count, beginToken, endToken); | 110 super.endFields(count, beginToken, endToken); |
| 112 VariableDefinitions variableDefinitions = popNode(); | 111 VariableDefinitions variableDefinitions = popNode(); |
| 113 Modifiers modifiers = variableDefinitions.modifiers; | 112 Modifiers modifiers = variableDefinitions.modifiers; |
| 114 pushNode(null); | 113 pushNode(null); |
| 115 void buildFieldElement(SourceString name, Element fields) { | 114 void buildFieldElement(SourceString name, Element fields) { |
| 116 Element element = new VariableElement( | 115 Element element = new VariableElement( |
| 117 name, fields, ElementKind.FIELD, enclosingElement); | 116 name, fields, ElementKind.FIELD, enclosingElement); |
| 118 enclosingElement.addMember(element); | 117 enclosingElement.addMember(element, canceler); |
| 119 } | 118 } |
| 120 buildFieldElements(modifiers, variableDefinitions.definitions, | 119 buildFieldElements(modifiers, variableDefinitions.definitions, |
| 121 buildFieldElement, beginToken, endToken); | 120 buildFieldElement, beginToken, endToken); |
| 122 } | 121 } |
| 123 | 122 |
| 124 void endInitializer(Token assignmentOperator) { | 123 void endInitializer(Token assignmentOperator) { |
| 125 pushNode(null); // Super expects an expression, but | 124 pushNode(null); // Super expects an expression, but |
| 126 // ClassElementParser just skips expressions. | 125 // ClassElementParser just skips expressions. |
| 127 super.endInitializer(assignmentOperator); | 126 super.endInitializer(assignmentOperator); |
| 128 } | 127 } |
| 129 | 128 |
| 130 void endInitializers(int count, Token beginToken, Token endToken) { | 129 void endInitializers(int count, Token beginToken, Token endToken) { |
| 131 pushNode(null); | 130 pushNode(null); |
| 132 } | 131 } |
| 133 } | 132 } |
| OLD | NEW |