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