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 fe64aec668ac6495265542ec7491aa686b54b3e3..b5f8417ddef816d64d54b306adb27dbd8bd7aa63 100644 |
--- a/pkg/compiler/lib/src/elements/modelx.dart |
+++ b/pkg/compiler/lib/src/elements/modelx.dart |
@@ -2328,21 +2328,28 @@ class ConstructorBodyElementX extends BaseFunctionElementX |
*/ |
class SynthesizedConstructorElementX extends ConstructorElementX { |
final ConstructorElement definingConstructor; |
- final bool isDefaultConstructor; |
+ ResolvedAst _resolvedAst; |
SynthesizedConstructorElementX.notForDefault( |
String name, this.definingConstructor, Element enclosing) |
- : isDefaultConstructor = false, |
- super(name, ElementKind.GENERATIVE_CONSTRUCTOR, Modifiers.EMPTY, |
- enclosing); |
+ : super(name, ElementKind.GENERATIVE_CONSTRUCTOR, Modifiers.EMPTY, |
+ enclosing) { |
+ _resolvedAst = new SynthesizedResolvedAst( |
+ this, ResolvedAstKind.FORWARDING_CONSTRUCTOR); |
+ } |
SynthesizedConstructorElementX.forDefault( |
this.definingConstructor, Element enclosing) |
- : isDefaultConstructor = true, |
- super('', ElementKind.GENERATIVE_CONSTRUCTOR, Modifiers.EMPTY, |
+ : super('', ElementKind.GENERATIVE_CONSTRUCTOR, Modifiers.EMPTY, |
enclosing) { |
functionSignature = new FunctionSignatureX( |
type: new FunctionType.synthesized(enclosingClass.thisType)); |
+ _resolvedAst = |
+ new SynthesizedResolvedAst(this, ResolvedAstKind.DEFAULT_CONSTRUCTOR); |
+ } |
+ |
+ bool get isDefaultConstructor { |
+ return _resolvedAst.kind == ResolvedAstKind.DEFAULT_CONSTRUCTOR; |
} |
FunctionExpression parseNode(Parsing parsing) => null; |
@@ -2355,6 +2362,10 @@ class SynthesizedConstructorElementX extends ConstructorElementX { |
bool get isSynthesized => true; |
+ bool get hasResolvedAst => true; |
+ |
+ ResolvedAst get resolvedAst => _resolvedAst; |
+ |
DartType get type { |
if (isDefaultConstructor) { |
return super.type; |
@@ -2694,6 +2705,31 @@ abstract class ClassElementX extends BaseClassElementX { |
} |
} |
+/// This element is used to encode an enum class. |
+/// |
+/// For instance |
+/// |
+/// enum A { b, c, } |
+/// |
+/// is modelled as |
+/// |
+/// class A { |
+/// final int index; |
+/// |
+/// const A(this.index); |
+/// |
+/// String toString() { |
+/// return const <int, A>{0: 'A.b', 1: 'A.c'}[index]; |
+/// } |
+/// |
+/// static const A b = const A(0); |
+/// static const A c = const A(1); |
+/// |
+/// static const List<A> values = const <A>[b, c]; |
+/// } |
+/// |
+/// where the `A` class is encoded using this element. |
+/// |
class EnumClassElementX extends ClassElementX |
implements EnumClassElement, DeclarationSite { |
final Enum node; |
@@ -2737,6 +2773,31 @@ class EnumClassElementX extends ClassElementX |
DeclarationSite get declarationSite => this; |
} |
+/// This element is used to encode the implicit constructor in an enum class. |
+/// |
+/// For instance |
+/// |
+/// enum A { b, c, } |
+/// |
+/// is modelled as |
+/// |
+/// class A { |
+/// final int index; |
+/// |
+/// const A(this.index); |
+/// |
+/// String toString() { |
+/// return const <int, A>{0: 'A.b', 1: 'A.c'}[index]; |
+/// } |
+/// |
+/// static const A b = const A(0); |
+/// static const A c = const A(1); |
+/// |
+/// static const List<A> values = const <A>[b, c]; |
+/// } |
+/// |
+/// where the `const A(...)` constructor is encoded using this element. |
+/// |
class EnumConstructorElementX extends ConstructorElementX { |
final FunctionExpression node; |
@@ -2758,6 +2819,31 @@ class EnumConstructorElementX extends ConstructorElementX { |
SourceSpan get sourcePosition => enclosingClass.sourcePosition; |
} |
+/// This element is used to encode the implicit methods in an enum class. |
+/// |
+/// For instance |
+/// |
+/// enum A { b, c, } |
+/// |
+/// is modelled as |
+/// |
+/// class A { |
+/// final int index; |
+/// |
+/// const A(this.index); |
+/// |
+/// String toString() { |
+/// return const <int, A>{0: 'A.b', 1: 'A.c'}[index]; |
+/// } |
+/// |
+/// static const A b = const A(0); |
+/// static const A c = const A(1); |
+/// |
+/// static const List<A> values = const <A>[b, c]; |
+/// } |
+/// |
+/// where the `toString` method is encoded using this element. |
+/// |
class EnumMethodElementX extends MethodElementX { |
final FunctionExpression node; |
@@ -2775,6 +2861,32 @@ class EnumMethodElementX extends MethodElementX { |
SourceSpan get sourcePosition => enclosingClass.sourcePosition; |
} |
+/// This element is used to encode the initializing formal of the implicit |
+/// constructor in an enum class. |
+/// |
+/// For instance |
+/// |
+/// enum A { b, c, } |
+/// |
+/// is modelled as |
+/// |
+/// class A { |
+/// final int index; |
+/// |
+/// const A(this.index); |
+/// |
+/// String toString() { |
+/// return const <int, A>{0: 'A.b', 1: 'A.c'}[index]; |
+/// } |
+/// |
+/// static const A b = const A(0); |
+/// static const A c = const A(1); |
+/// |
+/// static const List<A> values = const <A>[b, c]; |
+/// } |
+/// |
+/// where the `this.index` formal is encoded using this element. |
+/// |
class EnumFormalElementX extends InitializingFormalElementX { |
EnumFormalElementX( |
ConstructorElement constructor, |
@@ -2789,6 +2901,31 @@ class EnumFormalElementX extends InitializingFormalElementX { |
SourceSpan get sourcePosition => enclosingClass.sourcePosition; |
} |
+/// This element is used to encode the implicitly fields in an enum class. |
+/// |
+/// For instance |
+/// |
+/// enum A { b, c, } |
+/// |
+/// is modelled as |
+/// |
+/// class A { |
+/// final int index; |
+/// |
+/// const A(this.index); |
+/// |
+/// String toString() { |
+/// return const <int, A>{0: 'A.b', 1: 'A.c'}[index]; |
+/// } |
+/// |
+/// static const A b = const A(0); |
+/// static const A c = const A(1); |
+/// |
+/// static const List<A> values = const <A>[b, c]; |
+/// } |
+/// |
+/// where the `index` and `values` fields are encoded using this element. |
+/// |
class EnumFieldElementX extends FieldElementX { |
EnumFieldElementX(Identifier name, EnumClassElementX enumClass, |
VariableList variableList, Node definition, |
@@ -2803,6 +2940,31 @@ class EnumFieldElementX extends FieldElementX { |
SourceSpan get sourcePosition => enclosingClass.sourcePosition; |
} |
+/// This element is used to encode the constant value in an enum class. |
+/// |
+/// For instance |
+/// |
+/// enum A { b, c, } |
+/// |
+/// is modelled as |
+/// |
+/// class A { |
+/// final int index; |
+/// |
+/// const A(this.index); |
+/// |
+/// String toString() { |
+/// return const <int, A>{0: 'A.b', 1: 'A.c'}[index]; |
+/// } |
+/// |
+/// static const A b = const A(0); |
+/// static const A c = const A(1); |
+/// |
+/// static const List<A> values = const <A>[b, c]; |
+/// } |
+/// |
+/// where the `b` and `c` fields are encoded using this element. |
+/// |
class EnumConstantElementX extends EnumFieldElementX |
implements EnumConstantElement { |
final int index; |
@@ -2818,8 +2980,7 @@ class EnumConstantElementX extends EnumFieldElementX |
@override |
SourceSpan get sourcePosition { |
- return new SourceSpan( |
- enclosingClass.sourcePosition.uri, |
+ return new SourceSpan(enclosingClass.sourcePosition.uri, |
position.charOffset, position.charEnd); |
} |
} |
@@ -3126,7 +3287,7 @@ abstract class AstElementMixin implements AstElement { |
} |
ResolvedAst get resolvedAst { |
- return new ResolvedAst( |
+ return new ParsedResolvedAst( |
declaration, definingElement.node, definingElement.treeElements); |
} |
} |