| 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 13 matching lines...) Expand all Loading... |
| 24 MemberListener listener = new MemberListener(diagnosticListener, this); | 24 MemberListener listener = new MemberListener(diagnosticListener, this); |
| 25 Parser parser = new ClassElementParser(listener); | 25 Parser parser = new ClassElementParser(listener); |
| 26 Token token = parser.parseTopLevelDeclaration(beginToken); | 26 Token token = parser.parseTopLevelDeclaration(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 return cachedNode; | 30 return cachedNode; |
| 31 } | 31 } |
| 32 | 32 |
| 33 Token position() => beginToken; | 33 Token position() => beginToken; |
| 34 |
| 35 bool isInterface() => beginToken.stringValue === "interface"; |
| 34 } | 36 } |
| 35 | 37 |
| 36 class MemberListener extends NodeListener { | 38 class MemberListener extends NodeListener { |
| 37 final ClassElement enclosingElement; | 39 final ClassElement enclosingElement; |
| 38 | 40 |
| 39 MemberListener(DiagnosticListener listener, | 41 MemberListener(DiagnosticListener listener, |
| 40 [Element this.enclosingElement = null]) | 42 [Element this.enclosingElement = null]) |
| 41 : super(listener); | 43 : super(listener); |
| 42 | 44 |
| 43 bool isConstructorName(Node nameNode) { | 45 bool isConstructorName(Node nameNode) { |
| 44 if (enclosingElement === null || | 46 if (enclosingElement === null || |
| 45 enclosingElement.kind != ElementKind.CLASS) { | 47 enclosingElement.kind != ElementKind.CLASS) { |
| 46 return false; | 48 return false; |
| 47 } | 49 } |
| 48 SourceString name; | 50 SourceString name; |
| 49 if (nameNode.asIdentifier() !== null) { | 51 if (nameNode.asIdentifier() !== null) { |
| 50 name = nameNode.asIdentifier().source; | 52 name = nameNode.asIdentifier().source; |
| 51 } else { | 53 } else { |
| 52 Send send = nameNode.asSend(); | 54 Send send = nameNode.asSend(); |
| 53 name = send.receiver.asIdentifier().source; | 55 name = send.receiver.asIdentifier().source; |
| 54 } | 56 } |
| 55 return enclosingElement.name == name; | 57 return enclosingElement.name == name; |
| 56 } | 58 } |
| 57 | 59 |
| 60 SourceString getMethodNameHack(Node methodName) { |
| 61 Send send = methodName.asSend(); |
| 62 if (send === null) return methodName.asIdentifier().source; |
| 63 Identifier receiver = send.receiver.asIdentifier(); |
| 64 Identifier selector = send.selector.asIdentifier(); |
| 65 if (selector.asOperator() !== null) { |
| 66 return Elements.constructOperatorName(receiver.source, selector.source); |
| 67 } else { |
| 68 return Elements.constructConstructorName(receiver.source, |
| 69 selector.source); |
| 70 } |
| 71 } |
| 72 |
| 58 void endMethod(Token getOrSet, Token beginToken, Token endToken) { | 73 void endMethod(Token getOrSet, Token beginToken, Token endToken) { |
| 59 super.endMethod(getOrSet, beginToken, endToken); | 74 super.endMethod(getOrSet, beginToken, endToken); |
| 60 FunctionExpression method = popNode(); | 75 FunctionExpression method = popNode(); |
| 61 pushNode(null); | 76 pushNode(null); |
| 62 bool isConstructor = isConstructorName(method.name); | 77 bool isConstructor = isConstructorName(method.name); |
| 63 SourceString name; | 78 SourceString name = getMethodNameHack(method.name); |
| 64 Node methodName = method.name; | |
| 65 if (methodName.asSend() !== null) { | |
| 66 Send send = methodName.asSend(); | |
| 67 Identifier receiver = send.receiver.asIdentifier(); | |
| 68 Identifier selector = send.selector.asIdentifier(); | |
| 69 if (selector.asOperator() !== null) { | |
| 70 name = Elements.constructOperatorName( | |
| 71 receiver.source, selector.source); | |
| 72 } else { | |
| 73 name = Elements.constructConstructorName( | |
| 74 receiver.source, selector.source); | |
| 75 } | |
| 76 } else { | |
| 77 name = methodName.asIdentifier().source; | |
| 78 } | |
| 79 ElementKind kind = ElementKind.FUNCTION; | 79 ElementKind kind = ElementKind.FUNCTION; |
| 80 if (isConstructor) { | 80 if (isConstructor) { |
| 81 if (getOrSet !== null) { | 81 if (getOrSet !== null) { |
| 82 recoverableError('illegal modifier', token: getOrSet); | 82 recoverableError('illegal modifier', token: getOrSet); |
| 83 } | 83 } |
| 84 kind = ElementKind.GENERATIVE_CONSTRUCTOR; | 84 kind = ElementKind.GENERATIVE_CONSTRUCTOR; |
| 85 } else if (getOrSet !== null) { | 85 } else if (getOrSet !== null) { |
| 86 kind = (getOrSet.stringValue === 'get') | 86 kind = (getOrSet.stringValue === 'get') |
| 87 ? ElementKind.GETTER : ElementKind.SETTER; | 87 ? ElementKind.GETTER : ElementKind.SETTER; |
| 88 } | 88 } |
| 89 Element memberElement = | 89 Element memberElement = |
| 90 new PartialFunctionElement(name, beginToken, getOrSet, endToken, | 90 new PartialFunctionElement(name, beginToken, getOrSet, endToken, |
| 91 kind, method.modifiers, enclosingElement); | 91 kind, method.modifiers, enclosingElement); |
| 92 enclosingElement.addMember(memberElement, listener); | 92 enclosingElement.addMember(memberElement, listener); |
| 93 } | 93 } |
| 94 | 94 |
| 95 void endFactoryMethod(Token factoryKeyword, Token periodBeforeName, | 95 void endFactoryMethod(Token factoryKeyword, Token periodBeforeName, |
| 96 Token endToken) { | 96 Token endToken) { |
| 97 super.endFactoryMethod(factoryKeyword, periodBeforeName, endToken); | 97 super.endFactoryMethod(factoryKeyword, periodBeforeName, endToken); |
| 98 FunctionExpression method = popNode(); | 98 FunctionExpression method = popNode(); |
| 99 pushNode(null); | 99 pushNode(null); |
| 100 // TODO(ahe): Named constructors. | 100 SourceString name = getMethodNameHack(method.name); |
| 101 if (method.name.asIdentifier() == null) { | |
| 102 listener.cancel('Qualified factory names not implemented', node: method); | |
| 103 } | |
| 104 Identifier name = method.name; | |
| 105 ElementKind kind = ElementKind.FUNCTION; | 101 ElementKind kind = ElementKind.FUNCTION; |
| 106 Element memberElement = | 102 Element memberElement = |
| 107 new PartialFunctionElement(name.source, factoryKeyword, null, endToken, | 103 new PartialFunctionElement(name, factoryKeyword, null, endToken, |
| 108 kind, method.modifiers, enclosingElement); | 104 kind, method.modifiers, enclosingElement); |
| 109 enclosingElement.addMember(memberElement, listener); | 105 enclosingElement.addMember(memberElement, listener); |
| 110 } | 106 } |
| 111 | 107 |
| 112 void endFields(int count, Token beginToken, Token endToken) { | 108 void endFields(int count, Token beginToken, Token endToken) { |
| 113 super.endFields(count, beginToken, endToken); | 109 super.endFields(count, beginToken, endToken); |
| 114 VariableDefinitions variableDefinitions = popNode(); | 110 VariableDefinitions variableDefinitions = popNode(); |
| 115 Modifiers modifiers = variableDefinitions.modifiers; | 111 Modifiers modifiers = variableDefinitions.modifiers; |
| 116 pushNode(null); | 112 pushNode(null); |
| 117 void buildFieldElement(SourceString name, Element fields) { | 113 void buildFieldElement(SourceString name, Element fields) { |
| 118 Element element = new VariableElement( | 114 Element element = new VariableElement( |
| 119 name, fields, ElementKind.FIELD, enclosingElement); | 115 name, fields, ElementKind.FIELD, enclosingElement); |
| 120 enclosingElement.addMember(element, listener); | 116 enclosingElement.addMember(element, listener); |
| 121 } | 117 } |
| 122 buildFieldElements(modifiers, variableDefinitions.definitions, | 118 buildFieldElements(modifiers, variableDefinitions.definitions, |
| 123 enclosingElement, | 119 enclosingElement, |
| 124 buildFieldElement, beginToken, endToken); | 120 buildFieldElement, beginToken, endToken); |
| 125 } | 121 } |
| 126 | 122 |
| 127 void endInitializer(Token assignmentOperator) { | 123 void endInitializer(Token assignmentOperator) { |
| 128 pushNode(null); // Super expects an expression, but | 124 pushNode(null); // Super expects an expression, but |
| 129 // ClassElementParser just skips expressions. | 125 // ClassElementParser just skips expressions. |
| 130 super.endInitializer(assignmentOperator); | 126 super.endInitializer(assignmentOperator); |
| 131 } | 127 } |
| 132 | 128 |
| 133 void endInitializers(int count, Token beginToken, Token endToken) { | 129 void endInitializers(int count, Token beginToken, Token endToken) { |
| 134 pushNode(null); | 130 pushNode(null); |
| 135 } | 131 } |
| 136 } | 132 } |
| OLD | NEW |