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

Side by Side Diff: pkg/analyzer2dart/lib/src/cps_generator.dart

Issue 1076793005: Fine-grain field, getter, setter, and function access in IrBuilder. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 5 years, 8 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
« no previous file with comments | « no previous file | pkg/analyzer2dart/lib/src/modely.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, 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 analyzer2dart.cps_generator; 5 library analyzer2dart.cps_generator;
6 6
7 import 'package:analyzer/analyzer.dart'; 7 import 'package:analyzer/analyzer.dart';
8 8
9 import 'package:compiler/src/dart_types.dart' as dart2js; 9 import 'package:compiler/src/dart_types.dart' as dart2js;
10 import 'package:compiler/src/elements/elements.dart' as dart2js; 10 import 'package:compiler/src/elements/elements.dart' as dart2js;
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after
195 node.argumentList, node.methodName.name), 195 node.argumentList, node.methodName.name),
196 arguments); 196 arguments);
197 } 197 }
198 198
199 @override 199 @override
200 ir.Primitive visitStaticMethodInvocation(MethodInvocation node, 200 ir.Primitive visitStaticMethodInvocation(MethodInvocation node,
201 AccessSemantics semantics) { 201 AccessSemantics semantics) {
202 analyzer.Element staticElement = semantics.element; 202 analyzer.Element staticElement = semantics.element;
203 dart2js.Element element = converter.convertElement(staticElement); 203 dart2js.Element element = converter.convertElement(staticElement);
204 List<ir.Primitive> arguments = visitArguments(node.argumentList); 204 List<ir.Primitive> arguments = visitArguments(node.argumentList);
205 return irBuilder.buildStaticInvocation( 205 return irBuilder.buildStaticFunctionInvocation(
206 element, 206 element,
207 createSelectorFromMethodInvocation( 207 createSelectorFromMethodInvocation(
208 node.argumentList, node.methodName.name), 208 node.argumentList, node.methodName.name),
209 arguments); 209 arguments);
210 } 210 }
211 211
212 @override 212 @override
213 ir.Node visitLocalFunctionAccess(AstNode node, AccessSemantics semantics) { 213 ir.Node visitLocalFunctionAccess(AstNode node, AccessSemantics semantics) {
214 return handleLocalAccess(node, semantics); 214 return handleLocalAccess(node, semantics);
215 } 215 }
216 216
217 ir.Primitive handleLocalInvocation(MethodInvocation node, 217 ir.Primitive handleLocalInvocation(MethodInvocation node,
218 AccessSemantics semantics) { 218 AccessSemantics semantics) {
219 analyzer.Element staticElement = semantics.element; 219 analyzer.Element staticElement = semantics.element;
220 dart2js.Element element = converter.convertElement(staticElement); 220 dart2js.Element element = converter.convertElement(staticElement);
221 ir.Primitive receiver = irBuilder.buildLocalGet(element);
222 List<ir.Definition> arguments = visitArguments(node.argumentList); 221 List<ir.Definition> arguments = visitArguments(node.argumentList);
223 return irBuilder.buildCallInvocation( 222 Selector selector = createSelectorFromMethodInvocation(
224 receiver, 223 node.argumentList, node.methodName.name);
225 createSelectorFromMethodInvocation( 224 if (semantics.kind == AccessKind.LOCAL_FUNCTION) {
226 node.argumentList, node.methodName.name), 225 return irBuilder.buildLocalFunctionInvocation(
227 arguments); 226 element, selector, arguments);
227 } else {
228 return irBuilder.buildLocalVariableInvocation(
229 element, selector, arguments);
230 }
228 } 231 }
229 232
230 @override 233 @override
231 ir.Node visitLocalVariableInvocation(MethodInvocation node, 234 ir.Node visitLocalVariableInvocation(MethodInvocation node,
232 AccessSemantics semantics) { 235 AccessSemantics semantics) {
233 return handleLocalInvocation(node, semantics); 236 return handleLocalInvocation(node, semantics);
234 } 237 }
235 238
236 @override 239 @override
237 ir.Primitive visitLocalFunctionInvocation(MethodInvocation node, 240 ir.Primitive visitLocalFunctionInvocation(MethodInvocation node,
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
341 } 344 }
342 345
343 dart2js.Element getLocal(AstNode node, AccessSemantics semantics) { 346 dart2js.Element getLocal(AstNode node, AccessSemantics semantics) {
344 analyzer.Element element = semantics.element; 347 analyzer.Element element = semantics.element;
345 dart2js.Element target = converter.convertElement(element); 348 dart2js.Element target = converter.convertElement(element);
346 assert(invariant(node, target.isLocal, '$target expected to be local.')); 349 assert(invariant(node, target.isLocal, '$target expected to be local.'));
347 return target; 350 return target;
348 } 351 }
349 352
350 ir.Primitive handleLocalAccess(AstNode node, AccessSemantics semantics) { 353 ir.Primitive handleLocalAccess(AstNode node, AccessSemantics semantics) {
351 return irBuilder.buildLocalGet(getLocal(node, semantics)); 354 dart2js.Element local = getLocal(node, semantics);
355 if (semantics.kind == AccessKind.LOCAL_FUNCTION) {
356 return irBuilder.buildLocalFunctionGet(local);
357 } else {
358 return irBuilder.buildLocalVariableGet(local);
359 }
352 } 360 }
353 361
354 ir.Primitive handleLocalAssignment(AssignmentExpression node, 362 ir.Primitive handleLocalAssignment(AssignmentExpression node,
355 AccessSemantics semantics) { 363 AccessSemantics semantics) {
356 if (node.operator.lexeme != '=') { 364 if (node.operator.lexeme != '=') {
357 return giveUp(node, 'Assignment operator: ${node.operator.lexeme}'); 365 return giveUp(node, 'Assignment operator: ${node.operator.lexeme}');
358 } 366 }
359 return irBuilder.buildLocalSet( 367 return irBuilder.buildLocalVariableSet(
360 getLocal(node, semantics), 368 getLocal(node, semantics),
361 build(node.rightHandSide)); 369 build(node.rightHandSide));
362 } 370 }
363 371
364 @override 372 @override
365 ir.Node visitAssignmentExpression(AssignmentExpression node) { 373 ir.Node visitAssignmentExpression(AssignmentExpression node) {
366 // Avoid eager visiting of left and right hand side. 374 // Avoid eager visiting of left and right hand side.
367 return handleAssignmentExpression(node); 375 return handleAssignmentExpression(node);
368 } 376 }
369 377
(...skipping 14 matching lines...) Expand all
384 AccessSemantics semantics) { 392 AccessSemantics semantics) {
385 if (node.operator.lexeme != '=') { 393 if (node.operator.lexeme != '=') {
386 return giveUp(node, 'Assignment operator: ${node.operator.lexeme}'); 394 return giveUp(node, 'Assignment operator: ${node.operator.lexeme}');
387 } 395 }
388 analyzer.Element element = semantics.element; 396 analyzer.Element element = semantics.element;
389 dart2js.Element target = converter.convertElement(element); 397 dart2js.Element target = converter.convertElement(element);
390 // TODO(johnniwinther): Selector information should be computed in the 398 // TODO(johnniwinther): Selector information should be computed in the
391 // [TreeShaker] and shared with the [CpsGeneratingVisitor]. 399 // [TreeShaker] and shared with the [CpsGeneratingVisitor].
392 assert(invariant(node, target.isTopLevel || target.isStatic, 400 assert(invariant(node, target.isTopLevel || target.isStatic,
393 '$target expected to be top-level or static.')); 401 '$target expected to be top-level or static.'));
394 return irBuilder.buildStaticSet(target, build(node.rightHandSide)); 402 return irBuilder.buildStaticFieldSet(target, build(node.rightHandSide));
395 } 403 }
396 404
397 @override 405 @override
398 ir.Node visitDynamicAccess(AstNode node, AccessSemantics semantics) { 406 ir.Node visitDynamicAccess(AstNode node, AccessSemantics semantics) {
399 // TODO(johnniwinther): Handle implicit `this`. 407 // TODO(johnniwinther): Handle implicit `this`.
400 ir.Primitive receiver = build(semantics.target); 408 ir.Primitive receiver = build(semantics.target);
401 return irBuilder.buildDynamicGet(receiver, 409 return irBuilder.buildDynamicGet(receiver,
402 new Selector.getter(semantics.identifier.name, 410 new Selector.getter(semantics.identifier.name,
403 converter.convertElement(element.library))); 411 converter.convertElement(element.library)));
404 } 412 }
405 413
406 @override 414 @override
407 ir.Node visitStaticFieldAccess(AstNode node, AccessSemantics semantics) { 415 ir.Node visitStaticFieldAccess(AstNode node, AccessSemantics semantics) {
408 analyzer.Element element = semantics.element; 416 analyzer.Element element = semantics.element;
409 dart2js.Element target = converter.convertElement(element); 417 dart2js.Element target = converter.convertElement(element);
410 // TODO(johnniwinther): Selector information should be computed in the 418 // TODO(johnniwinther): Selector information should be computed in the
411 // [TreeShaker] and shared with the [CpsGeneratingVisitor]. 419 // [TreeShaker] and shared with the [CpsGeneratingVisitor].
412 assert(invariant(node, target.isTopLevel || target.isStatic, 420 assert(invariant(node, target.isTopLevel || target.isStatic,
413 '$target expected to be top-level or static.')); 421 '$target expected to be top-level or static.'));
414 return irBuilder.buildStaticGet(target); 422 return irBuilder.buildStaticFieldGet(target);
415 } 423 }
416 424
417 ir.Primitive handleBinaryExpression(BinaryExpression node, 425 ir.Primitive handleBinaryExpression(BinaryExpression node,
418 String op) { 426 String op) {
419 ir.Primitive left = build(node.leftOperand); 427 ir.Primitive left = build(node.leftOperand);
420 ir.Primitive right = build(node.rightOperand); 428 ir.Primitive right = build(node.rightOperand);
421 Selector selector = new Selector.binaryOperator(op); 429 Selector selector = new Selector.binaryOperator(op);
422 return irBuilder.buildDynamicInvocation( 430 return irBuilder.buildDynamicInvocation(
423 left, selector, <ir.Primitive>[right]); 431 left, selector, <ir.Primitive>[right]);
424 } 432 }
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
583 irBuilder.buildTry( 591 irBuilder.buildTry(
584 tryStatementInfo: new TryStatementInfo(), 592 tryStatementInfo: new TryStatementInfo(),
585 buildTryBlock: subbuild(node.body), 593 buildTryBlock: subbuild(node.body),
586 catchClauseInfos: catchClauseInfos); 594 catchClauseInfos: catchClauseInfos);
587 } 595 }
588 } 596 }
589 597
590 class NullCapturedVariables extends DartCapturedVariables { 598 class NullCapturedVariables extends DartCapturedVariables {
591 NullCapturedVariables() : super(null); 599 NullCapturedVariables() : super(null);
592 } 600 }
OLDNEW
« no previous file with comments | « no previous file | pkg/analyzer2dart/lib/src/modely.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698