Index: pkg/kernel/lib/analyzer/ast_from_analyzer.dart |
diff --git a/pkg/kernel/lib/analyzer/ast_from_analyzer.dart b/pkg/kernel/lib/analyzer/ast_from_analyzer.dart |
index 1ce83a479b7954271804a98f8bcc6f6299b60af7..7bf54a7f464d0e0edcb367f8c584c1554cf2a1a5 100644 |
--- a/pkg/kernel/lib/analyzer/ast_from_analyzer.dart |
+++ b/pkg/kernel/lib/analyzer/ast_from_analyzer.dart |
@@ -2557,35 +2557,55 @@ class ClassBodyBuilder extends GeneralizingAstVisitor<Null> { |
visitEnumDeclaration(EnumDeclaration node) { |
addAnnotations(node.metadata); |
ast.Class classNode = currentClass; |
+ |
var intType = scope.loader.getCoreClassReference('int').rawType; |
var indexFieldElement = element.fields.firstWhere(_isIndexField); |
ast.Field indexField = scope.getMemberReference(indexFieldElement); |
indexField.type = intType; |
classNode.addMember(indexField); |
- var parameter = new ast.VariableDeclaration('index', type: intType); |
+ |
+ var stringType = scope.loader.getCoreClassReference('String').rawType; |
+ ast.Field nameField = new ast.Field( |
+ new ast.Name('_name', scope.currentLibrary), |
+ type: stringType, |
+ isFinal: true, |
+ fileUri: classNode.fileUri); |
+ classNode.addMember(nameField); |
+ |
+ var indexParameter = new ast.VariableDeclaration('index', type: intType); |
+ var nameParameter = new ast.VariableDeclaration('name', type: stringType); |
var function = new ast.FunctionNode(new ast.EmptyStatement(), |
- positionalParameters: [parameter]); |
+ positionalParameters: [indexParameter, nameParameter]); |
var superConstructor = scope.loader.getRootClassConstructorReference(); |
var constructor = new ast.Constructor(function, |
name: new ast.Name(''), |
isConst: true, |
initializers: [ |
- new ast.FieldInitializer(indexField, new ast.VariableGet(parameter)), |
+ new ast.FieldInitializer( |
+ indexField, new ast.VariableGet(indexParameter)), |
+ new ast.FieldInitializer( |
+ nameField, new ast.VariableGet(nameParameter)), |
new ast.SuperInitializer(superConstructor, new ast.Arguments.empty()) |
])..fileOffset = element.nameOffset; |
classNode.addMember(constructor); |
+ |
int index = 0; |
var enumConstantFields = <ast.Field>[]; |
for (var constant in node.constants) { |
ast.Field field = scope.getMemberReference(constant.element); |
field.initializer = new ast.ConstructorInvocation( |
- constructor, new ast.Arguments([new ast.IntLiteral(index)]), |
+ constructor, |
+ new ast.Arguments([ |
+ new ast.IntLiteral(index), |
+ new ast.StringLiteral('${classNode.name}.${field.name.name}') |
+ ]), |
isConst: true)..parent = field; |
field.type = classNode.rawType; |
classNode.addMember(field); |
++index; |
enumConstantFields.add(field); |
} |
+ |
// Add the 'values' field. |
var valuesFieldElement = element.fields.firstWhere(_isValuesField); |
ast.Field valuesField = scope.getMemberReference(valuesFieldElement); |
@@ -2597,7 +2617,15 @@ class ClassBodyBuilder extends GeneralizingAstVisitor<Null> { |
isConst: true, |
typeArgument: enumType)..parent = valuesField; |
classNode.addMember(valuesField); |
- // TODO: Add the toString method. |
+ |
+ // Add the 'toString()' method. |
+ var body = new ast.ReturnStatement( |
+ new ast.DirectPropertyGet(new ast.ThisExpression(), nameField)); |
+ var toStringFunction = new ast.FunctionNode(body, returnType: stringType); |
+ var toStringMethod = new ast.Procedure( |
+ new ast.Name('toString'), ast.ProcedureKind.Method, toStringFunction, |
+ fileUri: classNode.fileUri); |
+ classNode.addMember(toStringMethod); |
} |
visitClassTypeAlias(ClassTypeAlias node) { |