Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(795)

Unified Diff: pkg/compiler/lib/src/elements/modelx.dart

Issue 1115183002: Add ConstantConstructor to ConstantExpression system. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Updated cf. comments. Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/compiler/lib/src/elements/elements.dart ('k') | pkg/compiler/lib/src/resolution/members.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/elements/modelx.dart
diff --git a/pkg/compiler/lib/src/elements/modelx.dart b/pkg/compiler/lib/src/elements/modelx.dart
index 7d96a64f2d686a5c2f4375fe224b8cbb3702ae9a..36d6593a03750bd49336a8cfe573134f2a7c5505 100644
--- a/pkg/compiler/lib/src/elements/modelx.dart
+++ b/pkg/compiler/lib/src/elements/modelx.dart
@@ -6,6 +6,7 @@ library elements.modelx;
import 'elements.dart';
import '../constants/expressions.dart';
+import '../constants/constructors.dart';
import '../helpers/helpers.dart'; // Included for debug helpers.
import '../tree/tree.dart';
import '../util/util.dart';
@@ -306,6 +307,7 @@ class ErroneousElementX extends ElementX implements ErroneousElement {
get memberContext => unsupported();
get executableContext => unsupported();
get isExternal => unsupported();
+ get constantConstructor => null;
bool get isRedirectingGenerative => unsupported();
bool get isRedirectingFactory => unsupported();
@@ -329,11 +331,16 @@ class ErroneousElementX extends ElementX implements ErroneousElement {
accept(ElementVisitor visitor, arg) {
return visitor.visitErroneousElement(this, arg);
}
+
+ @override
+ bool get isFromEnvironmentConstructor => false;
}
/// A constructor that was synthesized to recover from a compile-time error.
class ErroneousConstructorElementX extends ErroneousElementX
- with PatchMixin<FunctionElement>, AnalyzableElementX
+ with PatchMixin<FunctionElement>,
+ AnalyzableElementX,
+ ConstantConstructorMixin
implements ConstructorElementX {
// TODO(ahe): Instead of subclassing [ErroneousElementX], this class should
// be more like [ErroneousFieldElementX]. In particular, its kind should be
@@ -1255,7 +1262,24 @@ class VariableList implements DeclarationSite {
DartType computeType(Element element, Compiler compiler) => type;
}
-abstract class VariableElementX extends ElementX with AstElementMixin
+abstract class ConstantVariableMixin implements VariableElement {
+ ConstantExpression _constant;
+
+ ConstantExpression get constant {
+ assert(invariant(this, _constant != null,
+ message: "Constant has not been computed for $this."));
+ return _constant;
+ }
+
+ void set constant(ConstantExpression value) {
+ assert(invariant(this, _constant == null || _constant == value,
+ message: "Constant has already been computed for $this."));
+ _constant = value;
+ }
+}
+
+abstract class VariableElementX extends ElementX
+ with AstElementMixin, ConstantVariableMixin
implements VariableElement {
final Token token;
final VariableList variables;
@@ -1414,7 +1438,8 @@ class FieldElementX extends VariableElementX
}
/// A field that was synthesized to recover from a compile-time error.
-class ErroneousFieldElementX extends ElementX implements FieldElementX {
+class ErroneousFieldElementX extends ElementX
+ with ConstantVariableMixin implements FieldElementX {
final VariableList variables;
ErroneousFieldElementX(Identifier name, Element enclosingElement)
@@ -1559,7 +1584,8 @@ class FormalElementX extends ElementX
/// to ensure that default values on parameters are computed once (on the
/// origin parameter) but can be found through both the origin and the patch.
abstract class ParameterElementX extends FormalElementX
- with PatchMixin<ParameterElement> implements ParameterElement {
+ with PatchMixin<ParameterElement>, ConstantVariableMixin
+ implements ParameterElement {
final Expression initializer;
final bool isOptional;
final bool isNamed;
@@ -1949,8 +1975,32 @@ class LocalFunctionElementX extends BaseFunctionElementX
bool get isLocal => true;
}
+abstract class ConstantConstructorMixin implements ConstructorElement {
+ ConstantConstructor _constantConstructor;
+
+ ConstantConstructor get constantConstructor {
+ if (isPatch) {
+ ConstructorElement originConstructor = origin;
+ return originConstructor.constantConstructor;
+ }
+ if (!isConst || isFromEnvironmentConstructor) return null;
+ if (_constantConstructor == null) {
+ _constantConstructor = computeConstantConstructor(resolvedAst);
+ }
+ return _constantConstructor;
+ }
+
+ bool get isFromEnvironmentConstructor {
+ return name == 'fromEnvironment' &&
+ library.isDartCore &&
+ (enclosingClass.name == 'bool' ||
+ enclosingClass.name == 'int' ||
+ enclosingClass.name == 'String');
+ }
+}
+
abstract class ConstructorElementX extends FunctionElementX
- implements ConstructorElement {
+ with ConstantConstructorMixin implements ConstructorElement {
bool isRedirectingGenerative = false;
ConstructorElementX(String name,
« no previous file with comments | « pkg/compiler/lib/src/elements/elements.dart ('k') | pkg/compiler/lib/src/resolution/members.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698