| OLD | NEW |
| 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/implementation/elements/elements.dart' as dart2js; | 9 import 'package:compiler/implementation/elements/elements.dart' as dart2js; |
| 10 import 'package:analyzer/src/generated/source.dart'; | 10 import 'package:analyzer/src/generated/source.dart'; |
| 11 import 'package:analyzer/src/generated/element.dart' as analyzer; | 11 import 'package:analyzer/src/generated/element.dart' as analyzer; |
| 12 | 12 |
| 13 import 'package:compiler/implementation/dart2jslib.dart' | 13 import 'package:compiler/implementation/dart2jslib.dart' |
| 14 show DART_CONSTANT_SYSTEM; | 14 show DART_CONSTANT_SYSTEM; |
| 15 import 'package:compiler/implementation/cps_ir/cps_ir_nodes.dart' as ir; | 15 import 'package:compiler/implementation/cps_ir/cps_ir_nodes.dart' as ir; |
| 16 import 'package:compiler/implementation/cps_ir/cps_ir_builder.dart'; | 16 import 'package:compiler/implementation/cps_ir/cps_ir_builder.dart'; |
| 17 import 'package:compiler/implementation/universe/universe.dart'; | 17 import 'package:compiler/implementation/universe/universe.dart'; |
| 18 | 18 |
| 19 import 'semantic_visitor.dart'; | 19 import 'semantic_visitor.dart'; |
| 20 import 'element_converter.dart'; | 20 import 'element_converter.dart'; |
| 21 import 'util.dart'; | 21 import 'util.dart'; |
| 22 import 'package:analyzer2dart/src/identifier_semantics.dart'; | 22 import 'identifier_semantics.dart'; |
| 23 | 23 |
| 24 class CpsGeneratingVisitor extends SemanticVisitor<ir.Node> | 24 class CpsGeneratingVisitor extends SemanticVisitor<ir.Node> |
| 25 with IrBuilderMixin { | 25 with IrBuilderMixin { |
| 26 final analyzer.Element element; | 26 final analyzer.Element element; |
| 27 final ElementConverter converter; | 27 final ElementConverter converter; |
| 28 | 28 |
| 29 CpsGeneratingVisitor(this.converter, this.element); | 29 CpsGeneratingVisitor(this.converter, this.element); |
| 30 | 30 |
| 31 Source get currentSource => element.source; | 31 Source get currentSource => element.source; |
| 32 | 32 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 46 irBuilder.createParameter(converter.convertElement(parameter), | 46 irBuilder.createParameter(converter.convertElement(parameter), |
| 47 isClosureVariable: false); | 47 isClosureVariable: false); |
| 48 }); | 48 }); |
| 49 // Visit the body directly to avoid processing the signature as | 49 // Visit the body directly to avoid processing the signature as |
| 50 // expressions. | 50 // expressions. |
| 51 node.functionExpression.body.accept(this); | 51 node.functionExpression.body.accept(this); |
| 52 return irBuilder.buildFunctionDefinition(element, const []); | 52 return irBuilder.buildFunctionDefinition(element, const []); |
| 53 }); | 53 }); |
| 54 } | 54 } |
| 55 | 55 |
| 56 @override | 56 List<ir.Definition> visitArguments(ArgumentList argumentList) { |
| 57 visitStaticMethodInvocation(MethodInvocation node, | |
| 58 AccessSemantics semantics) { | |
| 59 analyzer.Element staticElement = semantics.element; | |
| 60 dart2js.Element element = converter.convertElement(staticElement); | |
| 61 List<ir.Definition> arguments = <ir.Definition>[]; | 57 List<ir.Definition> arguments = <ir.Definition>[]; |
| 62 for (Expression argument in node.argumentList.arguments) { | 58 for (Expression argument in argumentList.arguments) { |
| 63 ir.Definition value = argument.accept(this); | 59 ir.Definition value = argument.accept(this); |
| 64 if (value == null) { | 60 if (value == null) { |
| 65 giveUp(argument, | 61 giveUp(argument, |
| 66 'Unsupported argument: $argument (${argument.runtimeType}).'); | 62 'Unsupported argument: $argument (${argument.runtimeType}).'); |
| 67 } | 63 } |
| 68 arguments.add(value); | 64 arguments.add(value); |
| 69 } | 65 } |
| 66 return arguments; |
| 67 } |
| 68 |
| 69 @override |
| 70 ir.Primitive visitDynamicInvocation(MethodInvocation node, |
| 71 AccessSemantics semantics) { |
| 72 // TODO(johnniwinther): Handle implicit `this`. |
| 73 ir.Primitive receiver = semantics.target.accept(this); |
| 74 List<ir.Definition> arguments = visitArguments(node.argumentList); |
| 75 return irBuilder.buildDynamicInvocation( |
| 76 receiver, |
| 77 createSelectorFromMethodInvocation(node, node.methodName.name), |
| 78 arguments); |
| 79 } |
| 80 |
| 81 @override |
| 82 ir.Primitive visitStaticMethodInvocation(MethodInvocation node, |
| 83 AccessSemantics semantics) { |
| 84 analyzer.Element staticElement = semantics.element; |
| 85 dart2js.Element element = converter.convertElement(staticElement); |
| 86 List<ir.Definition> arguments = visitArguments(node.argumentList); |
| 70 return irBuilder.buildStaticInvocation( | 87 return irBuilder.buildStaticInvocation( |
| 71 element, | 88 element, |
| 72 createSelectorFromMethodInvocation(node, node.methodName.name), | 89 createSelectorFromMethodInvocation(node, node.methodName.name), |
| 73 arguments); | 90 arguments); |
| 74 } | 91 } |
| 75 | 92 |
| 76 @override | 93 @override |
| 77 ir.Constant visitNullLiteral(NullLiteral node) { | 94 ir.Constant visitNullLiteral(NullLiteral node) { |
| 78 return irBuilder.buildNullLiteral(); | 95 return irBuilder.buildNullLiteral(); |
| 79 } | 96 } |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 140 } | 157 } |
| 141 irBuilder.declareLocalVariable( | 158 irBuilder.declareLocalVariable( |
| 142 converter.convertElement(node.element), | 159 converter.convertElement(node.element), |
| 143 initialValue: initialValue); | 160 initialValue: initialValue); |
| 144 } | 161 } |
| 145 | 162 |
| 146 ir.Primitive handleLocalAccess(AstNode node, AccessSemantics semantics) { | 163 ir.Primitive handleLocalAccess(AstNode node, AccessSemantics semantics) { |
| 147 analyzer.Element element = semantics.element; | 164 analyzer.Element element = semantics.element; |
| 148 dart2js.Element target = converter.convertElement(element); | 165 dart2js.Element target = converter.convertElement(element); |
| 149 assert(invariant(node, target.isLocal, '$target expected to be local.')); | 166 assert(invariant(node, target.isLocal, '$target expected to be local.')); |
| 150 return irBuilder.buildGetLocal(target); | 167 return irBuilder.buildLocalGet(target); |
| 151 } | 168 } |
| 152 | 169 |
| 153 @override | 170 @override |
| 171 ir.Node visitDynamicAccess(AstNode node, AccessSemantics semantics) { |
| 172 // TODO(johnniwinther): Handle implicit `this`. |
| 173 ir.Primitive receiver = semantics.target.accept(this); |
| 174 return irBuilder.buildDynamicGet(receiver, |
| 175 new Selector.getter(semantics.identifier.name, |
| 176 converter.convertElement(element.library))); |
| 177 } |
| 178 |
| 179 @override |
| 154 ir.Node visitStaticFieldAccess(AstNode node, AccessSemantics semantics) { | 180 ir.Node visitStaticFieldAccess(AstNode node, AccessSemantics semantics) { |
| 155 analyzer.Element element = semantics.element; | 181 analyzer.Element element = semantics.element; |
| 156 dart2js.Element target = converter.convertElement(element); | 182 dart2js.Element target = converter.convertElement(element); |
| 157 // TODO(johnniwinther): Selector information should be computed in the | 183 // TODO(johnniwinther): Selector information should be computed in the |
| 158 // [TreeShaker] and shared with the [CpsGeneratingVisitor]. | 184 // [TreeShaker] and shared with the [CpsGeneratingVisitor]. |
| 159 assert(invariant(node, target.isTopLevel || target.isStatic, | 185 assert(invariant(node, target.isTopLevel || target.isStatic, |
| 160 '$target expected to be top-level or static.')); | 186 '$target expected to be top-level or static.')); |
| 161 return irBuilder.buildGetStatic(target, | 187 return irBuilder.buildStaticGet(target, |
| 162 new Selector.getter(target.name, target.library)); | 188 new Selector.getter(target.name, target.library)); |
| 163 } | 189 } |
| 164 } | 190 } |
| OLD | NEW |