| 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 dart2js.constants.expressions; | 5 library dart2js.constants.expressions; |
| 6 | 6 |
| 7 import '../dart2jslib.dart' show assertDebugMode; | 7 import '../dart2jslib.dart' show assertDebugMode; |
| 8 import '../dart_types.dart'; | 8 import '../dart_types.dart'; |
| 9 import '../elements/elements.dart' show | 9 import '../elements/elements.dart' show |
| 10 Element, | 10 Element, |
| 11 FunctionElement, | 11 FunctionElement, |
| 12 VariableElement; | 12 VariableElement; |
| 13 import '../universe/universe.dart' show Selector; | 13 import '../universe/universe.dart' show CallStructure; |
| 14 import 'values.dart'; | 14 import 'values.dart'; |
| 15 | 15 |
| 16 /// An expression that is a compile-time constant. | 16 /// An expression that is a compile-time constant. |
| 17 /// | 17 /// |
| 18 /// Whereas [ConstantValue] represent a compile-time value, a | 18 /// Whereas [ConstantValue] represent a compile-time value, a |
| 19 /// [ConstantExpression] represents an expression for creating a constant. | 19 /// [ConstantExpression] represents an expression for creating a constant. |
| 20 /// | 20 /// |
| 21 /// There is no one-to-one mapping between [ConstantExpression] and | 21 /// There is no one-to-one mapping between [ConstantExpression] and |
| 22 /// [ConstantValue], because different expressions can denote the same constant. | 22 /// [ConstantValue], because different expressions can denote the same constant. |
| 23 /// For instance, multiple `const` constructors may be used to create the same | 23 /// For instance, multiple `const` constructors may be used to create the same |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 94 accept(ConstantExpressionVisitor visitor, [context]) { | 94 accept(ConstantExpressionVisitor visitor, [context]) { |
| 95 return visitor.visitMap(this, context); | 95 return visitor.visitMap(this, context); |
| 96 } | 96 } |
| 97 } | 97 } |
| 98 | 98 |
| 99 /// Invocation of a const constructor. | 99 /// Invocation of a const constructor. |
| 100 class ConstructedConstantExpression extends ConstantExpression { | 100 class ConstructedConstantExpression extends ConstantExpression { |
| 101 final ConstantValue value; | 101 final ConstantValue value; |
| 102 final InterfaceType type; | 102 final InterfaceType type; |
| 103 final FunctionElement target; | 103 final FunctionElement target; |
| 104 final Selector selector; | 104 final CallStructure callStructure; |
| 105 final List<ConstantExpression> arguments; | 105 final List<ConstantExpression> arguments; |
| 106 | 106 |
| 107 ConstructedConstantExpression(this.value, | 107 ConstructedConstantExpression( |
| 108 this.type, | 108 this.value, |
| 109 this.target, | 109 this.type, |
| 110 this.selector, | 110 this.target, |
| 111 this.arguments) { | 111 this.callStructure, |
| 112 this.arguments) { |
| 112 assert(type.element == target.enclosingClass); | 113 assert(type.element == target.enclosingClass); |
| 113 } | 114 } |
| 114 | 115 |
| 115 accept(ConstantExpressionVisitor visitor, [context]) { | 116 accept(ConstantExpressionVisitor visitor, [context]) { |
| 116 return visitor.visitConstructed(this, context); | 117 return visitor.visitConstructed(this, context); |
| 117 } | 118 } |
| 118 } | 119 } |
| 119 | 120 |
| 120 /// String literal with juxtaposition and/or interpolations. | 121 /// String literal with juxtaposition and/or interpolations. |
| 121 // TODO(johnniwinther): Do we need this? | 122 // TODO(johnniwinther): Do we need this? |
| (...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 371 sb.write('const '); | 372 sb.write('const '); |
| 372 sb.write(exp.target.enclosingClass.name); | 373 sb.write(exp.target.enclosingClass.name); |
| 373 if (exp.target.name != '') { | 374 if (exp.target.name != '') { |
| 374 sb.write('.'); | 375 sb.write('.'); |
| 375 sb.write(exp.target.name); | 376 sb.write(exp.target.name); |
| 376 } | 377 } |
| 377 writeTypeArguments(exp.type); | 378 writeTypeArguments(exp.type); |
| 378 sb.write('('); | 379 sb.write('('); |
| 379 bool needsComma = false; | 380 bool needsComma = false; |
| 380 | 381 |
| 381 int namedOffset = exp.selector.positionalArgumentCount; | 382 int namedOffset = exp.callStructure.positionalArgumentCount; |
| 382 for (int index = 0; index < namedOffset; index++) { | 383 for (int index = 0; index < namedOffset; index++) { |
| 383 if (needsComma) { | 384 if (needsComma) { |
| 384 sb.write(', '); | 385 sb.write(', '); |
| 385 } | 386 } |
| 386 visit(exp.arguments[index]); | 387 visit(exp.arguments[index]); |
| 387 needsComma = true; | 388 needsComma = true; |
| 388 } | 389 } |
| 389 for (int index = 0; index < exp.selector.namedArgumentCount; index++) { | 390 for (int index = 0; index < exp.callStructure.namedArgumentCount; index++) { |
| 390 if (needsComma) { | 391 if (needsComma) { |
| 391 sb.write(', '); | 392 sb.write(', '); |
| 392 } | 393 } |
| 393 sb.write(exp.selector.namedArguments[index]); | 394 sb.write(exp.callStructure.namedArguments[index]); |
| 394 sb.write(': '); | 395 sb.write(': '); |
| 395 visit(exp.arguments[namedOffset + index]); | 396 visit(exp.arguments[namedOffset + index]); |
| 396 needsComma = true; | 397 needsComma = true; |
| 397 } | 398 } |
| 398 sb.write(')'); | 399 sb.write(')'); |
| 399 } | 400 } |
| 400 | 401 |
| 401 @override | 402 @override |
| 402 void visitConcatenate(ConcatenateConstantExpression exp, [_]) { | 403 void visitConcatenate(ConcatenateConstantExpression exp, [_]) { |
| 403 sb.write(exp.value.unparse()); | 404 sb.write(exp.value.unparse()); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 459 void visitConditional(ConditionalConstantExpression exp, [_]) { | 460 void visitConditional(ConditionalConstantExpression exp, [_]) { |
| 460 write(exp, exp.condition, leftAssociative: false); | 461 write(exp, exp.condition, leftAssociative: false); |
| 461 sb.write(' ? '); | 462 sb.write(' ? '); |
| 462 write(exp, exp.trueExp); | 463 write(exp, exp.trueExp); |
| 463 sb.write(' : '); | 464 sb.write(' : '); |
| 464 write(exp, exp.falseExp); | 465 write(exp, exp.falseExp); |
| 465 } | 466 } |
| 466 | 467 |
| 467 String toString() => sb.toString(); | 468 String toString() => sb.toString(); |
| 468 } | 469 } |
| OLD | NEW |