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 |