Index: pkg/compiler/lib/src/constants/expressions.dart |
diff --git a/pkg/compiler/lib/src/constants/expressions.dart b/pkg/compiler/lib/src/constants/expressions.dart |
index 32c678984d3bcbbc2d6db039965031bcace59e40..23d65f295ea6b880d9ae3699a9cfe3cb64e68d56 100644 |
--- a/pkg/compiler/lib/src/constants/expressions.dart |
+++ b/pkg/compiler/lib/src/constants/expressions.dart |
@@ -261,11 +261,6 @@ abstract class ConstantExpression { |
ConstantExpressionKind get kind; |
- /// Returns the value of this constant expression. |
- // TODO(johnniwinther): Replace this with an evaluation method that takes |
- // a constant system and an environment. |
- ConstantValue get value; |
- |
// TODO(johnniwinther): Unify precedence handled between constants, front-end |
// and back-end. |
int get precedence => 16; |
@@ -314,8 +309,6 @@ abstract class ConstantExpression { |
/// A synthetic constant used to recover from errors. |
class ErroneousConstantExpression extends ConstantExpression { |
- final PrimitiveConstantValue value = new NullConstantValue(); |
- |
ConstantExpressionKind get kind => ConstantExpressionKind.ERRONEOUS; |
accept(ConstantExpressionVisitor visitor, [context]) { |
@@ -326,7 +319,7 @@ class ErroneousConstantExpression extends ConstantExpression { |
ConstantValue evaluate(Environment environment, |
ConstantSystem constantSystem) { |
// TODO(johnniwinther): Use non-constant values for errors. |
- return value; |
+ return new NonConstantValue(); |
} |
@override |
@@ -338,10 +331,6 @@ class ErroneousConstantExpression extends ConstantExpression { |
/// A boolean, int, double, string, or null constant. |
abstract class PrimitiveConstantExpression extends ConstantExpression { |
- final PrimitiveConstantValue value; |
- |
- PrimitiveConstantExpression(this.value); |
- |
/// The primitive value of this contant expression. |
get primitiveValue; |
} |
@@ -350,8 +339,7 @@ abstract class PrimitiveConstantExpression extends ConstantExpression { |
class BoolConstantExpression extends PrimitiveConstantExpression { |
final bool primitiveValue; |
- BoolConstantExpression(this.primitiveValue, |
- PrimitiveConstantValue value) : super(value); |
+ BoolConstantExpression(this.primitiveValue); |
ConstantExpressionKind get kind => ConstantExpressionKind.BOOL; |
@@ -378,8 +366,7 @@ class BoolConstantExpression extends PrimitiveConstantExpression { |
class IntConstantExpression extends PrimitiveConstantExpression { |
final int primitiveValue; |
- IntConstantExpression(this.primitiveValue, |
- PrimitiveConstantValue value) : super(value); |
+ IntConstantExpression(this.primitiveValue); |
ConstantExpressionKind get kind => ConstantExpressionKind.INT; |
@@ -406,8 +393,7 @@ class IntConstantExpression extends PrimitiveConstantExpression { |
class DoubleConstantExpression extends PrimitiveConstantExpression { |
final double primitiveValue; |
- DoubleConstantExpression(this.primitiveValue, |
- PrimitiveConstantValue value) : super(value); |
+ DoubleConstantExpression(this.primitiveValue); |
ConstantExpressionKind get kind => ConstantExpressionKind.DOUBLE; |
@@ -434,8 +420,7 @@ class DoubleConstantExpression extends PrimitiveConstantExpression { |
class StringConstantExpression extends PrimitiveConstantExpression { |
final String primitiveValue; |
- StringConstantExpression(this.primitiveValue, |
- PrimitiveConstantValue value) : super(value); |
+ StringConstantExpression(this.primitiveValue); |
ConstantExpressionKind get kind => ConstantExpressionKind.STRING; |
@@ -460,7 +445,7 @@ class StringConstantExpression extends PrimitiveConstantExpression { |
/// Null literal constant. |
class NullConstantExpression extends PrimitiveConstantExpression { |
- NullConstantExpression(PrimitiveConstantValue value) : super(value); |
+ NullConstantExpression(); |
ConstantExpressionKind get kind => ConstantExpressionKind.NULL; |
@@ -485,11 +470,10 @@ class NullConstantExpression extends PrimitiveConstantExpression { |
/// Literal list constant. |
class ListConstantExpression extends ConstantExpression { |
- final ListConstantValue value; |
final InterfaceType type; |
final List<ConstantExpression> values; |
- ListConstantExpression(this.value, this.type, this.values); |
+ ListConstantExpression(this.type, this.values); |
ConstantExpressionKind get kind => ConstantExpressionKind.LIST; |
@@ -505,8 +489,8 @@ class ListConstantExpression extends ConstantExpression { |
} |
ConstantExpression apply(NormalizedArguments arguments) { |
- return new ListConstantExpression(null, type, |
- values.map((v) => v.apply(arguments)).toList()); |
+ return new ListConstantExpression( |
+ type, values.map((v) => v.apply(arguments)).toList()); |
} |
@override |
@@ -531,12 +515,11 @@ class ListConstantExpression extends ConstantExpression { |
/// Literal map constant. |
class MapConstantExpression extends ConstantExpression { |
- final MapConstantValue value; |
final InterfaceType type; |
final List<ConstantExpression> keys; |
final List<ConstantExpression> values; |
- MapConstantExpression(this.value, this.type, this.keys, this.values); |
+ MapConstantExpression(this.type, this.keys, this.values); |
ConstantExpressionKind get kind => ConstantExpressionKind.MAP; |
@@ -554,7 +537,8 @@ class MapConstantExpression extends ConstantExpression { |
} |
ConstantExpression apply(NormalizedArguments arguments) { |
- return new MapConstantExpression(null, type, |
+ return new MapConstantExpression( |
+ type, |
keys.map((k) => k.apply(arguments)).toList(), |
values.map((v) => v.apply(arguments)).toList()); |
} |
@@ -582,14 +566,12 @@ class MapConstantExpression extends ConstantExpression { |
/// Invocation of a const constructor. |
class ConstructedConstantExpression extends ConstantExpression { |
- final ConstantValue value; |
final InterfaceType type; |
final ConstructorElement target; |
final CallStructure callStructure; |
final List<ConstantExpression> arguments; |
ConstructedConstantExpression( |
- this.value, |
this.type, |
this.target, |
this.callStructure, |
@@ -614,7 +596,7 @@ class ConstructedConstantExpression extends ConstantExpression { |
} |
ConstructedConstantExpression apply(NormalizedArguments arguments) { |
- return new ConstructedConstantExpression(null, |
+ return new ConstructedConstantExpression( |
type, target, callStructure, |
this.arguments.map((a) => a.apply(arguments)).toList()); |
} |
@@ -657,10 +639,9 @@ class ConstructedConstantExpression extends ConstantExpression { |
/// String literal with juxtaposition and/or interpolations. |
class ConcatenateConstantExpression extends ConstantExpression { |
- final StringConstantValue value; |
final List<ConstantExpression> expressions; |
- ConcatenateConstantExpression(this.value, this.expressions); |
+ ConcatenateConstantExpression(this.expressions); |
ConstantExpressionKind get kind => ConstantExpressionKind.CONCATENATE; |
@@ -669,7 +650,7 @@ class ConcatenateConstantExpression extends ConstantExpression { |
} |
ConstantExpression apply(NormalizedArguments arguments) { |
- return new ConcatenateConstantExpression(null, |
+ return new ConcatenateConstantExpression( |
expressions.map((a) => a.apply(arguments)).toList()); |
} |
@@ -722,10 +703,9 @@ class ConcatenateConstantExpression extends ConstantExpression { |
/// Symbol literal. |
class SymbolConstantExpression extends ConstantExpression { |
- final ConstructedConstantValue value; |
final String name; |
- SymbolConstantExpression(this.value, this.name); |
+ SymbolConstantExpression(this.name); |
ConstantExpressionKind get kind => ConstantExpressionKind.SYMBOL; |
@@ -751,11 +731,10 @@ class SymbolConstantExpression extends ConstantExpression { |
/// Type literal. |
class TypeConstantExpression extends ConstantExpression { |
- final TypeConstantValue value; |
/// Either [DynamicType] or a raw [GenericType]. |
final DartType type; |
- TypeConstantExpression(this.value, this.type) { |
+ TypeConstantExpression(this.type) { |
assert(type is GenericType || type is DynamicType); |
} |
@@ -782,10 +761,9 @@ class TypeConstantExpression extends ConstantExpression { |
/// Reference to a constant local, top-level, or static variable. |
class VariableConstantExpression extends ConstantExpression { |
- final ConstantValue value; |
final VariableElement element; |
- VariableConstantExpression(this.value, this.element); |
+ VariableConstantExpression(this.element); |
ConstantExpressionKind get kind => ConstantExpressionKind.VARIABLE; |
@@ -810,10 +788,9 @@ class VariableConstantExpression extends ConstantExpression { |
/// Reference to a top-level or static function. |
class FunctionConstantExpression extends ConstantExpression { |
- final FunctionConstantValue value; |
final FunctionElement element; |
- FunctionConstantExpression(this.value, this.element); |
+ FunctionConstantExpression(this.element); |
ConstantExpressionKind get kind => ConstantExpressionKind.FUNCTION; |
@@ -838,12 +815,11 @@ class FunctionConstantExpression extends ConstantExpression { |
/// A constant binary expression like `a * b`. |
class BinaryConstantExpression extends ConstantExpression { |
- final ConstantValue value; |
final ConstantExpression left; |
final BinaryOperator operator; |
final ConstantExpression right; |
- BinaryConstantExpression(this.value, this.left, this.operator, this.right) { |
+ BinaryConstantExpression(this.left, this.operator, this.right) { |
assert(PRECEDENCE_MAP[operator.kind] != null); |
} |
@@ -863,7 +839,6 @@ class BinaryConstantExpression extends ConstantExpression { |
ConstantExpression apply(NormalizedArguments arguments) { |
return new BinaryConstantExpression( |
- value, |
left.apply(arguments), |
operator, |
right.apply(arguments)); |
@@ -910,11 +885,10 @@ class BinaryConstantExpression extends ConstantExpression { |
/// A constant identical invocation like `identical(a, b)`. |
class IdenticalConstantExpression extends ConstantExpression { |
- final ConstantValue value; |
final ConstantExpression left; |
final ConstantExpression right; |
- IdenticalConstantExpression(this.value, this.left, this.right); |
+ IdenticalConstantExpression(this.left, this.right); |
ConstantExpressionKind get kind => ConstantExpressionKind.IDENTICAL; |
@@ -932,7 +906,6 @@ class IdenticalConstantExpression extends ConstantExpression { |
ConstantExpression apply(NormalizedArguments arguments) { |
return new IdenticalConstantExpression( |
- value, |
left.apply(arguments), |
right.apply(arguments)); |
} |
@@ -954,11 +927,10 @@ class IdenticalConstantExpression extends ConstantExpression { |
/// A unary constant expression like `-a`. |
class UnaryConstantExpression extends ConstantExpression { |
- final ConstantValue value; |
final UnaryOperator operator; |
final ConstantExpression expression; |
- UnaryConstantExpression(this.value, this.operator, this.expression) { |
+ UnaryConstantExpression(this.operator, this.expression) { |
assert(PRECEDENCE_MAP[operator.kind] != null); |
} |
@@ -977,7 +949,6 @@ class UnaryConstantExpression extends ConstantExpression { |
ConstantExpression apply(NormalizedArguments arguments) { |
return new UnaryConstantExpression( |
- value, |
operator, |
expression.apply(arguments)); |
} |
@@ -1006,10 +977,9 @@ class UnaryConstantExpression extends ConstantExpression { |
/// A string length constant expression like `a.length`. |
class StringLengthConstantExpression extends ConstantExpression { |
- final ConstantValue value; |
final ConstantExpression expression; |
- StringLengthConstantExpression(this.value, this.expression); |
+ StringLengthConstantExpression(this.expression); |
ConstantExpressionKind get kind => ConstantExpressionKind.STRING_LENGTH; |
@@ -1029,9 +999,7 @@ class StringLengthConstantExpression extends ConstantExpression { |
} |
ConstantExpression apply(NormalizedArguments arguments) { |
- return new StringLengthConstantExpression( |
- value, |
- expression.apply(arguments)); |
+ return new StringLengthConstantExpression(expression.apply(arguments)); |
} |
int get precedence => 15; |
@@ -1049,13 +1017,11 @@ class StringLengthConstantExpression extends ConstantExpression { |
/// A constant conditional expression like `a ? b : c`. |
class ConditionalConstantExpression extends ConstantExpression { |
- final ConstantValue value; |
final ConstantExpression condition; |
final ConstantExpression trueExp; |
final ConstantExpression falseExp; |
- ConditionalConstantExpression(this.value, |
- this.condition, |
+ ConditionalConstantExpression(this.condition, |
this.trueExp, |
this.falseExp); |
@@ -1067,7 +1033,6 @@ class ConditionalConstantExpression extends ConstantExpression { |
ConstantExpression apply(NormalizedArguments arguments) { |
return new ConditionalConstantExpression( |
- value, |
condition.apply(arguments), |
trueExp.apply(arguments), |
falseExp.apply(arguments)); |
@@ -1122,10 +1087,6 @@ class PositionalArgumentReference extends ConstantExpression { |
return visitor.visitPositional(this, context); |
} |
- ConstantValue get value { |
- throw new UnsupportedError('PositionalArgumentReference.value'); |
- } |
- |
ConstantExpression apply(NormalizedArguments arguments) { |
return arguments.getPositionalArgument(index); |
} |
@@ -1157,10 +1118,6 @@ class NamedArgumentReference extends ConstantExpression { |
return visitor.visitNamed(this, context); |
} |
- ConstantValue get value { |
- throw new UnsupportedError('NamedArgumentReference.value'); |
- } |
- |
ConstantExpression apply(NormalizedArguments arguments) { |
return arguments.getNamedArgument(name); |
} |
@@ -1179,11 +1136,10 @@ class NamedArgumentReference extends ConstantExpression { |
} |
abstract class FromEnvironmentConstantExpression extends ConstantExpression { |
- final ConstantValue value; |
final ConstantExpression name; |
final ConstantExpression defaultValue; |
- FromEnvironmentConstantExpression(this.value, this.name, this.defaultValue); |
+ FromEnvironmentConstantExpression(this.name, this.defaultValue); |
@override |
int _computeHashCode() { |
@@ -1203,10 +1159,9 @@ class BoolFromEnvironmentConstantExpression |
extends FromEnvironmentConstantExpression { |
BoolFromEnvironmentConstantExpression( |
- ConstantValue value, |
ConstantExpression name, |
ConstantExpression defaultValue) |
- : super(value, name, defaultValue); |
+ : super(name, defaultValue); |
ConstantExpressionKind get kind { |
return ConstantExpressionKind.BOOL_FROM_ENVIRONMENT; |
@@ -1245,7 +1200,6 @@ class BoolFromEnvironmentConstantExpression |
ConstantExpression apply(NormalizedArguments arguments) { |
return new BoolFromEnvironmentConstantExpression( |
- null, |
name.apply(arguments), |
defaultValue != null ? defaultValue.apply(arguments) : null); |
} |
@@ -1256,10 +1210,9 @@ class IntFromEnvironmentConstantExpression |
extends FromEnvironmentConstantExpression { |
IntFromEnvironmentConstantExpression( |
- ConstantValue value, |
ConstantExpression name, |
ConstantExpression defaultValue) |
- : super(value, name, defaultValue); |
+ : super(name, defaultValue); |
ConstantExpressionKind get kind { |
return ConstantExpressionKind.INT_FROM_ENVIRONMENT; |
@@ -1300,7 +1253,6 @@ class IntFromEnvironmentConstantExpression |
ConstantExpression apply(NormalizedArguments arguments) { |
return new IntFromEnvironmentConstantExpression( |
- null, |
name.apply(arguments), |
defaultValue != null ? defaultValue.apply(arguments) : null); |
} |
@@ -1311,10 +1263,9 @@ class StringFromEnvironmentConstantExpression |
extends FromEnvironmentConstantExpression { |
StringFromEnvironmentConstantExpression( |
- ConstantValue value, |
ConstantExpression name, |
ConstantExpression defaultValue) |
- : super(value, name, defaultValue); |
+ : super(name, defaultValue); |
ConstantExpressionKind get kind { |
return ConstantExpressionKind.STRING_FROM_ENVIRONMENT; |
@@ -1351,7 +1302,6 @@ class StringFromEnvironmentConstantExpression |
ConstantExpression apply(NormalizedArguments arguments) { |
return new StringFromEnvironmentConstantExpression( |
- null, |
name.apply(arguments), |
defaultValue != null ? defaultValue.apply(arguments) : null); |
} |
@@ -1360,11 +1310,10 @@ class StringFromEnvironmentConstantExpression |
/// A constant expression referenced with a deferred prefix. |
/// For example `lib.C`. |
class DeferredConstantExpression extends ConstantExpression { |
- final ConstantValue value; |
final ConstantExpression expression; |
final PrefixElement prefix; |
- DeferredConstantExpression(this.value, this.expression, this.prefix); |
+ DeferredConstantExpression(this.expression, this.prefix); |
ConstantExpressionKind get kind => ConstantExpressionKind.DEFERRED; |
@@ -1381,7 +1330,7 @@ class DeferredConstantExpression extends ConstantExpression { |
ConstantExpression apply(NormalizedArguments arguments) { |
return new DeferredConstantExpression( |
- value, expression.apply(arguments), prefix); |
+ expression.apply(arguments), prefix); |
} |
@override |
@@ -1572,7 +1521,20 @@ class ConstExpPrinter extends ConstantExpressionVisitor { |
@override |
void visitConcatenate(ConcatenateConstantExpression exp, [_]) { |
- sb.write(exp.value.unparse()); |
+ sb.write('"'); |
+ for (ConstantExpression expression in exp.expressions) { |
+ if (expression.kind == ConstantExpressionKind.STRING) { |
+ StringConstantExpression string = expression; |
+ // TODO(johnniwinther): Ensure correct escaping. |
+ sb.write('${string.primitiveValue}'); |
+ } else { |
+ sb.write(r"${"); |
+ visit(expression); |
+ sb.write("}"); |
+ } |
+ |
+ } |
+ sb.write('"'); |
} |
@override |