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 |
deleted file mode 100644 |
index 125d668bc4a6b5327a412d5a4fcdf63a454bc124..0000000000000000000000000000000000000000 |
--- a/pkg/compiler/lib/src/constants/values.dart |
+++ /dev/null |
@@ -1,834 +0,0 @@ |
-// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE file. |
- |
-library dart2js.constants.values; |
- |
-import '../dart_types.dart'; |
-import '../dart2jslib.dart' |
- show assertDebugMode, |
- Compiler; |
-import '../elements/elements.dart' |
- show ClassElement, |
- Element, |
- FunctionElement, |
- PrefixElement; |
-import '../tree/tree.dart' hide unparse; |
-import '../types/types.dart' as ti show TypeMask; |
-import '../util/util.dart' show SMI_MASK; |
- |
-abstract class ConstantValueVisitor<R> { |
- const ConstantValueVisitor(); |
- |
- R visitFunction(FunctionConstantValue constant); |
- R visitNull(NullConstantValue constant); |
- R visitInt(IntConstantValue constant); |
- R visitDouble(DoubleConstantValue constant); |
- R visitTrue(TrueConstantValue constant); |
- R visitFalse(FalseConstantValue constant); |
- R visitString(StringConstantValue constant); |
- R visitList(ListConstantValue constant); |
- R visitMap(MapConstantValue constant); |
- R visitConstructed(ConstructedConstantValue constant); |
- R visitType(TypeConstantValue constant); |
- R visitInterceptor(InterceptorConstantValue constant); |
- R visitDummy(DummyConstantValue constant); |
- R visitDeferred(DeferredConstantValue constant); |
-} |
- |
-abstract class ConstantValue { |
- const ConstantValue(); |
- |
- bool get isNull => false; |
- bool get isBool => false; |
- bool get isTrue => false; |
- bool get isFalse => false; |
- bool get isInt => false; |
- bool get isDouble => false; |
- bool get isNum => false; |
- bool get isString => false; |
- bool get isList => false; |
- bool get isMap => false; |
- bool get isConstructedObject => false; |
- bool get isFunction => false; |
- /** Returns true if the constant is null, a bool, a number or a string. */ |
- bool get isPrimitive => false; |
- /** Returns true if the constant is a list, a map or a constructed object. */ |
- bool get isObject => false; |
- bool get isType => false; |
- bool get isInterceptor => false; |
- bool get isDummy => false; |
- |
- bool get isNaN => false; |
- bool get isMinusZero => false; |
- bool get isZero => false; |
- bool get isOne => false; |
- |
- // TODO(johnniwinther): Replace with a 'type' getter. |
- DartType computeType(Compiler compiler); |
- |
- ti.TypeMask computeMask(Compiler compiler); |
- |
- List<ConstantValue> getDependencies(); |
- |
- accept(ConstantValueVisitor visitor); |
- |
- /// The value of this constant in Dart syntax, if possible. |
- /// |
- /// For [ConstructedConstantValue]s there is no way to create a valid const |
- /// expression from the value so the unparse of these is best effort. |
- /// |
- /// For the synthetic constants, [DeferredConstantValue], |
- /// [DummyConstantValue], [InterceptorConstantValue] the unparse is |
- /// descriptive only. |
- String unparse(); |
- |
- /// Returns a structured representation of this constant suited for debugging. |
- String toStructuredString(); |
- |
- String toString() { |
- assertDebugMode("Use Constant.unparse() or Constant.toStructuredString() " |
- "instead of Constant.toString()."); |
- return toStructuredString(); |
- } |
-} |
- |
-class FunctionConstantValue extends ConstantValue { |
- Element element; |
- |
- FunctionConstantValue(this.element); |
- |
- bool get isFunction => true; |
- |
- bool operator ==(var other) { |
- if (other is !FunctionConstantValue) return false; |
- return identical(other.element, element); |
- } |
- |
- List<ConstantValue> getDependencies() => const <ConstantValue>[]; |
- |
- DartString toDartString() { |
- return new DartString.literal(element.name); |
- } |
- |
- // TODO(johnniwinther): remove computeType. |
- DartType computeType(Compiler compiler) => element.computeType(compiler); |
- |
- ti.TypeMask computeMask(Compiler compiler) { |
- return compiler.typesTask.functionType; |
- } |
- |
- int get hashCode => (17 * element.hashCode) & 0x7fffffff; |
- |
- accept(ConstantValueVisitor visitor) => visitor.visitFunction(this); |
- |
- String unparse() { |
- if (element.isStatic) { |
- return '${element.enclosingClass.name}.${element.name}'; |
- } else { |
- return '${element.name}'; |
- } |
- } |
- |
- String toStructuredString() { |
- return 'FunctionConstant(${unparse()})'; |
- } |
-} |
- |
-abstract class PrimitiveConstantValue extends ConstantValue { |
- get primitiveValue; |
- |
- const PrimitiveConstantValue(); |
- |
- bool get isPrimitive => true; |
- |
- bool operator ==(var other) { |
- if (other is !PrimitiveConstantValue) return false; |
- PrimitiveConstantValue otherPrimitive = other; |
- // We use == instead of 'identical' so that DartStrings compare correctly. |
- return primitiveValue == otherPrimitive.primitiveValue; |
- } |
- |
- int get hashCode => throw new UnsupportedError('PrimitiveConstant.hashCode'); |
- |
- // Primitive constants don't have dependencies. |
- List<ConstantValue> getDependencies() => const <ConstantValue>[]; |
- |
- DartString toDartString(); |
- |
- /// This value in Dart syntax. |
- String unparse() => primitiveValue.toString(); |
-} |
- |
-class NullConstantValue extends PrimitiveConstantValue { |
- /** The value a Dart null is compiled to in JavaScript. */ |
- static const String JsNull = "null"; |
- |
- factory NullConstantValue() => const NullConstantValue._internal(); |
- |
- const NullConstantValue._internal(); |
- |
- bool get isNull => true; |
- |
- get primitiveValue => null; |
- |
- DartType computeType(Compiler compiler) { |
- return compiler.nullClass.computeType(compiler); |
- } |
- |
- ti.TypeMask computeMask(Compiler compiler) { |
- return compiler.typesTask.nullType; |
- } |
- |
- // The magic constant has no meaning. It is just a random value. |
- int get hashCode => 785965825; |
- |
- DartString toDartString() => const LiteralDartString("null"); |
- |
- accept(ConstantValueVisitor visitor) => visitor.visitNull(this); |
- |
- String toStructuredString() => 'NullConstant'; |
-} |
- |
-abstract class NumConstantValue extends PrimitiveConstantValue { |
- const NumConstantValue(); |
- |
- num get primitiveValue; |
- |
- bool get isNum => true; |
-} |
- |
-class IntConstantValue extends NumConstantValue { |
- final int primitiveValue; |
- |
- factory IntConstantValue(int value) { |
- switch (value) { |
- case 0: return const IntConstantValue._internal(0); |
- case 1: return const IntConstantValue._internal(1); |
- case 2: return const IntConstantValue._internal(2); |
- case 3: return const IntConstantValue._internal(3); |
- case 4: return const IntConstantValue._internal(4); |
- case 5: return const IntConstantValue._internal(5); |
- case 6: return const IntConstantValue._internal(6); |
- case 7: return const IntConstantValue._internal(7); |
- case 8: return const IntConstantValue._internal(8); |
- case 9: return const IntConstantValue._internal(9); |
- case 10: return const IntConstantValue._internal(10); |
- case -1: return const IntConstantValue._internal(-1); |
- case -2: return const IntConstantValue._internal(-2); |
- default: return new IntConstantValue._internal(value); |
- } |
- } |
- |
- const IntConstantValue._internal(this.primitiveValue); |
- |
- bool get isInt => true; |
- |
- bool isUInt31() => primitiveValue >= 0 && primitiveValue < (1 << 31); |
- |
- bool isUInt32() => primitiveValue >= 0 && primitiveValue < (1 << 32); |
- |
- bool isPositive() => primitiveValue >= 0; |
- |
- bool get isZero => primitiveValue == 0; |
- |
- bool get isOne => primitiveValue == 1; |
- |
- DartType computeType(Compiler compiler) { |
- return compiler.intClass.rawType; |
- } |
- |
- ti.TypeMask computeMask(Compiler compiler) { |
- if (isUInt31()) return compiler.typesTask.uint31Type; |
- if (isUInt32()) return compiler.typesTask.uint32Type; |
- if (isPositive()) return compiler.typesTask.positiveIntType; |
- return compiler.typesTask.intType; |
- } |
- |
- // We have to override the equality operator so that ints and doubles are |
- // treated as separate constants. |
- // The is [:!IntConstant:] check at the beginning of the function makes sure |
- // that we compare only equal to integer constants. |
- bool operator ==(var other) { |
- if (other is !IntConstantValue) return false; |
- IntConstantValue otherInt = other; |
- return primitiveValue == otherInt.primitiveValue; |
- } |
- |
- int get hashCode => primitiveValue & SMI_MASK; |
- |
- DartString toDartString() { |
- return new DartString.literal(primitiveValue.toString()); |
- } |
- |
- accept(ConstantValueVisitor visitor) => visitor.visitInt(this); |
- |
- String toStructuredString() => 'IntConstant(${unparse()})'; |
-} |
- |
-class DoubleConstantValue extends NumConstantValue { |
- final double primitiveValue; |
- |
- factory DoubleConstantValue(double value) { |
- if (value.isNaN) { |
- return const DoubleConstantValue._internal(double.NAN); |
- } else if (value == double.INFINITY) { |
- return const DoubleConstantValue._internal(double.INFINITY); |
- } else if (value == -double.INFINITY) { |
- return const DoubleConstantValue._internal(-double.INFINITY); |
- } else if (value == 0.0 && !value.isNegative) { |
- return const DoubleConstantValue._internal(0.0); |
- } else if (value == 1.0) { |
- return const DoubleConstantValue._internal(1.0); |
- } else { |
- return new DoubleConstantValue._internal(value); |
- } |
- } |
- |
- const DoubleConstantValue._internal(this.primitiveValue); |
- |
- bool get isDouble => true; |
- |
- bool get isNaN => primitiveValue.isNaN; |
- |
- // We need to check for the negative sign since -0.0 == 0.0. |
- bool get isMinusZero => primitiveValue == 0.0 && primitiveValue.isNegative; |
- |
- bool get isZero => primitiveValue == 0.0; |
- |
- bool get isOne => primitiveValue == 1.0; |
- |
- DartType computeType(Compiler compiler) { |
- return compiler.doubleClass.rawType; |
- } |
- |
- ti.TypeMask computeMask(Compiler compiler) { |
- // We have to distinguish -0.0 from 0, but for all practical purposes |
- // -0.0 is an integer. |
- // TODO(17235): this kind of special casing should only happen in the |
- // backend. |
- if (isMinusZero && compiler.backend.constantSystem.isInt(this)) { |
- return compiler.typesTask.uint31Type; |
- } |
- assert(!compiler.backend.constantSystem.isInt(this)); |
- return compiler.typesTask.doubleType; |
- } |
- |
- bool operator ==(var other) { |
- if (other is !DoubleConstantValue) return false; |
- DoubleConstantValue otherDouble = other; |
- double otherValue = otherDouble.primitiveValue; |
- if (primitiveValue == 0.0 && otherValue == 0.0) { |
- return primitiveValue.isNegative == otherValue.isNegative; |
- } else if (primitiveValue.isNaN) { |
- return otherValue.isNaN; |
- } else { |
- return primitiveValue == otherValue; |
- } |
- } |
- |
- int get hashCode => primitiveValue.hashCode; |
- |
- DartString toDartString() { |
- return new DartString.literal(primitiveValue.toString()); |
- } |
- |
- accept(ConstantValueVisitor visitor) => visitor.visitDouble(this); |
- |
- String toStructuredString() => 'DoubleConstant(${unparse()})'; |
-} |
- |
-abstract class BoolConstantValue extends PrimitiveConstantValue { |
- factory BoolConstantValue(value) { |
- return value ? new TrueConstantValue() : new FalseConstantValue(); |
- } |
- |
- const BoolConstantValue._internal(); |
- |
- bool get isBool => true; |
- |
- DartType computeType(Compiler compiler) { |
- return compiler.boolClass.rawType; |
- } |
- |
- ti.TypeMask computeMask(Compiler compiler) { |
- return compiler.typesTask.boolType; |
- } |
- |
- BoolConstantValue negate(); |
- |
- String toStructuredString() => 'BoolConstant(${unparse()})'; |
-} |
- |
-class TrueConstantValue extends BoolConstantValue { |
- factory TrueConstantValue() => const TrueConstantValue._internal(); |
- |
- const TrueConstantValue._internal() : super._internal(); |
- |
- bool get isTrue => true; |
- |
- bool get primitiveValue => true; |
- |
- FalseConstantValue negate() => new FalseConstantValue(); |
- |
- bool operator ==(var other) => identical(this, other); |
- |
- // The magic constant is just a random value. It does not have any |
- // significance. |
- int get hashCode => 499; |
- |
- DartString toDartString() => const LiteralDartString("true"); |
- |
- accept(ConstantValueVisitor visitor) => visitor.visitTrue(this); |
-} |
- |
-class FalseConstantValue extends BoolConstantValue { |
- factory FalseConstantValue() => const FalseConstantValue._internal(); |
- |
- const FalseConstantValue._internal() : super._internal(); |
- |
- bool get isFalse => true; |
- |
- bool get primitiveValue => false; |
- |
- TrueConstantValue negate() => new TrueConstantValue(); |
- |
- bool operator ==(var other) => identical(this, other); |
- |
- // The magic constant is just a random value. It does not have any |
- // significance. |
- int get hashCode => 536555975; |
- |
- DartString toDartString() => const LiteralDartString("false"); |
- |
- accept(ConstantValueVisitor visitor) => visitor.visitFalse(this); |
-} |
- |
-class StringConstantValue extends PrimitiveConstantValue { |
- final DartString primitiveValue; |
- |
- final int hashCode; |
- |
- // TODO(floitsch): cache StringConstants. |
- // TODO(floitsch): compute hashcode without calling toString() on the |
- // DartString. |
- StringConstantValue(DartString value) |
- : this.primitiveValue = value, |
- this.hashCode = value.slowToString().hashCode; |
- |
- bool get isString => true; |
- |
- DartType computeType(Compiler compiler) { |
- return compiler.stringClass.rawType; |
- } |
- |
- ti.TypeMask computeMask(Compiler compiler) { |
- return compiler.typesTask.stringType; |
- } |
- |
- bool operator ==(var other) { |
- if (other is !StringConstantValue) return false; |
- StringConstantValue otherString = other; |
- return hashCode == otherString.hashCode && |
- primitiveValue == otherString.primitiveValue; |
- } |
- |
- DartString toDartString() => primitiveValue; |
- |
- int get length => primitiveValue.length; |
- |
- accept(ConstantValueVisitor visitor) => visitor.visitString(this); |
- |
- // TODO(johnniwinther): Ensure correct escaping. |
- String unparse() => '"${primitiveValue.slowToString()}"'; |
- |
- String toStructuredString() => 'StringConstant(${unparse()})'; |
-} |
- |
-abstract class ObjectConstantValue extends ConstantValue { |
- final InterfaceType type; |
- |
- ObjectConstantValue(this.type); |
- |
- bool get isObject => true; |
- |
- DartType computeType(Compiler compiler) => type; |
- |
- void _unparseTypeArguments(StringBuffer sb) { |
- if (!type.treatAsRaw) { |
- sb.write('<'); |
- sb.write(type.typeArguments.join(', ')); |
- sb.write('>'); |
- } |
- } |
-} |
- |
-class TypeConstantValue extends ObjectConstantValue { |
- /// The user type that this constant represents. |
- final DartType representedType; |
- |
- TypeConstantValue(this.representedType, InterfaceType type) : super(type); |
- |
- bool get isType => true; |
- |
- bool operator ==(other) { |
- return other is TypeConstantValue && |
- representedType == other.representedType; |
- } |
- |
- ti.TypeMask computeMask(Compiler compiler) { |
- return compiler.typesTask.typeType; |
- } |
- |
- int get hashCode => representedType.hashCode * 13; |
- |
- List<ConstantValue> getDependencies() => const <ConstantValue>[]; |
- |
- accept(ConstantValueVisitor visitor) => visitor.visitType(this); |
- |
- String unparse() => '$representedType'; |
- |
- String toStructuredString() => 'TypeConstant(${representedType})'; |
-} |
- |
-class ListConstantValue extends ObjectConstantValue { |
- final List<ConstantValue> entries; |
- final int hashCode; |
- |
- ListConstantValue(InterfaceType type, List<ConstantValue> entries) |
- : this.entries = entries, |
- hashCode = _computeHash(type, entries), |
- super(type); |
- |
- bool get isList => true; |
- |
- static int _computeHash(DartType type, List<ConstantValue> entries) { |
- // TODO(floitsch): create a better hash. |
- int hash = 7; |
- for (ConstantValue input in entries) { |
- hash ^= input.hashCode; |
- } |
- hash ^= type.hashCode; |
- return hash; |
- } |
- |
- bool operator ==(var other) { |
- if (other is !ListConstantValue) return false; |
- ListConstantValue otherList = other; |
- if (hashCode != otherList.hashCode) return false; |
- if (type != otherList.type) return false; |
- if (entries.length != otherList.entries.length) return false; |
- for (int i = 0; i < entries.length; i++) { |
- if (entries[i] != otherList.entries[i]) return false; |
- } |
- return true; |
- } |
- |
- List<ConstantValue> getDependencies() => entries; |
- |
- int get length => entries.length; |
- |
- ti.TypeMask computeMask(Compiler compiler) { |
- return compiler.typesTask.constListType; |
- } |
- |
- accept(ConstantValueVisitor visitor) => visitor.visitList(this); |
- |
- String unparse() { |
- StringBuffer sb = new StringBuffer(); |
- _unparseTypeArguments(sb); |
- sb.write('['); |
- for (int i = 0 ; i < length ; i++) { |
- if (i > 0) sb.write(','); |
- sb.write(entries[i].unparse()); |
- } |
- sb.write(']'); |
- return sb.toString(); |
- } |
- |
- String toStructuredString() { |
- StringBuffer sb = new StringBuffer(); |
- sb.write('ListConstant(['); |
- for (int i = 0 ; i < length ; i++) { |
- if (i > 0) sb.write(','); |
- sb.write(entries[i].toStructuredString()); |
- } |
- sb.write('])'); |
- return sb.toString(); |
- } |
-} |
- |
-class MapConstantValue extends ObjectConstantValue { |
- final List<ConstantValue> keys; |
- final List<ConstantValue> values; |
- final int hashCode; |
- |
- MapConstantValue(InterfaceType type, |
- List<ConstantValue> keys, |
- List<ConstantValue> values) |
- : this.keys = keys, |
- this.values = values, |
- this.hashCode = computeHash(type, keys, values), |
- super(type) { |
- assert(keys.length == values.length); |
- } |
- |
- bool get isMap => true; |
- |
- static int computeHash(DartType type, |
- List<ConstantValue> keys, |
- List<ConstantValue> values) { |
- // TODO(floitsch): create a better hash. |
- int hash = 0; |
- for (ConstantValue key in keys) { |
- hash ^= key.hashCode; |
- } |
- for (ConstantValue value in values) { |
- hash ^= value.hashCode; |
- } |
- hash ^= type.hashCode; |
- return hash; |
- } |
- |
- ti.TypeMask computeMask(Compiler compiler) { |
- return compiler.typesTask.constMapType; |
- } |
- |
- bool operator ==(var other) { |
- if (other is !MapConstantValue) return false; |
- MapConstantValue otherMap = other; |
- if (hashCode != otherMap.hashCode) return false; |
- if (type != other.type) return false; |
- if (length != other.length) return false; |
- for (int i = 0; i < length; i++) { |
- if (keys[i] != otherMap.keys[i]) return false; |
- if (values[i] != otherMap.values[i]) return false; |
- } |
- return true; |
- } |
- |
- List<ConstantValue> getDependencies() { |
- List<ConstantValue> result = <ConstantValue>[]; |
- result.addAll(keys); |
- result.addAll(values); |
- return result; |
- } |
- |
- int get length => keys.length; |
- |
- accept(ConstantValueVisitor visitor) => visitor.visitMap(this); |
- |
- String unparse() { |
- StringBuffer sb = new StringBuffer(); |
- _unparseTypeArguments(sb); |
- sb.write('{'); |
- for (int i = 0 ; i < length ; i++) { |
- if (i > 0) sb.write(','); |
- sb.write(keys[i].unparse()); |
- sb.write(':'); |
- sb.write(values[i].unparse()); |
- } |
- sb.write('}'); |
- return sb.toString(); |
- } |
- |
- String toStructuredString() { |
- StringBuffer sb = new StringBuffer(); |
- sb.write('MapConstant({'); |
- for (int i = 0; i < length; i++) { |
- if (i > 0) sb.write(','); |
- sb.write(keys[i].toStructuredString()); |
- sb.write(':'); |
- sb.write(values[i].toStructuredString()); |
- } |
- sb.write('})'); |
- return sb.toString(); |
- } |
-} |
- |
-class InterceptorConstantValue extends ConstantValue { |
- /// The type for which this interceptor holds the methods. The constant |
- /// is a dispatch table for this type. |
- final DartType dispatchedType; |
- |
- InterceptorConstantValue(this.dispatchedType); |
- |
- bool get isInterceptor => true; |
- |
- bool operator ==(other) { |
- return other is InterceptorConstantValue |
- && dispatchedType == other.dispatchedType; |
- } |
- |
- int get hashCode => dispatchedType.hashCode * 43; |
- |
- List<ConstantValue> getDependencies() => const <ConstantValue>[]; |
- |
- accept(ConstantValueVisitor visitor) => visitor.visitInterceptor(this); |
- |
- DartType computeType(Compiler compiler) => const DynamicType(); |
- |
- ti.TypeMask computeMask(Compiler compiler) { |
- return compiler.typesTask.nonNullType; |
- } |
- |
- String unparse() { |
- return 'interceptor($dispatchedType)'; |
- } |
- |
- String toStructuredString() { |
- return 'InterceptorConstant(${dispatchedType.getStringAsDeclared("o")})'; |
- } |
-} |
- |
-class DummyConstantValue extends ConstantValue { |
- final ti.TypeMask typeMask; |
- |
- DummyConstantValue(this.typeMask); |
- |
- bool get isDummy => true; |
- |
- bool operator ==(other) { |
- return other is DummyConstantValue |
- && typeMask == other.typeMask; |
- } |
- |
- get hashCode => typeMask.hashCode; |
- |
- List<ConstantValue> getDependencies() => const <ConstantValue>[]; |
- |
- accept(ConstantValueVisitor visitor) => visitor.visitDummy(this); |
- |
- DartType computeType(Compiler compiler) => const DynamicType(); |
- |
- ti.TypeMask computeMask(Compiler compiler) => typeMask; |
- |
- String unparse() => 'dummy($typeMask)'; |
- |
- String toStructuredString() => 'DummyConstant($typeMask)'; |
-} |
- |
-class ConstructedConstantValue extends ObjectConstantValue { |
- final List<ConstantValue> fields; |
- final int hashCode; |
- |
- ConstructedConstantValue(InterfaceType type, List<ConstantValue> fields) |
- : this.fields = fields, |
- hashCode = computeHash(type, fields), |
- super(type) { |
- assert(type != null); |
- } |
- |
- bool get isConstructedObject => true; |
- |
- static int computeHash(DartType type, List<ConstantValue> fields) { |
- // TODO(floitsch): create a better hash. |
- int hash = 0; |
- for (ConstantValue field in fields) { |
- hash ^= field.hashCode; |
- } |
- hash ^= type.hashCode; |
- return hash; |
- } |
- |
- bool operator ==(var otherVar) { |
- if (otherVar is !ConstructedConstantValue) return false; |
- ConstructedConstantValue other = otherVar; |
- if (hashCode != other.hashCode) return false; |
- if (type != other.type) return false; |
- if (fields.length != other.fields.length) return false; |
- for (int i = 0; i < fields.length; i++) { |
- if (fields[i] != other.fields[i]) return false; |
- } |
- return true; |
- } |
- |
- List<ConstantValue> getDependencies() => fields; |
- |
- ti.TypeMask computeMask(Compiler compiler) { |
- if (compiler.backend.isInterceptorClass(type.element)) { |
- return compiler.typesTask.nonNullType; |
- } |
- return new ti.TypeMask.nonNullExact(type.element, compiler.world); |
- } |
- |
- accept(ConstantValueVisitor visitor) => visitor.visitConstructed(this); |
- |
- Map<Element, ConstantValue> get fieldElements { |
- // TODO(ahe): Refactor constant system to store this information directly. |
- ClassElement classElement = type.element; |
- int count = 0; |
- Map<Element, ConstantValue> result = new Map<Element, ConstantValue>(); |
- classElement.implementation.forEachInstanceField((holder, field) { |
- result[field] = fields[count++]; |
- }, includeSuperAndInjectedMembers: true); |
- return result; |
- } |
- |
- String unparse() { |
- StringBuffer sb = new StringBuffer(); |
- sb.write(type.name); |
- _unparseTypeArguments(sb); |
- sb.write('('); |
- int i = 0; |
- fieldElements.forEach((Element field, ConstantValue value) { |
- if (i > 0) sb.write(','); |
- sb.write(field.name); |
- sb.write('='); |
- sb.write(value.unparse()); |
- i++; |
- }); |
- sb.write(')'); |
- return sb.toString(); |
- } |
- |
- String toStructuredString() { |
- StringBuffer sb = new StringBuffer(); |
- sb.write('ConstructedConstant('); |
- sb.write(type); |
- sb.write('('); |
- int i = 0; |
- fieldElements.forEach((Element field, ConstantValue value) { |
- if (i > 0) sb.write(','); |
- sb.write(field.name); |
- sb.write('='); |
- sb.write(value.toStructuredString()); |
- i++; |
- }); |
- sb.write('))'); |
- return sb.toString(); |
- } |
-} |
- |
-/// A reference to a constant in another output unit. |
-/// Used for referring to deferred constants. |
-class DeferredConstantValue extends ConstantValue { |
- DeferredConstantValue(this.referenced, this.prefix); |
- |
- final ConstantValue referenced; |
- final PrefixElement prefix; |
- |
- bool get isReference => true; |
- |
- bool operator ==(other) { |
- return other is DeferredConstantValue |
- && referenced == other.referenced |
- && prefix == other.prefix; |
- } |
- |
- get hashCode => (referenced.hashCode * 17 + prefix.hashCode) & 0x3fffffff; |
- |
- List<ConstantValue> getDependencies() => <ConstantValue>[referenced]; |
- |
- accept(ConstantValueVisitor visitor) => visitor.visitDeferred(this); |
- |
- DartType computeType(Compiler compiler) => referenced.computeType(compiler); |
- |
- ti.TypeMask computeMask(Compiler compiler) { |
- return referenced.computeMask(compiler); |
- } |
- |
- String unparse() => 'deferred(${referenced.unparse()})'; |
- |
- String toStructuredString() => 'DeferredConstant($referenced)'; |
-} |