Chromium Code Reviews| Index: pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart |
| diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart |
| index 6264d7e4ea5bd17d3c7255766a8a630a08da279c..1554cfc94ad6a8aeeea425984a1d2b21303a759b 100644 |
| --- a/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart |
| +++ b/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart |
| @@ -25,6 +25,7 @@ import 'package:kernel/ast.dart' |
| ReturnStatement, |
| StaticGet, |
| StringLiteral, |
| + SuperInitializer, |
| ThisExpression, |
| VariableGet; |
| @@ -41,6 +42,7 @@ import 'kernel_builder.dart' |
| Builder, |
| EnumBuilder, |
| FormalParameterBuilder, |
| + KernelClassBuilder, |
| KernelConstructorBuilder, |
| KernelFieldBuilder, |
| KernelFormalParameterBuilder, |
| @@ -59,9 +61,13 @@ class KernelEnumBuilder extends SourceClassBuilder |
| final MapLiteral toStringMap; |
| - final KernelTypeBuilder intType; |
| + final KernelNamedTypeBuilder intType; |
| - final KernelTypeBuilder stringType; |
| + final KernelNamedTypeBuilder stringType; |
| + |
| + final KernelNamedTypeBuilder objectType; |
| + |
| + final KernelNamedTypeBuilder listType; |
| KernelEnumBuilder.internal( |
| List<MetadataBuilder> metadata, |
| @@ -72,6 +78,8 @@ class KernelEnumBuilder extends SourceClassBuilder |
| this.constantNamesAndOffsets, |
| this.toStringMap, |
| this.intType, |
| + this.listType, |
| + this.objectType, |
| this.stringType, |
| LibraryBuilder parent, |
| int charOffset) |
| @@ -88,17 +96,19 @@ class KernelEnumBuilder extends SourceClassBuilder |
| constantNamesAndOffsets ??= const <Object>[]; |
| // TODO(ahe): These types shouldn't be looked up in scope, they come |
| // directly from dart:core. |
| - KernelTypeBuilder intType = parent.addType( |
| - new KernelNamedTypeBuilder("int", null, charOffset, parent.fileUri)); |
| - KernelTypeBuilder stringType = parent.addType( |
| - new KernelNamedTypeBuilder("String", null, charOffset, parent.fileUri)); |
| + KernelTypeBuilder intType = |
| + new KernelNamedTypeBuilder("int", null, charOffset, parent.fileUri); |
| + KernelTypeBuilder stringType = |
| + new KernelNamedTypeBuilder("String", null, charOffset, parent.fileUri); |
| + KernelNamedTypeBuilder objectType = |
| + new KernelNamedTypeBuilder("Object", null, charOffset, parent.fileUri); |
| Class cls = new Class(name: name); |
| Map<String, MemberBuilder> members = <String, MemberBuilder>{}; |
| Map<String, MemberBuilder> constructors = <String, MemberBuilder>{}; |
| KernelNamedTypeBuilder selfType = |
| new KernelNamedTypeBuilder(name, null, charOffset, parent.fileUri); |
| - KernelTypeBuilder listType = parent.addType(new KernelNamedTypeBuilder( |
| - "List", <KernelTypeBuilder>[selfType], charOffset, parent.fileUri)); |
| + KernelTypeBuilder listType = new KernelNamedTypeBuilder( |
| + "List", <KernelTypeBuilder>[selfType], charOffset, parent.fileUri); |
| /// From Dart Programming Language Specification 4th Edition/December 2015: |
| /// metadata class E { |
| @@ -171,6 +181,8 @@ class KernelEnumBuilder extends SourceClassBuilder |
| constantNamesAndOffsets, |
| toStringMap, |
| intType, |
| + listType, |
| + objectType, |
| stringType, |
| parent, |
| charOffset); |
| @@ -182,7 +194,7 @@ class KernelEnumBuilder extends SourceClassBuilder |
| members.forEach(setParent); |
| constructors.forEach(setParent); |
| - selfType.builder = enumBuilder; |
| + selfType.bind(enumBuilder); |
| return enumBuilder; |
| } |
| @@ -193,11 +205,16 @@ class KernelEnumBuilder extends SourceClassBuilder |
| return cls.rawType; |
| } |
| - Class build(KernelLibraryBuilder libraryBuilder) { |
| + @override |
| + Class build(KernelLibraryBuilder libraryBuilder, LibraryBuilder coreLibrary) { |
| if (constantNamesAndOffsets.isEmpty) { |
| libraryBuilder.addCompileTimeError( |
| -1, "An enum declaration can't be empty."); |
| } |
| + intType.resolveIn(coreLibrary.scope); |
| + stringType.resolveIn(coreLibrary.scope); |
| + objectType.resolveIn(coreLibrary.scope); |
| + listType.resolveIn(coreLibrary.scope); |
| toStringMap.keyType = intType.build(libraryBuilder); |
| toStringMap.valueType = stringType.build(libraryBuilder); |
| KernelFieldBuilder indexFieldBuilder = this["index"]; |
| @@ -226,6 +243,17 @@ class KernelEnumBuilder extends SourceClassBuilder |
| new FieldInitializer(indexField, |
| new VariableGet(constructor.function.positionalParameters.single)) |
| ..parent = constructor); |
| + KernelClassBuilder objectClass = objectType.builder; |
| + MemberBuilder superConstructor = |
| + objectClass.findConstructorOrFactory("", charOffset, fileUri); |
| + if (superConstructor == null || !superConstructor.isConstructor) { |
| + addCompileTimeError( |
| + -1, "'Object' has no constructor that takes no arguments."); |
|
Paul Berry
2017/04/07 15:56:38
Similar issue here to the one above.
ahe
2017/04/07 18:19:18
Will do.
|
| + } else { |
| + constructor.initializers.add( |
| + new SuperInitializer(superConstructor.target, new Arguments.empty()) |
| + ..parent = constructor); |
| + } |
| int index = 0; |
| for (int i = 0; i < constantNamesAndOffsets.length; i += 2) { |
| String constant = constantNamesAndOffsets[i]; |
| @@ -236,7 +264,7 @@ class KernelEnumBuilder extends SourceClassBuilder |
| field.initializer = |
| new ConstructorInvocation(constructor, arguments, isConst: true); |
| } |
| - return super.build(libraryBuilder); |
| + return super.build(libraryBuilder, coreLibrary); |
| } |
| @override |