Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(50)

Side by Side Diff: pkg/compiler/lib/src/resolution/send_resolver.dart

Issue 1004683002: Refactor IrBuilder to use SemanticVisitor. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Handle local/static constants and index prefix/postfix. Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 part of dart2js.semantics_visitor; 5 part of dart2js.semantics_visitor;
6 6
7 enum SendStructureKind { 7 enum SendStructureKind {
8 GET, 8 GET,
9 SET, 9 SET,
10 INVOKE, 10 INVOKE,
11 UNARY, 11 UNARY,
12 NOT, 12 NOT,
13 BINARY, 13 BINARY,
14 EQ, 14 EQ,
15 NOT_EQ, 15 NOT_EQ,
16 COMPOUND, 16 COMPOUND,
17 INDEX, 17 INDEX,
18 INDEX_SET, 18 INDEX_SET,
19 COMPOUND_INDEX_SET, 19 COMPOUND_INDEX_SET,
20 PREFIX, 20 PREFIX,
21 POSTFIX, 21 POSTFIX,
22 INDEX_PREFIX,
23 INDEX_POSTFIX,
22 } 24 }
23 25
24 abstract class SendResolverMixin { 26 abstract class SendResolverMixin {
25 TreeElements get elements; 27 TreeElements get elements;
26 28
27 internalError(Spannable spannable, String message); 29 internalError(Spannable spannable, String message);
28 30
29 AccessSemantics handleStaticallyResolvedAccess(Send node, 31 AccessSemantics handleStaticallyResolvedAccess(Send node,
30 Element element, 32 Element element,
31 Element getter) { 33 Element getter) {
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
178 kind = SendStructureKind.EQ; 180 kind = SendStructureKind.EQ;
179 break; 181 break;
180 case BinaryOperatorKind.NOT_EQ: 182 case BinaryOperatorKind.NOT_EQ:
181 if (node.isSuperCall) { 183 if (node.isSuperCall) {
182 // `super != foo` is a compile-time error. 184 // `super != foo` is a compile-time error.
183 return const InvalidBinaryStructure(); 185 return const InvalidBinaryStructure();
184 } 186 }
185 kind = SendStructureKind.NOT_EQ; 187 kind = SendStructureKind.NOT_EQ;
186 break; 188 break;
187 case BinaryOperatorKind.INDEX: 189 case BinaryOperatorKind.INDEX:
188 if (node.arguments.tail.isEmpty) { 190 if (node.isPrefix) {
191 kind = SendStructureKind.INDEX_PREFIX;
192 } else if (node.isPostfix) {
193 kind = SendStructureKind.INDEX_POSTFIX;
194 } else if (node.arguments.tail.isEmpty) {
189 // a[b] 195 // a[b]
190 kind = SendStructureKind.INDEX; 196 kind = SendStructureKind.INDEX;
191 } else { 197 } else {
192 if (kind == SendStructureKind.COMPOUND) { 198 if (kind == SendStructureKind.COMPOUND) {
193 // a[b] += c 199 // a[b] += c
194 kind = SendStructureKind.COMPOUND_INDEX_SET; 200 kind = SendStructureKind.COMPOUND_INDEX_SET;
195 } else { 201 } else {
196 // a[b] = c 202 // a[b] = c
197 kind = SendStructureKind.INDEX_SET; 203 kind = SendStructureKind.INDEX_SET;
198 } 204 }
199 } 205 }
200 break; 206 break;
201 default: 207 default:
202 kind = SendStructureKind.BINARY; 208 kind = SendStructureKind.BINARY;
203 break; 209 break;
204 } 210 }
205 } else { 211 } else {
206 return const InvalidBinaryStructure(); 212 return const InvalidBinaryStructure();
207 } 213 }
208 } 214 }
209 } 215 }
210 AccessSemantics semantics = computeAccessSemantics( 216 AccessSemantics semantics = computeAccessSemantics(
211 node, 217 node,
212 isGetOrSet: kind == SendStructureKind.GET || 218 isGetOrSet: kind == SendStructureKind.GET ||
213 kind == SendStructureKind.SET, 219 kind == SendStructureKind.SET,
214 isInvoke: kind == SendStructureKind.INVOKE, 220 isInvoke: kind == SendStructureKind.INVOKE,
215 isCompound: kind == SendStructureKind.COMPOUND || 221 isCompound: kind == SendStructureKind.COMPOUND ||
216 kind == SendStructureKind.COMPOUND_INDEX_SET || 222 kind == SendStructureKind.COMPOUND_INDEX_SET ||
217 kind == SendStructureKind.PREFIX || 223 kind == SendStructureKind.PREFIX ||
218 kind == SendStructureKind.POSTFIX); 224 kind == SendStructureKind.POSTFIX ||
225 kind == SendStructureKind.INDEX_PREFIX ||
226 kind == SendStructureKind.INDEX_POSTFIX);
219 if (semantics == null) { 227 if (semantics == null) {
220 return internalError(node, 'No semantics for $node'); 228 return internalError(node, 'No semantics for $node');
221 } 229 }
222 Selector selector = elements.getSelector(node); 230 Selector selector = elements.getSelector(node);
223 switch (kind) { 231 switch (kind) {
224 case SendStructureKind.GET: 232 case SendStructureKind.GET:
225 return new GetStructure(semantics, selector); 233 return new GetStructure(semantics, selector);
226 case SendStructureKind.SET: 234 case SendStructureKind.SET:
227 return new SetStructure(semantics, selector); 235 return new SetStructure(semantics, selector);
228 case SendStructureKind.INVOKE: 236 case SendStructureKind.INVOKE:
(...skipping 22 matching lines...) Expand all
251 case SendStructureKind.INDEX_SET: 259 case SendStructureKind.INDEX_SET:
252 return new IndexSetStructure(semantics, selector); 260 return new IndexSetStructure(semantics, selector);
253 case SendStructureKind.COMPOUND_INDEX_SET: 261 case SendStructureKind.COMPOUND_INDEX_SET:
254 Selector getterSelector = 262 Selector getterSelector =
255 elements.getGetterSelectorInComplexSendSet(node); 263 elements.getGetterSelectorInComplexSendSet(node);
256 return new CompoundIndexSetStructure( 264 return new CompoundIndexSetStructure(
257 semantics, 265 semantics,
258 assignmentOperator, 266 assignmentOperator,
259 getterSelector, 267 getterSelector,
260 selector); 268 selector);
269 case SendStructureKind.INDEX_PREFIX:
270 Selector getterSelector =
271 elements.getGetterSelectorInComplexSendSet(node);
272 return new IndexPrefixStructure(
273 semantics,
274 incDecOperator,
275 getterSelector,
276 selector);
277 case SendStructureKind.INDEX_POSTFIX:
278 Selector getterSelector =
279 elements.getGetterSelectorInComplexSendSet(node);
280 return new IndexPostfixStructure(
281 semantics,
282 incDecOperator,
283 getterSelector,
284 selector);
261 case SendStructureKind.PREFIX: 285 case SendStructureKind.PREFIX:
262 Selector getterSelector = 286 Selector getterSelector =
263 elements.getGetterSelectorInComplexSendSet(node); 287 elements.getGetterSelectorInComplexSendSet(node);
264 return new PrefixStructure( 288 return new PrefixStructure(
265 semantics, 289 semantics,
266 incDecOperator, 290 incDecOperator,
267 getterSelector, 291 getterSelector,
268 selector); 292 selector);
269 case SendStructureKind.POSTFIX: 293 case SendStructureKind.POSTFIX:
270 Selector getterSelector = 294 Selector getterSelector =
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
368 // TODO(johnniwinther): Provide an [ErroneousElement]. 392 // TODO(johnniwinther): Provide an [ErroneousElement].
369 // This happens for code like `C.this`. 393 // This happens for code like `C.this`.
370 return new StaticAccess.unresolved(null); 394 return new StaticAccess.unresolved(null);
371 } else { 395 } else {
372 return handleStaticallyResolvedAccess(node, element, getter); 396 return handleStaticallyResolvedAccess(node, element, getter);
373 } 397 }
374 } 398 }
375 } 399 }
376 } 400 }
377 401
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/resolution/semantic_visitor_mixins.dart ('k') | pkg/compiler/lib/src/resolution/send_structure.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698