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 1263ada4303f29dfe8727df36ec7bb1221e5be16..c45497581c8dbac9fafad3854e49cc943b334802 100644 |
--- a/pkg/compiler/lib/src/constants/expressions.dart |
+++ b/pkg/compiler/lib/src/constants/expressions.dart |
@@ -10,6 +10,7 @@ import '../elements/elements.dart' show |
ConstructorElement, |
Element, |
FunctionElement, |
+ PrefixElement, |
VariableElement; |
import '../resolution/operators.dart'; |
import '../universe/universe.dart' show CallStructure; |
@@ -21,6 +22,7 @@ enum ConstantExpressionKind { |
CONCATENATE, |
CONDITIONAL, |
CONSTRUCTED, |
+ DEFERRED, |
DOUBLE, |
ERRONEOUS, |
FUNCTION, |
@@ -606,6 +608,33 @@ class ConditionalConstantExpression extends ConstantExpression { |
} |
} |
+/// 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); |
+ |
+ ConstantExpressionKind get kind => ConstantExpressionKind.DEFERRED; |
+ |
+ @override |
+ int _computeHashCode() { |
+ return 13 * expression.hashCode; |
+ } |
+ |
+ @override |
+ bool _equals(DeferredConstantExpression other) { |
+ return expression == other.expression; |
+ } |
+ |
+ @override |
+ accept(ConstantExpressionVisitor visitor, [context]) { |
+ return visitor.visitDeferred(this, context); |
+ } |
+} |
+ |
abstract class ConstantExpressionVisitor<C, R> { |
const ConstantExpressionVisitor(); |
@@ -626,6 +655,7 @@ abstract class ConstantExpressionVisitor<C, R> { |
R visitIdentical(IdenticalConstantExpression exp, C context); |
R visitUnary(UnaryConstantExpression exp, C context); |
R visitConditional(ConditionalConstantExpression exp, C context); |
+ R visitDeferred(DeferredConstantExpression exp, C context); |
} |
/// Represents the declaration of a constant [element] with value [expression]. |
@@ -808,5 +838,12 @@ class ConstExpPrinter extends ConstantExpressionVisitor { |
write(exp, exp.falseExp); |
} |
+ @override |
+ visitDeferred(DeferredConstantExpression exp, context) { |
+ sb.write(exp.prefix.deferredImport.prefix.source); |
+ sb.write('.'); |
+ write(exp, exp.expression); |
+ } |
+ |
String toString() => sb.toString(); |
} |