| 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' |
| 14 show DART_CONSTANT_SYSTEM; |
| 13 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; |
| 14 import 'package:compiler/implementation/cps_ir/cps_ir_builder.dart'; | 16 import 'package:compiler/implementation/cps_ir/cps_ir_builder.dart'; |
| 15 import 'package:compiler/implementation/universe/universe.dart'; | 17 import 'package:compiler/implementation/universe/universe.dart'; |
| 16 | 18 |
| 17 import 'semantic_visitor.dart'; | 19 import 'semantic_visitor.dart'; |
| 18 import 'element_converter.dart'; | 20 import 'element_converter.dart'; |
| 19 import 'util.dart'; | 21 import 'util.dart'; |
| 20 import 'package:analyzer2dart/src/identifier_semantics.dart'; | 22 import 'package:analyzer2dart/src/identifier_semantics.dart'; |
| 21 | 23 |
| 22 class CpsGeneratingVisitor extends SemanticVisitor<ir.Node> { | 24 class CpsGeneratingVisitor extends SemanticVisitor<ir.Node> |
| 25 with IrBuilderMixin { |
| 23 final analyzer.Element element; | 26 final analyzer.Element element; |
| 24 final ElementConverter converter; | 27 final ElementConverter converter; |
| 25 final IrBuilder irBuilder = new IrBuilder(); | |
| 26 | 28 |
| 27 CpsGeneratingVisitor(this.converter, this.element); | 29 CpsGeneratingVisitor(this.converter, this.element); |
| 28 | 30 |
| 29 Source get currentSource => element.source; | 31 Source get currentSource => element.source; |
| 30 | 32 |
| 31 @override | 33 @override |
| 32 ir.FunctionDefinition visitFunctionDeclaration(FunctionDeclaration node) { | 34 ir.FunctionDefinition visitFunctionDeclaration(FunctionDeclaration node) { |
| 33 analyzer.FunctionElement function = node.element; | 35 analyzer.FunctionElement function = node.element; |
| 34 function.parameters.forEach((analyzer.ParameterElement parameter) { | 36 dart2js.FunctionElement element = converter.convertElement(function); |
| 35 // TODO(johnniwinther): Support "closure variables", that is variables | 37 return withBuilder( |
| 36 // accessed from an inner function. | 38 new IrBuilder(DART_CONSTANT_SYSTEM, |
| 37 irBuilder.createParameter(converter.convertElement(parameter), | 39 element, |
| 38 isClosureVariable: false); | 40 // TODO(johnniwinther): Supported closure variables. |
| 41 const <dart2js.Local>[]), |
| 42 () { |
| 43 function.parameters.forEach((analyzer.ParameterElement parameter) { |
| 44 // TODO(johnniwinther): Support "closure variables", that is variables |
| 45 // accessed from an inner function. |
| 46 irBuilder.createParameter(converter.convertElement(parameter), |
| 47 isClosureVariable: false); |
| 48 }); |
| 49 // Visit the body directly to avoid processing the signature as |
| 50 // expressions. |
| 51 node.functionExpression.body.accept(this); |
| 52 return irBuilder.buildFunctionDefinition(element, const []); |
| 39 }); | 53 }); |
| 40 // Visit the body directly to avoid processing the signature as expressions. | |
| 41 node.functionExpression.body.accept(this); | |
| 42 return irBuilder.buildFunctionDefinition( | |
| 43 converter.convertElement(function), const []); | |
| 44 } | 54 } |
| 45 | 55 |
| 46 @override | 56 @override |
| 47 visitStaticMethodInvocation(MethodInvocation node, | 57 visitStaticMethodInvocation(MethodInvocation node, |
| 48 AccessSemantics semantics) { | 58 AccessSemantics semantics) { |
| 49 analyzer.Element staticElement = semantics.element; | 59 analyzer.Element staticElement = semantics.element; |
| 50 dart2js.Element element = converter.convertElement(staticElement); | 60 dart2js.Element element = converter.convertElement(staticElement); |
| 51 List<ir.Definition> arguments = <ir.Definition>[]; | 61 List<ir.Definition> arguments = <ir.Definition>[]; |
| 52 for (Expression argument in node.argumentList.arguments) { | 62 for (Expression argument in node.argumentList.arguments) { |
| 53 ir.Definition value = argument.accept(this); | 63 ir.Definition value = argument.accept(this); |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 145 analyzer.Element element = semantics.element; | 155 analyzer.Element element = semantics.element; |
| 146 dart2js.Element target = converter.convertElement(element); | 156 dart2js.Element target = converter.convertElement(element); |
| 147 // TODO(johnniwinther): Selector information should be computed in the | 157 // TODO(johnniwinther): Selector information should be computed in the |
| 148 // [TreeShaker] and shared with the [CpsGeneratingVisitor]. | 158 // [TreeShaker] and shared with the [CpsGeneratingVisitor]. |
| 149 assert(invariant(node, target.isTopLevel || target.isStatic, | 159 assert(invariant(node, target.isTopLevel || target.isStatic, |
| 150 '$target expected to be top-level or static.')); | 160 '$target expected to be top-level or static.')); |
| 151 return irBuilder.buildGetStatic(target, | 161 return irBuilder.buildGetStatic(target, |
| 152 new Selector.getter(target.name, target.library)); | 162 new Selector.getter(target.name, target.library)); |
| 153 } | 163 } |
| 154 } | 164 } |
| OLD | NEW |