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

Unified Diff: pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart

Issue 2800083002: Complain about incorrect this/super constructor initializers. (Closed)
Patch Set: Created 3 years, 8 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
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

Powered by Google App Engine
This is Rietveld 408576698