Index: pkg/compiler/lib/src/constants/values.dart |
diff --git a/pkg/compiler/lib/src/constants/values.dart b/pkg/compiler/lib/src/constants/values.dart |
index fbda202d80ea6108baf3ea492872fc8ec2554ea6..cba4e69155ba8949bf1cbc55a3955291eb781654 100644 |
--- a/pkg/compiler/lib/src/constants/values.dart |
+++ b/pkg/compiler/lib/src/constants/values.dart |
@@ -12,6 +12,23 @@ import '../elements/elements.dart' |
import '../tree/dartstring.dart'; |
import '../util/util.dart' show Hashing; |
+enum ConstantValueKind { |
+ FUNCTION, |
+ NULL, |
+ INT, |
+ DOUBLE, |
+ BOOL, |
+ STRING, |
+ LIST, |
+ MAP, |
+ CONSTRUCTED, |
+ TYPE, |
+ INTERCEPTOR, |
+ SYNTHETIC, |
+ DEFERRED, |
+ NON_CONSTANT, |
+} |
+ |
abstract class ConstantValueVisitor<R, A> { |
const ConstantValueVisitor(); |
@@ -84,6 +101,8 @@ abstract class ConstantValue { |
/// Returns a structured representation of this constant suited for debugging. |
String toStructuredText(); |
+ ConstantValueKind get kind; |
+ |
String toString() { |
assertDebugMode("Use ConstantValue.toDartText() or " |
"ConstantValue.toStructuredText() " |
@@ -118,6 +137,8 @@ class FunctionConstantValue extends ConstantValue { |
accept(ConstantValueVisitor visitor, arg) => visitor.visitFunction(this, arg); |
+ ConstantValueKind get kind => ConstantValueKind.FUNCTION; |
+ |
String toDartText() { |
if (element.isStatic) { |
return '${element.enclosingClass.name}.${element.name}'; |
@@ -177,6 +198,8 @@ class NullConstantValue extends PrimitiveConstantValue { |
accept(ConstantValueVisitor visitor, arg) => visitor.visitNull(this, arg); |
+ ConstantValueKind get kind => ConstantValueKind.NULL; |
+ |
String toStructuredText() => 'NullConstant'; |
} |
@@ -258,6 +281,8 @@ class IntConstantValue extends NumConstantValue { |
accept(ConstantValueVisitor visitor, arg) => visitor.visitInt(this, arg); |
+ ConstantValueKind get kind => ConstantValueKind.INT; |
+ |
String toStructuredText() => 'IntConstant(${toDartText()})'; |
} |
@@ -320,6 +345,8 @@ class DoubleConstantValue extends NumConstantValue { |
accept(ConstantValueVisitor visitor, arg) => visitor.visitDouble(this, arg); |
+ ConstantValueKind get kind => ConstantValueKind.DOUBLE; |
+ |
String toStructuredText() => 'DoubleConstant(${toDartText()})'; |
} |
@@ -338,6 +365,8 @@ abstract class BoolConstantValue extends PrimitiveConstantValue { |
accept(ConstantValueVisitor visitor, arg) => visitor.visitBool(this, arg); |
+ ConstantValueKind get kind => ConstantValueKind.BOOL; |
+ |
String toStructuredText() => 'BoolConstant(${toDartText()})'; |
} |
@@ -414,6 +443,8 @@ class StringConstantValue extends PrimitiveConstantValue { |
accept(ConstantValueVisitor visitor, arg) => visitor.visitString(this, arg); |
+ ConstantValueKind get kind => ConstantValueKind.STRING; |
+ |
// TODO(johnniwinther): Ensure correct escaping. |
String toDartText() => '"${primitiveValue.slowToString()}"'; |
@@ -457,6 +488,8 @@ class TypeConstantValue extends ObjectConstantValue { |
accept(ConstantValueVisitor visitor, arg) => visitor.visitType(this, arg); |
+ ConstantValueKind get kind => ConstantValueKind.TYPE; |
+ |
String toDartText() => '$representedType'; |
String toStructuredText() => 'TypeConstant(${representedType})'; |
@@ -492,6 +525,8 @@ class ListConstantValue extends ObjectConstantValue { |
accept(ConstantValueVisitor visitor, arg) => visitor.visitList(this, arg); |
+ ConstantValueKind get kind => ConstantValueKind.LIST; |
+ |
String toDartText() { |
StringBuffer sb = new StringBuffer(); |
_unparseTypeArguments(sb); |
@@ -567,6 +602,8 @@ class MapConstantValue extends ObjectConstantValue { |
accept(ConstantValueVisitor visitor, arg) => visitor.visitMap(this, arg); |
+ ConstantValueKind get kind => ConstantValueKind.MAP; |
+ |
String toDartText() { |
StringBuffer sb = new StringBuffer(); |
_unparseTypeArguments(sb); |
@@ -621,6 +658,8 @@ class InterceptorConstantValue extends ConstantValue { |
DartType getType(CoreTypes types) => const DynamicType(); |
+ ConstantValueKind get kind => ConstantValueKind.INTERCEPTOR; |
+ |
String toDartText() { |
return 'interceptor($dispatchedType)'; |
} |
@@ -632,9 +671,9 @@ class InterceptorConstantValue extends ConstantValue { |
class SyntheticConstantValue extends ConstantValue { |
final payload; |
- final kind; |
+ final valueKind; |
- SyntheticConstantValue(this.kind, this.payload); |
+ SyntheticConstantValue(this.valueKind, this.payload); |
bool get isDummy => true; |
@@ -642,7 +681,7 @@ class SyntheticConstantValue extends ConstantValue { |
return other is SyntheticConstantValue && payload == other.payload; |
} |
- get hashCode => payload.hashCode * 17 + kind.hashCode; |
+ get hashCode => payload.hashCode * 17 + valueKind.hashCode; |
List<ConstantValue> getDependencies() => const <ConstantValue>[]; |
@@ -652,9 +691,11 @@ class SyntheticConstantValue extends ConstantValue { |
DartType getType(CoreTypes types) => const DynamicType(); |
- String toDartText() => 'synthetic($kind, $payload)'; |
+ ConstantValueKind get kind => ConstantValueKind.SYNTHETIC; |
- String toStructuredText() => 'SyntheticConstant($kind, $payload)'; |
+ String toDartText() => 'synthetic($valueKind, $payload)'; |
+ |
+ String toStructuredText() => 'SyntheticConstant($valueKind, $payload)'; |
} |
class ConstructedConstantValue extends ObjectConstantValue { |
@@ -693,6 +734,8 @@ class ConstructedConstantValue extends ObjectConstantValue { |
return visitor.visitConstructed(this, arg); |
} |
+ ConstantValueKind get kind => ConstantValueKind.CONSTRUCTED; |
+ |
String toDartText() { |
StringBuffer sb = new StringBuffer(); |
sb.write(type.name); |
@@ -752,6 +795,8 @@ class DeferredConstantValue extends ConstantValue { |
DartType getType(CoreTypes types) => referenced.getType(types); |
+ ConstantValueKind get kind => ConstantValueKind.DEFERRED; |
+ |
String toDartText() => 'deferred(${referenced.toDartText()})'; |
String toStructuredText() { |
@@ -776,6 +821,8 @@ class NonConstantValue extends ConstantValue { |
@override |
DartType getType(CoreTypes types) => const DynamicType(); |
+ ConstantValueKind get kind => ConstantValueKind.NON_CONSTANT; |
+ |
@override |
String toStructuredText() => 'NonConstant'; |