| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 library dart2js.parser.member_listener; | 5 library dart2js.parser.member_listener; |
| 6 | 6 |
| 7 import '../common.dart'; | 7 import '../common.dart'; |
| 8 import '../elements/elements.dart' show | 8 import '../elements/elements.dart' |
| 9 Element, | 9 show Element, ElementKind, Elements, MetadataAnnotation; |
| 10 ElementKind, | 10 import '../elements/modelx.dart' |
| 11 Elements, | 11 show ClassElementX, ElementX, FieldElementX, VariableList; |
| 12 MetadataAnnotation; | 12 import '../tokens/token.dart' show Token; |
| 13 import '../elements/modelx.dart' show | |
| 14 ClassElementX, | |
| 15 ElementX, | |
| 16 FieldElementX, | |
| 17 VariableList; | |
| 18 import '../tokens/token.dart' show | |
| 19 Token; | |
| 20 import '../tree/tree.dart'; | 13 import '../tree/tree.dart'; |
| 21 | 14 |
| 22 import 'element_listener.dart' show | 15 import 'element_listener.dart' show ScannerOptions; |
| 23 ScannerOptions; | 16 import 'node_listener.dart' show NodeListener; |
| 24 import 'node_listener.dart' show | 17 import 'partial_elements.dart' |
| 25 NodeListener; | 18 show |
| 26 import 'partial_elements.dart' show | 19 PartialConstructorElement, |
| 27 PartialConstructorElement, | 20 PartialFunctionElement, |
| 28 PartialFunctionElement, | 21 PartialMetadataAnnotation; |
| 29 PartialMetadataAnnotation; | |
| 30 | 22 |
| 31 class MemberListener extends NodeListener { | 23 class MemberListener extends NodeListener { |
| 32 final ClassElementX enclosingClass; | 24 final ClassElementX enclosingClass; |
| 33 | 25 |
| 34 MemberListener(ScannerOptions scannerOptions, | 26 MemberListener(ScannerOptions scannerOptions, DiagnosticReporter listener, |
| 35 DiagnosticReporter listener, | 27 ClassElementX enclosingElement) |
| 36 ClassElementX enclosingElement) | |
| 37 : this.enclosingClass = enclosingElement, | 28 : this.enclosingClass = enclosingElement, |
| 38 super(scannerOptions, listener, enclosingElement.compilationUnit); | 29 super(scannerOptions, listener, enclosingElement.compilationUnit); |
| 39 | 30 |
| 40 bool isConstructorName(Node nameNode) { | 31 bool isConstructorName(Node nameNode) { |
| 41 if (enclosingClass == null || | 32 if (enclosingClass == null || enclosingClass.kind != ElementKind.CLASS) { |
| 42 enclosingClass.kind != ElementKind.CLASS) { | |
| 43 return false; | 33 return false; |
| 44 } | 34 } |
| 45 String name; | 35 String name; |
| 46 if (nameNode.asIdentifier() != null) { | 36 if (nameNode.asIdentifier() != null) { |
| 47 name = nameNode.asIdentifier().source; | 37 name = nameNode.asIdentifier().source; |
| 48 } else { | 38 } else { |
| 49 Send send = nameNode.asSend(); | 39 Send send = nameNode.asSend(); |
| 50 name = send.receiver.asIdentifier().source; | 40 name = send.receiver.asIdentifier().source; |
| 51 } | 41 } |
| 52 return enclosingClass.name == name; | 42 return enclosingClass.name == name; |
| (...skipping 30 matching lines...) Expand all Loading... |
| 83 super.endMethod(getOrSet, beginToken, endToken); | 73 super.endMethod(getOrSet, beginToken, endToken); |
| 84 FunctionExpression method = popNode(); | 74 FunctionExpression method = popNode(); |
| 85 pushNode(null); | 75 pushNode(null); |
| 86 bool isConstructor = isConstructorName(method.name); | 76 bool isConstructor = isConstructorName(method.name); |
| 87 String name = getMethodNameHack(method.name); | 77 String name = getMethodNameHack(method.name); |
| 88 Element memberElement; | 78 Element memberElement; |
| 89 if (isConstructor) { | 79 if (isConstructor) { |
| 90 if (getOrSet != null) { | 80 if (getOrSet != null) { |
| 91 recoverableError(getOrSet, 'illegal modifier'); | 81 recoverableError(getOrSet, 'illegal modifier'); |
| 92 } | 82 } |
| 93 memberElement = new PartialConstructorElement( | 83 memberElement = new PartialConstructorElement(name, beginToken, endToken, |
| 94 name, beginToken, endToken, | 84 ElementKind.GENERATIVE_CONSTRUCTOR, method.modifiers, enclosingClass); |
| 95 ElementKind.GENERATIVE_CONSTRUCTOR, | |
| 96 method.modifiers, | |
| 97 enclosingClass); | |
| 98 } else { | 85 } else { |
| 99 memberElement = new PartialFunctionElement( | 86 memberElement = new PartialFunctionElement(name, beginToken, getOrSet, |
| 100 name, beginToken, getOrSet, endToken, | 87 endToken, method.modifiers, enclosingClass, |
| 101 method.modifiers, enclosingClass, hasBody: method.hasBody); | 88 hasBody: method.hasBody); |
| 102 } | 89 } |
| 103 addMember(memberElement); | 90 addMember(memberElement); |
| 104 } | 91 } |
| 105 | 92 |
| 106 void endFactoryMethod(Token beginToken, Token endToken) { | 93 void endFactoryMethod(Token beginToken, Token endToken) { |
| 107 super.endFactoryMethod(beginToken, endToken); | 94 super.endFactoryMethod(beginToken, endToken); |
| 108 FunctionExpression method = popNode(); | 95 FunctionExpression method = popNode(); |
| 109 pushNode(null); | 96 pushNode(null); |
| 110 String name = getMethodNameHack(method.name); | 97 String name = getMethodNameHack(method.name); |
| 111 Identifier singleIdentifierName = method.name.asIdentifier(); | 98 Identifier singleIdentifierName = method.name.asIdentifier(); |
| 112 if (singleIdentifierName != null && singleIdentifierName.source == name) { | 99 if (singleIdentifierName != null && singleIdentifierName.source == name) { |
| 113 if (name != enclosingClass.name) { | 100 if (name != enclosingClass.name) { |
| 114 reporter.reportErrorMessage( | 101 reporter.reportErrorMessage( |
| 115 singleIdentifierName, | 102 singleIdentifierName, |
| 116 MessageKind.INVALID_UNNAMED_CONSTRUCTOR_NAME, | 103 MessageKind.INVALID_UNNAMED_CONSTRUCTOR_NAME, |
| 117 {'name': enclosingClass.name}); | 104 {'name': enclosingClass.name}); |
| 118 } | 105 } |
| 119 } | 106 } |
| 120 Element memberElement = new PartialConstructorElement( | 107 Element memberElement = new PartialConstructorElement( |
| 121 name, beginToken, endToken, | 108 name, |
| 109 beginToken, |
| 110 endToken, |
| 122 ElementKind.FACTORY_CONSTRUCTOR, | 111 ElementKind.FACTORY_CONSTRUCTOR, |
| 123 method.modifiers, | 112 method.modifiers, |
| 124 enclosingClass); | 113 enclosingClass); |
| 125 addMember(memberElement); | 114 addMember(memberElement); |
| 126 } | 115 } |
| 127 | 116 |
| 128 void endFields(int count, Token beginToken, Token endToken) { | 117 void endFields(int count, Token beginToken, Token endToken) { |
| 129 bool hasParseError = memberErrors.head; | 118 bool hasParseError = memberErrors.head; |
| 130 super.endFields(count, beginToken, endToken); | 119 super.endFields(count, beginToken, endToken); |
| 131 VariableDefinitions variableDefinitions = popNode(); | 120 VariableDefinitions variableDefinitions = popNode(); |
| 132 Modifiers modifiers = variableDefinitions.modifiers; | 121 Modifiers modifiers = variableDefinitions.modifiers; |
| 133 pushNode(null); | 122 pushNode(null); |
| 134 void buildFieldElement(Identifier name, VariableList fields) { | 123 void buildFieldElement(Identifier name, VariableList fields) { |
| 135 Element element = | 124 Element element = new FieldElementX(name, enclosingClass, fields); |
| 136 new FieldElementX(name, enclosingClass, fields); | |
| 137 addMember(element); | 125 addMember(element); |
| 138 } | 126 } |
| 139 buildFieldElements(modifiers, variableDefinitions.definitions, | 127 buildFieldElements(modifiers, variableDefinitions.definitions, |
| 140 enclosingClass, | 128 enclosingClass, buildFieldElement, beginToken, endToken, hasParseError); |
| 141 buildFieldElement, beginToken, endToken, | |
| 142 hasParseError); | |
| 143 } | 129 } |
| 144 | 130 |
| 145 void endInitializer(Token assignmentOperator) { | 131 void endInitializer(Token assignmentOperator) { |
| 146 pushNode(null); // Super expects an expression, but | 132 pushNode(null); // Super expects an expression, but |
| 147 // ClassElementParser just skips expressions. | 133 // ClassElementParser just skips expressions. |
| 148 super.endInitializer(assignmentOperator); | 134 super.endInitializer(assignmentOperator); |
| 149 } | 135 } |
| 150 | 136 |
| 151 void endInitializers(int count, Token beginToken, Token endToken) { | 137 void endInitializers(int count, Token beginToken, Token endToken) { |
| 152 pushNode(null); | 138 pushNode(null); |
| 153 } | 139 } |
| 154 | 140 |
| 155 void addMetadata(ElementX memberElement) { | 141 void addMetadata(ElementX memberElement) { |
| 156 memberElement.metadata = metadata.toList(); | 142 memberElement.metadata = metadata.toList(); |
| 157 } | 143 } |
| 158 | 144 |
| 159 void addMember(ElementX memberElement) { | 145 void addMember(ElementX memberElement) { |
| 160 addMetadata(memberElement); | 146 addMetadata(memberElement); |
| 161 enclosingClass.addMember(memberElement, reporter); | 147 enclosingClass.addMember(memberElement, reporter); |
| 162 } | 148 } |
| 163 | 149 |
| 164 void endMetadata(Token beginToken, Token periodBeforeName, Token endToken) { | 150 void endMetadata(Token beginToken, Token periodBeforeName, Token endToken) { |
| 165 popNode(); // Discard arguments. | 151 popNode(); // Discard arguments. |
| 166 if (periodBeforeName != null) { | 152 if (periodBeforeName != null) { |
| 167 popNode(); // Discard name. | 153 popNode(); // Discard name. |
| 168 } | 154 } |
| 169 popNode(); // Discard node (Send or Identifier). | 155 popNode(); // Discard node (Send or Identifier). |
| 170 pushMetadata(new PartialMetadataAnnotation(beginToken, endToken)); | 156 pushMetadata(new PartialMetadataAnnotation(beginToken, endToken)); |
| 171 } | 157 } |
| 172 } | 158 } |
| OLD | NEW |