| OLD | NEW |
| 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 |
| 3 // BSD-style license that can be found in the LICENSE file. |
| 4 |
| 1 library dart_codegen; | 5 library dart_codegen; |
| 2 | 6 |
| 3 import 'dart_tree.dart' as tree; | 7 import 'dart_tree.dart' as tree; |
| 4 import 'dart_printer.dart'; | 8 import 'dart_printer.dart'; |
| 5 import 'dart_tree_printer.dart' show TreePrinter; | 9 import 'dart_tree_printer.dart' show TreePrinter; |
| 6 import '../tree/tree.dart' as frontend; | 10 import '../tree/tree.dart' as frontend; |
| 7 import '../dart2jslib.dart' as dart2js; | 11 import '../dart2jslib.dart' as dart2js; |
| 8 import '../elements/elements.dart'; | 12 import '../elements/elements.dart'; |
| 9 import '../dart_types.dart'; | 13 import '../dart_types.dart'; |
| 10 import '../elements/modelx.dart' as modelx; | 14 import '../elements/modelx.dart' as modelx; |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 156 Expression visitConstant(tree.Constant exp) { | 160 Expression visitConstant(tree.Constant exp) { |
| 157 return emitConstant(exp.value); | 161 return emitConstant(exp.value); |
| 158 } | 162 } |
| 159 | 163 |
| 160 Expression visitInvokeStatic(tree.InvokeStatic exp) { | 164 Expression visitInvokeStatic(tree.InvokeStatic exp) { |
| 161 List args = exp.arguments.map(visitExpression).toList(growable:false); | 165 List args = exp.arguments.map(visitExpression).toList(growable:false); |
| 162 return new CallStatic(null, exp.target.name, args) | 166 return new CallStatic(null, exp.target.name, args) |
| 163 ..element = exp.target; | 167 ..element = exp.target; |
| 164 } | 168 } |
| 165 | 169 |
| 170 Expression visitInvokeMethod(tree.InvokeMethod exp) { |
| 171 // TODO: Derive named arguments from selector? |
| 172 Expression receiver = visitExpression(exp.receiver); |
| 173 List args = exp.arguments.map(visitExpression).toList(growable:false); |
| 174 switch (exp.selector.kind) { |
| 175 case SelectorKind.CALL: |
| 176 return new CallMethod(receiver, exp.selector.name, args); |
| 177 |
| 178 case SelectorKind.OPERATOR: |
| 179 if (args.length == 0) { |
| 180 String name = exp.selector.name; |
| 181 if (name == 'unary-') { |
| 182 name = '-'; |
| 183 } |
| 184 return new UnaryOperator(name, receiver); |
| 185 } |
| 186 return new BinaryOperator(receiver, exp.selector.name, args[0]); |
| 187 |
| 188 case SelectorKind.GETTER: |
| 189 return new FieldExpression(receiver, exp.selector.name); |
| 190 |
| 191 case SelectorKind.SETTER: |
| 192 return new Assignment( |
| 193 new FieldExpression(receiver, exp.selector.name), |
| 194 '=', |
| 195 args[0]); |
| 196 |
| 197 case SelectorKind.INDEX: |
| 198 Expression e = new IndexExpression(receiver, args[0]); |
| 199 if (args.length == 2) { |
| 200 e = new Assignment(e, '=', args[1]); |
| 201 } |
| 202 return e; |
| 203 |
| 204 default: |
| 205 throw "Unexpected selector in InvokeMethod: ${exp.selector.kind}"; |
| 206 } |
| 207 } |
| 208 |
| 209 Expression visitInvokeConstructor(tree.InvokeConstructor exp) { |
| 210 List args = exp.arguments.map(visitExpression).toList(growable:false); |
| 211 FunctionElement constructor = exp.target; |
| 212 String name = constructor.name.isEmpty ? null : constructor.name; |
| 213 return new CallNew(emitType(exp.type), args, constructorName: name) |
| 214 ..constructor = constructor |
| 215 ..dartType = exp.type; |
| 216 } |
| 217 |
| 166 Expression visitVariable(tree.Variable exp) { | 218 Expression visitVariable(tree.Variable exp) { |
| 167 return new Identifier(exp.name) | 219 return new Identifier(exp.name) |
| 168 ..element = exp.element; | 220 ..element = exp.element; |
| 169 } | 221 } |
| 170 | 222 |
| 171 TypeAnnotation emitType(DartType type) { | 223 TypeAnnotation emitType(DartType type) { |
| 172 if (type is GenericType) { // TODO(asgerf): faster Link.map | 224 if (type is GenericType) { // TODO(asgerf): faster Link.map |
| 173 return new TypeAnnotation( | 225 return new TypeAnnotation( |
| 174 type.element.name, | 226 type.element.name, |
| 175 type.typeArguments.toList(growable:false) | 227 type.typeArguments.toList(growable:false) |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 207 emitConstant(constant.keys.entries[i]), | 259 emitConstant(constant.keys.entries[i]), |
| 208 emitConstant(constant.values[i]))); | 260 emitConstant(constant.values[i]))); |
| 209 } | 261 } |
| 210 return new LiteralMap(entries, isConst: true); | 262 return new LiteralMap(entries, isConst: true); |
| 211 } else { | 263 } else { |
| 212 throw "Unsupported constant: ${constant.runtimeType}"; | 264 throw "Unsupported constant: ${constant.runtimeType}"; |
| 213 } | 265 } |
| 214 } | 266 } |
| 215 } | 267 } |
| 216 | 268 |
| OLD | NEW |