| 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 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 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()); | 30 assert(listener.topLevelElements.isEmpty()); |
| 31 return cachedNode; | 31 return cachedNode; |
| 32 } | 32 } |
| 33 |
| 34 Token position() => beginToken; |
| 33 } | 35 } |
| 34 | 36 |
| 35 class MemberListener extends NodeListener { | 37 class MemberListener extends NodeListener { |
| 36 final ClassElement enclosingElement; | 38 final ClassElement enclosingElement; |
| 37 | 39 |
| 38 MemberListener(Canceler canceler, Logger logger, | 40 MemberListener(Canceler canceler, Logger logger, |
| 39 [Element this.enclosingElement = null]) | 41 [Element this.enclosingElement = null]) |
| 40 : super(canceler, logger); | 42 : super(canceler, logger); |
| 41 | 43 |
| 42 bool isConstructorName(Node nameNode) { | 44 bool isConstructorName(Node nameNode) { |
| 43 if (enclosingElement === null || | 45 if (enclosingElement === null || |
| 44 enclosingElement.kind != ElementKind.CLASS) { | 46 enclosingElement.kind != ElementKind.CLASS) { |
| 45 return false; | 47 return false; |
| 46 } | 48 } |
| 47 SourceString name; | 49 SourceString name; |
| 48 if (nameNode.asIdentifier() != null) { | 50 if (nameNode.asIdentifier() != null) { |
| 49 name = nameNode.asIdentifier().source; | 51 name = nameNode.asIdentifier().source; |
| 50 } else { | 52 } else { |
| 51 Send send = nameNode.asSend(); | 53 Send send = nameNode.asSend(); |
| 52 name = send.receiver.asIdentifier().source; | 54 name = send.receiver.asIdentifier().source; |
| 53 } | 55 } |
| 54 return enclosingElement.name == name; | 56 return enclosingElement.name == name; |
| 55 } | 57 } |
| 56 | 58 |
| 57 void endMethod(Token beginToken, Token endToken) { | 59 void endMethod(Token getOrSet, Token beginToken, Token endToken) { |
| 58 super.endMethod(beginToken, endToken); | 60 super.endMethod(getOrSet, beginToken, endToken); |
| 59 FunctionExpression method = popNode(); | 61 FunctionExpression method = popNode(); |
| 60 pushNode(null); | 62 pushNode(null); |
| 61 bool isConstructor = isConstructorName(method.name); | 63 bool isConstructor = isConstructorName(method.name); |
| 62 SourceString name; | 64 SourceString name; |
| 63 Node methodName = method.name; | 65 Node methodName = method.name; |
| 64 if (methodName.asSend() != null) { | 66 if (methodName.asSend() != null) { |
| 65 Send send = methodName.asSend(); | 67 Send send = methodName.asSend(); |
| 66 // TODO(karlklose): find a better place for the construction of the name. | 68 // TODO(karlklose): find a better place for the construction of the name. |
| 67 Identifier receiver = send.receiver.asIdentifier(); | 69 Identifier receiver = send.receiver.asIdentifier(); |
| 68 Identifier selector = send.selector.asIdentifier(); | 70 Identifier selector = send.selector.asIdentifier(); |
| 69 SourceString className = receiver.source; | 71 SourceString className = receiver.source; |
| 70 SourceString constructorName = selector.source; | 72 SourceString constructorName = selector.source; |
| 71 name = new SourceString('$className.$constructorName'); | 73 name = new SourceString('$className.$constructorName'); |
| 72 } else { | 74 } else { |
| 73 name = methodName.asIdentifier().source; | 75 name = methodName.asIdentifier().source; |
| 74 } | 76 } |
| 75 ElementKind kind = isConstructor ? | 77 ElementKind kind = ElementKind.FUNCTION; |
| 76 ElementKind.GENERATIVE_CONSTRUCTOR : | 78 if (isConstructor) { |
| 77 ElementKind.FUNCTION; | 79 if (getOrSet !== null) { |
| 80 recoverableError('illegal modifier', token: getOrSet); |
| 81 } |
| 82 kind = ElementKind.GENERATIVE_CONSTRUCTOR; |
| 83 } else if (getOrSet !== null) { |
| 84 kind = (getOrSet.stringValue === 'get') |
| 85 ? ElementKind.GETTER : ElementKind.SETTER; |
| 86 } |
| 78 Element memberElement = | 87 Element memberElement = |
| 79 new PartialFunctionElement(name, beginToken, endToken, | 88 new PartialFunctionElement(name, beginToken, endToken, |
| 80 kind, method.modifiers, enclosingElement); | 89 kind, method.modifiers, enclosingElement); |
| 81 enclosingElement.addMember(memberElement); | 90 enclosingElement.addMember(memberElement); |
| 82 } | 91 } |
| 83 | 92 |
| 84 void endFactoryMethod(Token factoryKeyword, Token periodBeforeName, | 93 void endFactoryMethod(Token factoryKeyword, Token periodBeforeName, |
| 85 Token endToken) { | 94 Token endToken) { |
| 86 super.endFactoryMethod(factoryKeyword, periodBeforeName, endToken); | 95 super.endFactoryMethod(factoryKeyword, periodBeforeName, endToken); |
| 87 FunctionExpression method = popNode(); | 96 FunctionExpression method = popNode(); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 115 void endInitializer(Token assignmentOperator) { | 124 void endInitializer(Token assignmentOperator) { |
| 116 pushNode(null); // Super expects an expression, but | 125 pushNode(null); // Super expects an expression, but |
| 117 // ClassElementParser just skips expressions. | 126 // ClassElementParser just skips expressions. |
| 118 super.endInitializer(assignmentOperator); | 127 super.endInitializer(assignmentOperator); |
| 119 } | 128 } |
| 120 | 129 |
| 121 void endInitializers(int count, Token beginToken, Token endToken) { | 130 void endInitializers(int count, Token beginToken, Token endToken) { |
| 122 pushNode(null); | 131 pushNode(null); |
| 123 } | 132 } |
| 124 } | 133 } |
| OLD | NEW |