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

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

Issue 2800083002: Complain about incorrect this/super constructor initializers. (Closed)
Patch Set: Address comments. 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_target.dart
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index 2abba433b4e3839b276cc50f741d50512a0fd145..1083a50c916c1218086988c00fcf9ae12b7979ed 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -30,7 +30,6 @@ import 'package:kernel/ast.dart'
NullLiteral,
ProcedureKind,
Program,
- RedirectingInitializer,
Source,
StringLiteral,
SuperInitializer,
@@ -83,6 +82,7 @@ import 'kernel_builder.dart'
KernelNamedTypeBuilder,
KernelProcedureBuilder,
LibraryBuilder,
+ MemberBuilder,
MixinApplicationBuilder,
NamedMixinApplicationBuilder,
NamedTypeBuilder,
@@ -355,7 +355,7 @@ class KernelTarget extends TargetImplementation {
mainBuilder.body = new ExpressionStatement(
new Throw(new StringLiteral("${errors.join('\n')}")));
}
- library.build();
+ library.build(loader.coreLibrary);
return link(<Library>[library.library]);
}
@@ -562,7 +562,7 @@ class KernelTarget extends TargetImplementation {
for (SourceClassBuilder builder in collectAllSourceClasses()) {
Class cls = builder.target;
if (cls != objectClass) {
- finishConstructors(cls);
+ finishConstructors(builder);
}
}
ticker.logMs("Finished constructors");
@@ -570,10 +570,11 @@ class KernelTarget extends TargetImplementation {
/// Ensure constructors of [cls] have the correct initializers and other
/// requirements.
- void finishConstructors(Class cls) {
+ void finishConstructors(SourceClassBuilder builder) {
+ Class cls = builder.target;
+
/// Quotes below are from [Dart Programming Language Specification, 4th
/// Edition](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-408.pdf):
- Constructor superTarget;
List<Field> uninitializedFields = <Field>[];
List<Field> nonFinalFields = <Field>[];
for (Field field in cls.fields) {
@@ -586,12 +587,16 @@ class KernelTarget extends TargetImplementation {
}
Map<Constructor, List<FieldInitializer>> fieldInitializers =
<Constructor, List<FieldInitializer>>{};
- for (Constructor constructor in cls.constructors) {
- if (!isRedirectingGenerativeConstructor(constructor)) {
+ Constructor superTarget;
+ builder.constructors.forEach((String name, Builder member) {
+ if (member.isFactory) return;
+ MemberBuilder constructorBuilder = member;
+ Constructor constructor = constructorBuilder.target;
+ if (!constructorBuilder.isRedirectingGenerativeConstructor) {
/// >If no superinitializer is provided, an implicit superinitializer
/// >of the form super() is added at the end of k’s initializer list,
/// >unless the enclosing class is class Object.
- if (!constructor.initializers.any(isSuperinitializerOrInvalid)) {
+ if (constructor.initializers.isEmpty) {
superTarget ??= defaultSuperConstructor(cls);
Initializer initializer;
if (superTarget == null) {
@@ -632,7 +637,7 @@ class KernelTarget extends TargetImplementation {
nonFinalFields.clear();
}
}
- }
+ });
Set<Field> initializedFields;
fieldInitializers.forEach(
(Constructor constructor, List<FieldInitializer> initializers) {
@@ -696,16 +701,6 @@ class KernelTarget extends TargetImplementation {
}
}
-bool isSuperinitializerOrInvalid(Initializer initializer) {
- return initializer is SuperInitializer || initializer is InvalidInitializer;
-}
-
-bool isRedirectingGenerativeConstructor(Constructor constructor) {
- List<Initializer> initializers = constructor.initializers;
- return initializers.length == 1 &&
- initializers.single is RedirectingInitializer;
-}
-
/// Looks for a constructor call that matches `super()` from a constructor in
/// [cls]. Such a constructor may have optional arguments, but no required
/// arguments.
« no previous file with comments | « pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart ('k') | pkg/front_end/lib/src/fasta/names.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698