[cfe] Check inline class constructor initializers
Change-Id: I6872ccd948f679e1e0b04b9f59bea833df11d5a2
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/277141
Reviewed-by: Chloe Stefantsova <cstefantsova@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
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 4285b76..1b25846 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -68,6 +68,7 @@
import '../source/source_class_builder.dart' show SourceClassBuilder;
import '../source/source_constructor_builder.dart';
import '../source/source_field_builder.dart';
+import '../source/source_inline_class_builder.dart';
import '../source/source_library_builder.dart' show SourceLibraryBuilder;
import '../source/source_loader.dart' show SourceLoader;
import '../target_implementation.dart' show TargetImplementation;
@@ -620,7 +621,9 @@
loader.finishNoSuchMethodForwarders();
benchmarker?.enterPhase(BenchmarkPhases.body_collectSourceClasses);
- List<SourceClassBuilder>? sourceClasses = loader.collectSourceClasses();
+ List<SourceClassBuilder>? sourceClasses = [];
+ List<SourceInlineClassBuilder>? inlineClasses = [];
+ loader.collectSourceClasses(sourceClasses, inlineClasses);
benchmarker?.enterPhase(BenchmarkPhases.body_finishNativeMethods);
loader.finishNativeMethods();
@@ -629,7 +632,7 @@
loader.buildBodyNodes();
benchmarker?.enterPhase(BenchmarkPhases.body_finishAllConstructors);
- finishAllConstructors(sourceClasses);
+ finishAllConstructors(sourceClasses, inlineClasses);
benchmarker?.enterPhase(BenchmarkPhases.body_runBuildTransformations);
runBuildTransformations();
@@ -649,6 +652,7 @@
// (for whatever amount of time) even though we convert them to dill
// library builders. To avoid it we null it out here.
sourceClasses = null;
+ inlineClasses = null;
return new BuildResult(
component: component, macroApplications: macroApplications);
}, () => loader.currentUriForCrashReporting);
@@ -1244,22 +1248,27 @@
loader.computeCoreTypes(platformLibraries);
}
- void finishAllConstructors(List<SourceClassBuilder> builders) {
+ void finishAllConstructors(List<SourceClassBuilder> sourceClassBuilders,
+ List<SourceInlineClassBuilder> inlineClassBuilders) {
Class objectClass = this.objectClass;
- for (SourceClassBuilder builder in builders) {
+ for (SourceClassBuilder builder in sourceClassBuilders) {
Class cls = builder.cls;
if (cls != objectClass) {
finishConstructors(builder);
}
}
+ for (SourceInlineClassBuilder builder in inlineClassBuilders) {
+ finishInlineConstructors(builder);
+ }
+
ticker.logMs("Finished constructors");
}
- /// Ensure constructors of [builder] have the correct initializers and other
- /// requirements.
- void finishConstructors(SourceClassBuilder builder) {
- if (builder.isPatch) return;
- Class cls = builder.cls;
+ /// Ensure constructors of [classBuilder] have the correct initializers and
+ /// other requirements.
+ void finishConstructors(SourceClassBuilder classBuilder) {
+ if (classBuilder.isPatch) return;
+ Class cls = classBuilder.cls;
Constructor? superTarget;
for (Constructor constructor in cls.constructors) {
@@ -1270,8 +1279,10 @@
for (Initializer initializer in constructor.initializers) {
if (initializer is RedirectingInitializer) {
if (constructor.isConst && !initializer.target.isConst) {
- builder.addProblem(messageConstConstructorRedirectionToNonConst,
- initializer.fileOffset, initializer.target.name.text.length);
+ classBuilder.addProblem(
+ messageConstConstructorRedirectionToNonConst,
+ initializer.fileOffset,
+ initializer.target.name.text.length);
}
isRedirecting = true;
break;
@@ -1289,7 +1300,7 @@
if (offset == -1 && constructor.isSynthetic) {
offset = cls.fileOffset;
}
- builder.addProblem(
+ classBuilder.addProblem(
templateSuperclassHasNoDefaultConstructor
.withArguments(cls.superclass!.name),
offset,
@@ -1313,11 +1324,15 @@
}
}
- finishConstructorsInternal(builder);
+ _finishConstructors(classBuilder);
}
- void finishConstructorsInternal(ClassDeclaration builder) {
- SourceLibraryBuilder libraryBuilder = builder.libraryBuilder;
+ void finishInlineConstructors(SourceInlineClassBuilder inlineClass) {
+ _finishConstructors(inlineClass);
+ }
+
+ void _finishConstructors(ClassDeclaration classDeclaration) {
+ SourceLibraryBuilder libraryBuilder = classDeclaration.libraryBuilder;
/// Quotes below are from [Dart Programming Language Specification, 4th
/// Edition](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-408.pdf):
@@ -1326,7 +1341,7 @@
List<SourceFieldBuilder> lateFinalFields = [];
Iterator<SourceFieldBuilder> fieldIterator =
- builder.fullMemberIterator<SourceFieldBuilder>();
+ classDeclaration.fullMemberIterator<SourceFieldBuilder>();
while (fieldIterator.moveNext()) {
SourceFieldBuilder fieldBuilder = fieldIterator.current;
if (fieldBuilder.isAbstract || fieldBuilder.isExternal) {
@@ -1352,12 +1367,12 @@
Set<SourceFieldBuilder>? initializedFieldBuilders = null;
Iterator<ConstructorDeclaration> constructorIterator =
- builder.fullConstructorIterator<ConstructorDeclaration>();
+ classDeclaration.fullConstructorIterator<ConstructorDeclaration>();
while (constructorIterator.moveNext()) {
ConstructorDeclaration constructor = constructorIterator.current;
if (constructor.isEffectivelyRedirecting) continue;
if (constructor.isConst && nonFinalFields.isNotEmpty) {
- builder.addProblem(messageConstConstructorNonFinalField,
+ classDeclaration.addProblem(messageConstConstructorNonFinalField,
constructor.charOffset, noLength,
context: nonFinalFields
.map((field) => messageConstConstructorNonFinalFieldCause
@@ -1368,8 +1383,10 @@
if (libraryBuilder.isNonNullableByDefault) {
if (constructor.isConst && lateFinalFields.isNotEmpty) {
for (FieldBuilder field in lateFinalFields) {
- builder.addProblem(messageConstConstructorLateFinalFieldError,
- field.charOffset, noLength,
+ classDeclaration.addProblem(
+ messageConstConstructorLateFinalFieldError,
+ field.charOffset,
+ noLength,
context: [
messageConstConstructorLateFinalFieldCause.withLocation(
constructor.fileUri!, constructor.charOffset, noLength)
@@ -1393,8 +1410,8 @@
!initializedFieldBuilders.contains(fieldBuilder)) {
bool uninitializedFinalOrNonNullableFieldIsError =
libraryBuilder.isNonNullableByDefault ||
- builder.hasGenerativeConstructor ||
- builder.isMixinDeclaration;
+ classDeclaration.hasGenerativeConstructor ||
+ classDeclaration.isMixinDeclaration;
if (!fieldBuilder.isLate) {
if (fieldBuilder.isFinal &&
uninitializedFinalOrNonNullableFieldIsError) {
diff --git a/pkg/front_end/lib/src/fasta/source/class_declaration.dart b/pkg/front_end/lib/src/fasta/source/class_declaration.dart
index 200c78c..f1da77c 100644
--- a/pkg/front_end/lib/src/fasta/source/class_declaration.dart
+++ b/pkg/front_end/lib/src/fasta/source/class_declaration.dart
@@ -2,8 +2,11 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
+import '../builder/builder.dart';
import '../builder/class_builder.dart';
import '../builder/declaration_builder.dart';
+import '../builder/member_builder.dart';
+import '../builder/name_iterator.dart';
import 'source_library_builder.dart';
/// Common interface for builders for a class declarations in source code, such
@@ -19,3 +22,212 @@
/// either explicitly or implicitly through a no-name default constructor.
bool get hasGenerativeConstructor;
}
+
+abstract class ClassDeclarationAugmentationAccess<D extends ClassDeclaration> {
+ D getOrigin(D classDeclaration);
+ Iterable<D>? getAugmentations(D classDeclaration);
+}
+
+class ClassDeclarationMemberIterator<D extends ClassDeclaration,
+ T extends Builder> implements Iterator<T> {
+ Iterator<T>? _iterator;
+ Iterator<D>? augmentationBuilders;
+ final bool includeDuplicates;
+
+ factory ClassDeclarationMemberIterator(
+ ClassDeclarationAugmentationAccess<D> patching, D classBuilder,
+ {required bool includeDuplicates}) {
+ return new ClassDeclarationMemberIterator._(
+ patching.getOrigin(classBuilder),
+ patching.getAugmentations(classBuilder)?.iterator,
+ includeDuplicates: includeDuplicates);
+ }
+
+ ClassDeclarationMemberIterator._(
+ D classDeclaration, this.augmentationBuilders,
+ {required this.includeDuplicates})
+ : _iterator = classDeclaration.scope.filteredIterator<T>(
+ parent: classDeclaration,
+ includeDuplicates: includeDuplicates,
+ includeAugmentations: false);
+
+ @override
+ bool moveNext() {
+ if (_iterator != null) {
+ if (_iterator!.moveNext()) {
+ return true;
+ }
+ }
+ if (augmentationBuilders != null && augmentationBuilders!.moveNext()) {
+ D augmentationClassDeclaration = augmentationBuilders!.current;
+ _iterator = augmentationClassDeclaration.scope.filteredIterator<T>(
+ parent: augmentationClassDeclaration,
+ includeDuplicates: includeDuplicates,
+ includeAugmentations: false);
+ }
+ if (_iterator != null) {
+ if (_iterator!.moveNext()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @override
+ T get current => _iterator?.current ?? (throw new StateError('No element'));
+}
+
+class ClassDeclarationMemberNameIterator<D extends ClassDeclaration,
+ T extends Builder> implements NameIterator<T> {
+ NameIterator<T>? _iterator;
+ Iterator<D>? augmentationBuilders;
+ final bool includeDuplicates;
+
+ factory ClassDeclarationMemberNameIterator(
+ ClassDeclarationAugmentationAccess<D> patching, D classBuilder,
+ {required bool includeDuplicates}) {
+ return new ClassDeclarationMemberNameIterator._(
+ patching.getOrigin(classBuilder),
+ patching.getAugmentations(classBuilder)?.iterator,
+ includeDuplicates: includeDuplicates);
+ }
+
+ ClassDeclarationMemberNameIterator._(
+ D classDeclaration, this.augmentationBuilders,
+ {required this.includeDuplicates})
+ : _iterator = classDeclaration.scope.filteredNameIterator<T>(
+ parent: classDeclaration,
+ includeDuplicates: includeDuplicates,
+ includeAugmentations: false);
+
+ @override
+ bool moveNext() {
+ if (_iterator != null) {
+ if (_iterator!.moveNext()) {
+ return true;
+ }
+ }
+ if (augmentationBuilders != null && augmentationBuilders!.moveNext()) {
+ D augmentationClassDeclaration = augmentationBuilders!.current;
+ _iterator = augmentationClassDeclaration.scope.filteredNameIterator<T>(
+ parent: augmentationClassDeclaration,
+ includeDuplicates: includeDuplicates,
+ includeAugmentations: false);
+ }
+ if (_iterator != null) {
+ if (_iterator!.moveNext()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @override
+ T get current => _iterator?.current ?? (throw new StateError('No element'));
+
+ @override
+ String get name => _iterator?.name ?? (throw new StateError('No element'));
+}
+
+class ClassDeclarationConstructorIterator<D extends ClassDeclaration,
+ T extends MemberBuilder> implements Iterator<T> {
+ Iterator<T>? _iterator;
+ Iterator<D>? augmentationBuilders;
+ final bool includeDuplicates;
+
+ factory ClassDeclarationConstructorIterator(
+ ClassDeclarationAugmentationAccess<D> patching, D classBuilder,
+ {required bool includeDuplicates}) {
+ return new ClassDeclarationConstructorIterator._(
+ patching.getOrigin(classBuilder),
+ patching.getAugmentations(classBuilder)?.iterator,
+ includeDuplicates: includeDuplicates);
+ }
+
+ ClassDeclarationConstructorIterator._(
+ D classDeclaration, this.augmentationBuilders,
+ {required this.includeDuplicates})
+ : _iterator = classDeclaration.constructorScope.filteredIterator<T>(
+ parent: classDeclaration,
+ includeDuplicates: includeDuplicates,
+ includeAugmentations: false);
+
+ @override
+ bool moveNext() {
+ if (_iterator != null) {
+ if (_iterator!.moveNext()) {
+ return true;
+ }
+ }
+ if (augmentationBuilders != null && augmentationBuilders!.moveNext()) {
+ D augmentationClassDeclaration = augmentationBuilders!.current;
+ _iterator = augmentationClassDeclaration.constructorScope
+ .filteredIterator<T>(
+ parent: augmentationClassDeclaration,
+ includeDuplicates: includeDuplicates,
+ includeAugmentations: false);
+ }
+ if (_iterator != null) {
+ if (_iterator!.moveNext()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @override
+ T get current => _iterator?.current ?? (throw new StateError('No element'));
+}
+
+class ClassDeclarationConstructorNameIterator<D extends ClassDeclaration,
+ T extends MemberBuilder> implements NameIterator<T> {
+ NameIterator<T>? _iterator;
+ Iterator<D>? augmentationBuilders;
+ final bool includeDuplicates;
+
+ factory ClassDeclarationConstructorNameIterator(
+ ClassDeclarationAugmentationAccess<D> patching, D classDeclaration,
+ {required bool includeDuplicates}) {
+ return new ClassDeclarationConstructorNameIterator._(
+ patching.getOrigin(classDeclaration),
+ patching.getAugmentations(classDeclaration)?.iterator,
+ includeDuplicates: includeDuplicates);
+ }
+
+ ClassDeclarationConstructorNameIterator._(
+ D classBuilder, this.augmentationBuilders,
+ {required this.includeDuplicates})
+ : _iterator = classBuilder.constructorScope.filteredNameIterator<T>(
+ parent: classBuilder,
+ includeDuplicates: includeDuplicates,
+ includeAugmentations: false);
+
+ @override
+ bool moveNext() {
+ if (_iterator != null) {
+ if (_iterator!.moveNext()) {
+ return true;
+ }
+ }
+ if (augmentationBuilders != null && augmentationBuilders!.moveNext()) {
+ D augmentationClassDeclaration = augmentationBuilders!.current;
+ _iterator = augmentationClassDeclaration.constructorScope
+ .filteredNameIterator<T>(
+ parent: augmentationClassDeclaration,
+ includeDuplicates: includeDuplicates,
+ includeAugmentations: false);
+ }
+ if (_iterator != null) {
+ if (_iterator!.moveNext()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @override
+ T get current => _iterator?.current ?? (throw new StateError('No element'));
+
+ @override
+ String get name => _iterator?.name ?? (throw new StateError('No element'));
+}
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index 9739d76..0943688 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -385,19 +385,27 @@
@override
Iterator<T> fullMemberIterator<T extends Builder>() =>
- new ClassMemberIterator<T>(this, includeDuplicates: false);
+ new ClassDeclarationMemberIterator<SourceClassBuilder, T>(
+ const _SourceClassBuilderAugmentationAccess(), this,
+ includeDuplicates: false);
@override
NameIterator<T> fullMemberNameIterator<T extends Builder>() =>
- new ClassMemberNameIterator<T>(this, includeDuplicates: false);
+ new ClassDeclarationMemberNameIterator<SourceClassBuilder, T>(
+ const _SourceClassBuilderAugmentationAccess(), this,
+ includeDuplicates: false);
@override
Iterator<T> fullConstructorIterator<T extends MemberBuilder>() =>
- new ClassConstructorIterator<T>(this, includeDuplicates: false);
+ new ClassDeclarationConstructorIterator<SourceClassBuilder, T>(
+ const _SourceClassBuilderAugmentationAccess(), this,
+ includeDuplicates: false);
@override
NameIterator<T> fullConstructorNameIterator<T extends MemberBuilder>() =>
- new ClassConstructorNameIterator<T>(this, includeDuplicates: false);
+ new ClassDeclarationConstructorNameIterator<SourceClassBuilder, T>(
+ const _SourceClassBuilderAugmentationAccess(), this,
+ includeDuplicates: false);
@override
bool get hasGenerativeConstructor =>
@@ -2362,6 +2370,20 @@
return null;
}
+class _SourceClassBuilderAugmentationAccess
+ implements ClassDeclarationAugmentationAccess<SourceClassBuilder> {
+ const _SourceClassBuilderAugmentationAccess();
+
+ @override
+ SourceClassBuilder getOrigin(SourceClassBuilder classDeclaration) =>
+ classDeclaration.origin;
+
+ @override
+ Iterable<SourceClassBuilder>? getAugmentations(
+ SourceClassBuilder classDeclaration) =>
+ classDeclaration._patches;
+}
+
class _RedirectingConstructorsFieldBuilder extends DillFieldBuilder
with SourceMemberBuilderMixin {
_RedirectingConstructorsFieldBuilder(Field field, SourceClassBuilder parent)
@@ -2387,195 +2409,3 @@
void checkTypes(
SourceLibraryBuilder library, TypeEnvironment typeEnvironment) {}
}
-
-class ClassMemberIterator<T extends Builder> implements Iterator<T> {
- Iterator<T>? _iterator;
- Iterator<SourceClassBuilder>? augmentationBuilders;
- final bool includeDuplicates;
-
- factory ClassMemberIterator(SourceClassBuilder classBuilder,
- {required bool includeDuplicates}) {
- return new ClassMemberIterator._(classBuilder.origin,
- includeDuplicates: includeDuplicates);
- }
-
- ClassMemberIterator._(SourceClassBuilder classBuilder,
- {required this.includeDuplicates})
- : _iterator = classBuilder.scope.filteredIterator<T>(
- parent: classBuilder,
- includeDuplicates: includeDuplicates,
- includeAugmentations: false),
- augmentationBuilders = classBuilder._patches?.iterator;
-
- @override
- bool moveNext() {
- if (_iterator != null) {
- if (_iterator!.moveNext()) {
- return true;
- }
- }
- if (augmentationBuilders != null && augmentationBuilders!.moveNext()) {
- SourceClassBuilder augmentationClassBuilder =
- augmentationBuilders!.current;
- _iterator = augmentationClassBuilder.scope.filteredIterator<T>(
- parent: augmentationClassBuilder,
- includeDuplicates: includeDuplicates,
- includeAugmentations: false);
- }
- if (_iterator != null) {
- if (_iterator!.moveNext()) {
- return true;
- }
- }
- return false;
- }
-
- @override
- T get current => _iterator?.current ?? (throw new StateError('No element'));
-}
-
-class ClassMemberNameIterator<T extends Builder> implements NameIterator<T> {
- NameIterator<T>? _iterator;
- Iterator<SourceClassBuilder>? augmentationBuilders;
- final bool includeDuplicates;
-
- factory ClassMemberNameIterator(SourceClassBuilder classBuilder,
- {required bool includeDuplicates}) {
- return new ClassMemberNameIterator._(classBuilder.origin,
- includeDuplicates: includeDuplicates);
- }
-
- ClassMemberNameIterator._(SourceClassBuilder classBuilder,
- {required this.includeDuplicates})
- : _iterator = classBuilder.scope.filteredNameIterator<T>(
- parent: classBuilder,
- includeDuplicates: includeDuplicates,
- includeAugmentations: false),
- augmentationBuilders = classBuilder._patches?.iterator;
-
- @override
- bool moveNext() {
- if (_iterator != null) {
- if (_iterator!.moveNext()) {
- return true;
- }
- }
- if (augmentationBuilders != null && augmentationBuilders!.moveNext()) {
- SourceClassBuilder augmentationClassBuilder =
- augmentationBuilders!.current;
- _iterator = augmentationClassBuilder.scope.filteredNameIterator<T>(
- parent: augmentationClassBuilder,
- includeDuplicates: includeDuplicates,
- includeAugmentations: false);
- }
- if (_iterator != null) {
- if (_iterator!.moveNext()) {
- return true;
- }
- }
- return false;
- }
-
- @override
- T get current => _iterator?.current ?? (throw new StateError('No element'));
-
- @override
- String get name => _iterator?.name ?? (throw new StateError('No element'));
-}
-
-class ClassConstructorIterator<T extends MemberBuilder> implements Iterator<T> {
- Iterator<T>? _iterator;
- Iterator<SourceClassBuilder>? augmentationBuilders;
- final bool includeDuplicates;
-
- factory ClassConstructorIterator(SourceClassBuilder classBuilder,
- {required bool includeDuplicates}) {
- return new ClassConstructorIterator._(classBuilder.origin,
- includeDuplicates: includeDuplicates);
- }
-
- ClassConstructorIterator._(SourceClassBuilder classBuilder,
- {required this.includeDuplicates})
- : _iterator = classBuilder.constructorScope.filteredIterator<T>(
- parent: classBuilder,
- includeDuplicates: includeDuplicates,
- includeAugmentations: false),
- augmentationBuilders = classBuilder._patches?.iterator;
-
- @override
- bool moveNext() {
- if (_iterator != null) {
- if (_iterator!.moveNext()) {
- return true;
- }
- }
- if (augmentationBuilders != null && augmentationBuilders!.moveNext()) {
- SourceClassBuilder augmentationClassBuilder =
- augmentationBuilders!.current;
- _iterator = augmentationClassBuilder.constructorScope.filteredIterator<T>(
- parent: augmentationClassBuilder,
- includeDuplicates: includeDuplicates,
- includeAugmentations: false);
- }
- if (_iterator != null) {
- if (_iterator!.moveNext()) {
- return true;
- }
- }
- return false;
- }
-
- @override
- T get current => _iterator?.current ?? (throw new StateError('No element'));
-}
-
-class ClassConstructorNameIterator<T extends MemberBuilder>
- implements NameIterator<T> {
- NameIterator<T>? _iterator;
- Iterator<SourceClassBuilder>? augmentationBuilders;
- final bool includeDuplicates;
-
- factory ClassConstructorNameIterator(SourceClassBuilder classBuilder,
- {required bool includeDuplicates}) {
- return new ClassConstructorNameIterator._(classBuilder.origin,
- includeDuplicates: includeDuplicates);
- }
-
- ClassConstructorNameIterator._(SourceClassBuilder classBuilder,
- {required this.includeDuplicates})
- : _iterator = classBuilder.constructorScope.filteredNameIterator<T>(
- parent: classBuilder,
- includeDuplicates: includeDuplicates,
- includeAugmentations: false),
- augmentationBuilders = classBuilder._patches?.iterator;
-
- @override
- bool moveNext() {
- if (_iterator != null) {
- if (_iterator!.moveNext()) {
- return true;
- }
- }
- if (augmentationBuilders != null && augmentationBuilders!.moveNext()) {
- SourceClassBuilder augmentationClassBuilder =
- augmentationBuilders!.current;
- _iterator = augmentationClassBuilder.constructorScope
- .filteredNameIterator<T>(
- parent: augmentationClassBuilder,
- includeDuplicates: includeDuplicates,
- includeAugmentations: false);
- }
- if (_iterator != null) {
- if (_iterator!.moveNext()) {
- return true;
- }
- }
- return false;
- }
-
- @override
- T get current => _iterator?.current ?? (throw new StateError('No element'));
-
- @override
- String get name => _iterator?.name ?? (throw new StateError('No element'));
-}
diff --git a/pkg/front_end/lib/src/fasta/source/source_inline_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_inline_class_builder.dart
index b11f305..ba66135 100644
--- a/pkg/front_end/lib/src/fasta/source/source_inline_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_inline_class_builder.dart
@@ -203,35 +203,50 @@
DartType get declaredRepresentationType => throw new UnimplementedError();
@override
- Iterator<T> fullConstructorIterator<T extends MemberBuilder>() {
- // TODO(johnniwinther): Implement fullConstructorIterator
- throw new UnimplementedError();
- }
+ Iterator<T> fullMemberIterator<T extends Builder>() =>
+ new ClassDeclarationMemberIterator<SourceInlineClassBuilder, T>(
+ const _SourceInlineClassBuilderAugmentationAccess(), this,
+ includeDuplicates: false);
@override
- NameIterator<T> fullConstructorNameIterator<T extends MemberBuilder>() {
- // TODO(johnniwinther): Implement fullConstructorNameIterator
- throw new UnimplementedError();
- }
+ NameIterator<T> fullMemberNameIterator<T extends Builder>() =>
+ new ClassDeclarationMemberNameIterator<SourceInlineClassBuilder, T>(
+ const _SourceInlineClassBuilderAugmentationAccess(), this,
+ includeDuplicates: false);
@override
- Iterator<T> fullMemberIterator<T extends Builder>() {
- // TODO(johnniwinther): Implement fullMemberIterator
- throw new UnimplementedError();
- }
+ Iterator<T> fullConstructorIterator<T extends MemberBuilder>() =>
+ new ClassDeclarationConstructorIterator<SourceInlineClassBuilder, T>(
+ const _SourceInlineClassBuilderAugmentationAccess(), this,
+ includeDuplicates: false);
@override
- NameIterator<T> fullMemberNameIterator<T extends Builder>() {
- // TODO(johnniwinther): Implement fullMemberNameIterator
- throw new UnimplementedError();
- }
+ NameIterator<T> fullConstructorNameIterator<T extends MemberBuilder>() =>
+ new ClassDeclarationConstructorNameIterator<SourceInlineClassBuilder, T>(
+ const _SourceInlineClassBuilderAugmentationAccess(), this,
+ includeDuplicates: false);
@override
bool get isMixinDeclaration => false;
@override
bool get hasGenerativeConstructor {
- // TODO(johnniwinther): Implement hasGenerativeConstructor
- throw new UnimplementedError();
+ // TODO(johnniwinther): Support default constructor? and factories.
+ return true;
}
}
+
+class _SourceInlineClassBuilderAugmentationAccess
+ implements ClassDeclarationAugmentationAccess<SourceInlineClassBuilder> {
+ const _SourceInlineClassBuilderAugmentationAccess();
+
+ @override
+ SourceInlineClassBuilder getOrigin(
+ SourceInlineClassBuilder classDeclaration) =>
+ classDeclaration.origin;
+
+ @override
+ Iterable<SourceInlineClassBuilder>? getAugmentations(
+ SourceInlineClassBuilder classDeclaration) =>
+ null;
+}
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 74c880d..88d73dff 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -1558,19 +1558,24 @@
}
}
- void collectSourceClasses(List<SourceClassBuilder> sourceClasses) {
+ void collectSourceClasses(List<SourceClassBuilder> sourceClasses,
+ List<SourceInlineClassBuilder>? inlineClasses) {
Iterable<SourceLibraryBuilder>? patches = this.patchLibraries;
if (patches != null) {
for (SourceLibraryBuilder patchLibrary in patches) {
- patchLibrary.collectSourceClasses(sourceClasses);
+ patchLibrary.collectSourceClasses(sourceClasses, inlineClasses);
}
}
- Iterator<SourceClassBuilder> iterator = localMembersIteratorOfType();
+ Iterator<Builder> iterator = localMembersIterator;
while (iterator.moveNext()) {
- SourceClassBuilder member = iterator.current;
- if (!member.isPatch) {
+ Builder member = iterator.current;
+ if (member is SourceClassBuilder && !member.isPatch) {
sourceClasses.add(member);
+ } else if (inlineClasses != null &&
+ member is SourceInlineClassBuilder &&
+ !member.isPatch) {
+ inlineClasses.add(member);
}
}
}
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index b64c774..b07298c 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -97,6 +97,7 @@
import 'source_extension_builder.dart';
import 'source_factory_builder.dart';
import 'source_field_builder.dart';
+import 'source_inline_class_builder.dart';
import 'source_library_builder.dart'
show
ImplicitLanguageVersion,
@@ -1936,13 +1937,13 @@
}
}
- /// Returns classes defined in libraries in this [SourceLoader].
- List<SourceClassBuilder> collectSourceClasses() {
- List<SourceClassBuilder> sourceClasses = <SourceClassBuilder>[];
+ /// Add classes (and inline classes) defined in libraries in this
+ /// [SourceLoader] to [sourceClasses], and [inlineClasses], if provided.
+ void collectSourceClasses(List<SourceClassBuilder> sourceClasses,
+ [List<SourceInlineClassBuilder>? inlineClasses]) {
for (SourceLibraryBuilder library in sourceLibraryBuilders) {
- library.collectSourceClasses(sourceClasses);
+ library.collectSourceClasses(sourceClasses, inlineClasses);
}
- return sourceClasses;
}
/// Returns a list of all class builders declared in this loader. As the
@@ -1969,8 +1970,10 @@
}
// Sort the classes topologically.
+ List<SourceClassBuilder> sourceClasses = [];
+ collectSourceClasses(sourceClasses);
_SourceClassGraph classGraph =
- new _SourceClassGraph(collectSourceClasses(), objectClass);
+ new _SourceClassGraph(sourceClasses, objectClass);
TopologicalSortResult<SourceClassBuilder> result =
topologicalSort(classGraph);
List<SourceClassBuilder> classes = result.sortedVertices;
diff --git a/pkg/front_end/testcases/inline_class/initializers.dart b/pkg/front_end/testcases/inline_class/initializers.dart
new file mode 100644
index 0000000..a476b35
--- /dev/null
+++ b/pkg/front_end/testcases/inline_class/initializers.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+inline class Class1 {
+ final int field;
+
+ Class1(this.field);
+}
+
+inline class Class2 {
+ final int field;
+
+ Class2(int field) : this.field = field;
+}
+
+inline class Class3 {
+ final int field;
+}
+
+inline class Class4 {
+ final int field;
+
+ Class4(this.field, this.nonexisting);
+}
+
+inline class Class5 {
+ final int field;
+
+ Class5(this.field) : this.field = 42;
+}
+
+inline class Class6 {
+ final int field;
+
+ Class6(this.field) : this.nonexisting = 42;
+}
diff --git a/pkg/front_end/testcases/inline_class/initializers.dart.strong.expect b/pkg/front_end/testcases/inline_class/initializers.dart.strong.expect
new file mode 100644
index 0000000..3b0e996
--- /dev/null
+++ b/pkg/front_end/testcases/inline_class/initializers.dart.strong.expect
@@ -0,0 +1,51 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inline_class/initializers.dart:24:27: Error: 'nonexisting' isn't an instance field of this class.
+// Class4(this.field, this.nonexisting);
+// ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/inline_class/initializers.dart:30:35: Error: 'field' was already initialized by this constructor.
+// Class5(this.field) : this.field = 42;
+// ^
+//
+// pkg/front_end/testcases/inline_class/initializers.dart:36:29: Error: 'nonexisting' isn't an instance field of this class.
+// Class6(this.field) : this.nonexisting = 42;
+// ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/inline_class/initializers.dart:18:13: Error: Final field 'field' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int field;
+// ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+inline class Class1 /* declaredRepresentationType = core::int */ {
+ constructor • = self::Class1|;
+}
+inline class Class2 /* declaredRepresentationType = core::int */ {
+ constructor • = self::Class2|;
+}
+inline class Class3 /* declaredRepresentationType = core::int */ {
+}
+inline class Class4 /* declaredRepresentationType = core::int */ {
+ constructor • = self::Class4|;
+}
+inline class Class5 /* declaredRepresentationType = core::int */ {
+ constructor • = self::Class5|;
+}
+inline class Class6 /* declaredRepresentationType = core::int */ {
+ constructor • = self::Class6|;
+}
+method Class1|(core::int field) → self::Class1
+ ;
+method Class2|(core::int field) → self::Class2
+ ;
+method Class4|(core::int field, dynamic nonexisting) → self::Class4
+ ;
+method Class5|(core::int field) → self::Class5
+ ;
+method Class6|(core::int field) → self::Class6
+ ;
diff --git a/pkg/front_end/testcases/inline_class/initializers.dart.strong.transformed.expect b/pkg/front_end/testcases/inline_class/initializers.dart.strong.transformed.expect
new file mode 100644
index 0000000..3b0e996
--- /dev/null
+++ b/pkg/front_end/testcases/inline_class/initializers.dart.strong.transformed.expect
@@ -0,0 +1,51 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inline_class/initializers.dart:24:27: Error: 'nonexisting' isn't an instance field of this class.
+// Class4(this.field, this.nonexisting);
+// ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/inline_class/initializers.dart:30:35: Error: 'field' was already initialized by this constructor.
+// Class5(this.field) : this.field = 42;
+// ^
+//
+// pkg/front_end/testcases/inline_class/initializers.dart:36:29: Error: 'nonexisting' isn't an instance field of this class.
+// Class6(this.field) : this.nonexisting = 42;
+// ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/inline_class/initializers.dart:18:13: Error: Final field 'field' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int field;
+// ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+inline class Class1 /* declaredRepresentationType = core::int */ {
+ constructor • = self::Class1|;
+}
+inline class Class2 /* declaredRepresentationType = core::int */ {
+ constructor • = self::Class2|;
+}
+inline class Class3 /* declaredRepresentationType = core::int */ {
+}
+inline class Class4 /* declaredRepresentationType = core::int */ {
+ constructor • = self::Class4|;
+}
+inline class Class5 /* declaredRepresentationType = core::int */ {
+ constructor • = self::Class5|;
+}
+inline class Class6 /* declaredRepresentationType = core::int */ {
+ constructor • = self::Class6|;
+}
+method Class1|(core::int field) → self::Class1
+ ;
+method Class2|(core::int field) → self::Class2
+ ;
+method Class4|(core::int field, dynamic nonexisting) → self::Class4
+ ;
+method Class5|(core::int field) → self::Class5
+ ;
+method Class6|(core::int field) → self::Class6
+ ;
diff --git a/pkg/front_end/testcases/inline_class/initializers.dart.textual_outline.expect b/pkg/front_end/testcases/inline_class/initializers.dart.textual_outline.expect
new file mode 100644
index 0000000..029ff7b
--- /dev/null
+++ b/pkg/front_end/testcases/inline_class/initializers.dart.textual_outline.expect
@@ -0,0 +1,29 @@
+inline
+class Class1 {
+ final int field;
+ Class1(this.field);
+}
+inline
+class Class2 {
+ final int field;
+ Class2(int field) : this.field = field;
+}
+inline
+class Class3 {
+ final int field;
+}
+inline
+class Class4 {
+ final int field;
+ Class4(this.field, this.nonexisting);
+}
+inline
+class Class5 {
+ final int field;
+ Class5(this.field) : this.field = 42;
+}
+inline
+class Class6 {
+ final int field;
+ Class6(this.field) : this.nonexisting = 42;
+}
diff --git a/pkg/front_end/testcases/inline_class/initializers.dart.weak.expect b/pkg/front_end/testcases/inline_class/initializers.dart.weak.expect
new file mode 100644
index 0000000..3b0e996
--- /dev/null
+++ b/pkg/front_end/testcases/inline_class/initializers.dart.weak.expect
@@ -0,0 +1,51 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inline_class/initializers.dart:24:27: Error: 'nonexisting' isn't an instance field of this class.
+// Class4(this.field, this.nonexisting);
+// ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/inline_class/initializers.dart:30:35: Error: 'field' was already initialized by this constructor.
+// Class5(this.field) : this.field = 42;
+// ^
+//
+// pkg/front_end/testcases/inline_class/initializers.dart:36:29: Error: 'nonexisting' isn't an instance field of this class.
+// Class6(this.field) : this.nonexisting = 42;
+// ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/inline_class/initializers.dart:18:13: Error: Final field 'field' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int field;
+// ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+inline class Class1 /* declaredRepresentationType = core::int */ {
+ constructor • = self::Class1|;
+}
+inline class Class2 /* declaredRepresentationType = core::int */ {
+ constructor • = self::Class2|;
+}
+inline class Class3 /* declaredRepresentationType = core::int */ {
+}
+inline class Class4 /* declaredRepresentationType = core::int */ {
+ constructor • = self::Class4|;
+}
+inline class Class5 /* declaredRepresentationType = core::int */ {
+ constructor • = self::Class5|;
+}
+inline class Class6 /* declaredRepresentationType = core::int */ {
+ constructor • = self::Class6|;
+}
+method Class1|(core::int field) → self::Class1
+ ;
+method Class2|(core::int field) → self::Class2
+ ;
+method Class4|(core::int field, dynamic nonexisting) → self::Class4
+ ;
+method Class5|(core::int field) → self::Class5
+ ;
+method Class6|(core::int field) → self::Class6
+ ;
diff --git a/pkg/front_end/testcases/inline_class/initializers.dart.weak.modular.expect b/pkg/front_end/testcases/inline_class/initializers.dart.weak.modular.expect
new file mode 100644
index 0000000..3b0e996
--- /dev/null
+++ b/pkg/front_end/testcases/inline_class/initializers.dart.weak.modular.expect
@@ -0,0 +1,51 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inline_class/initializers.dart:24:27: Error: 'nonexisting' isn't an instance field of this class.
+// Class4(this.field, this.nonexisting);
+// ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/inline_class/initializers.dart:30:35: Error: 'field' was already initialized by this constructor.
+// Class5(this.field) : this.field = 42;
+// ^
+//
+// pkg/front_end/testcases/inline_class/initializers.dart:36:29: Error: 'nonexisting' isn't an instance field of this class.
+// Class6(this.field) : this.nonexisting = 42;
+// ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/inline_class/initializers.dart:18:13: Error: Final field 'field' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int field;
+// ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+inline class Class1 /* declaredRepresentationType = core::int */ {
+ constructor • = self::Class1|;
+}
+inline class Class2 /* declaredRepresentationType = core::int */ {
+ constructor • = self::Class2|;
+}
+inline class Class3 /* declaredRepresentationType = core::int */ {
+}
+inline class Class4 /* declaredRepresentationType = core::int */ {
+ constructor • = self::Class4|;
+}
+inline class Class5 /* declaredRepresentationType = core::int */ {
+ constructor • = self::Class5|;
+}
+inline class Class6 /* declaredRepresentationType = core::int */ {
+ constructor • = self::Class6|;
+}
+method Class1|(core::int field) → self::Class1
+ ;
+method Class2|(core::int field) → self::Class2
+ ;
+method Class4|(core::int field, dynamic nonexisting) → self::Class4
+ ;
+method Class5|(core::int field) → self::Class5
+ ;
+method Class6|(core::int field) → self::Class6
+ ;
diff --git a/pkg/front_end/testcases/inline_class/initializers.dart.weak.outline.expect b/pkg/front_end/testcases/inline_class/initializers.dart.weak.outline.expect
new file mode 100644
index 0000000..74753da
--- /dev/null
+++ b/pkg/front_end/testcases/inline_class/initializers.dart.weak.outline.expect
@@ -0,0 +1,31 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+inline class Class1 /* declaredRepresentationType = core::int */ {
+ constructor • = self::Class1|;
+}
+inline class Class2 /* declaredRepresentationType = core::int */ {
+ constructor • = self::Class2|;
+}
+inline class Class3 /* declaredRepresentationType = core::int */ {
+}
+inline class Class4 /* declaredRepresentationType = core::int */ {
+ constructor • = self::Class4|;
+}
+inline class Class5 /* declaredRepresentationType = core::int */ {
+ constructor • = self::Class5|;
+}
+inline class Class6 /* declaredRepresentationType = core::int */ {
+ constructor • = self::Class6|;
+}
+method Class1|(core::int field) → self::Class1
+ ;
+method Class2|(core::int field) → self::Class2
+ ;
+method Class4|(core::int field, dynamic nonexisting) → self::Class4
+ ;
+method Class5|(core::int field) → self::Class5
+ ;
+method Class6|(core::int field) → self::Class6
+ ;
diff --git a/pkg/front_end/testcases/inline_class/initializers.dart.weak.transformed.expect b/pkg/front_end/testcases/inline_class/initializers.dart.weak.transformed.expect
new file mode 100644
index 0000000..3b0e996
--- /dev/null
+++ b/pkg/front_end/testcases/inline_class/initializers.dart.weak.transformed.expect
@@ -0,0 +1,51 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inline_class/initializers.dart:24:27: Error: 'nonexisting' isn't an instance field of this class.
+// Class4(this.field, this.nonexisting);
+// ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/inline_class/initializers.dart:30:35: Error: 'field' was already initialized by this constructor.
+// Class5(this.field) : this.field = 42;
+// ^
+//
+// pkg/front_end/testcases/inline_class/initializers.dart:36:29: Error: 'nonexisting' isn't an instance field of this class.
+// Class6(this.field) : this.nonexisting = 42;
+// ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/inline_class/initializers.dart:18:13: Error: Final field 'field' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int field;
+// ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+inline class Class1 /* declaredRepresentationType = core::int */ {
+ constructor • = self::Class1|;
+}
+inline class Class2 /* declaredRepresentationType = core::int */ {
+ constructor • = self::Class2|;
+}
+inline class Class3 /* declaredRepresentationType = core::int */ {
+}
+inline class Class4 /* declaredRepresentationType = core::int */ {
+ constructor • = self::Class4|;
+}
+inline class Class5 /* declaredRepresentationType = core::int */ {
+ constructor • = self::Class5|;
+}
+inline class Class6 /* declaredRepresentationType = core::int */ {
+ constructor • = self::Class6|;
+}
+method Class1|(core::int field) → self::Class1
+ ;
+method Class2|(core::int field) → self::Class2
+ ;
+method Class4|(core::int field, dynamic nonexisting) → self::Class4
+ ;
+method Class5|(core::int field) → self::Class5
+ ;
+method Class6|(core::int field) → self::Class6
+ ;
diff --git a/pkg/front_end/testcases/inline_class/inline_class_declaration.dart.strong.expect b/pkg/front_end/testcases/inline_class/inline_class_declaration.dart.strong.expect
index 17de42b..4cfec83 100644
--- a/pkg/front_end/testcases/inline_class/inline_class_declaration.dart.strong.expect
+++ b/pkg/front_end/testcases/inline_class/inline_class_declaration.dart.strong.expect
@@ -1,4 +1,17 @@
library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inline_class/inline_class_declaration.dart:7:13: Error: Final field 'it' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int it;
+// ^^
+//
+// pkg/front_end/testcases/inline_class/inline_class_declaration.dart:11:17: Error: Final field 'it' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final List<T> it;
+// ^^
+//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inline_class/inline_class_declaration.dart.strong.transformed.expect b/pkg/front_end/testcases/inline_class/inline_class_declaration.dart.strong.transformed.expect
index 0bef8c1..2c63a24 100644
--- a/pkg/front_end/testcases/inline_class/inline_class_declaration.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inline_class/inline_class_declaration.dart.strong.transformed.expect
@@ -1,4 +1,17 @@
library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inline_class/inline_class_declaration.dart:7:13: Error: Final field 'it' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int it;
+// ^^
+//
+// pkg/front_end/testcases/inline_class/inline_class_declaration.dart:11:17: Error: Final field 'it' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final List<T> it;
+// ^^
+//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inline_class/inline_class_declaration.dart.weak.expect b/pkg/front_end/testcases/inline_class/inline_class_declaration.dart.weak.expect
index 17de42b..4cfec83 100644
--- a/pkg/front_end/testcases/inline_class/inline_class_declaration.dart.weak.expect
+++ b/pkg/front_end/testcases/inline_class/inline_class_declaration.dart.weak.expect
@@ -1,4 +1,17 @@
library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inline_class/inline_class_declaration.dart:7:13: Error: Final field 'it' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int it;
+// ^^
+//
+// pkg/front_end/testcases/inline_class/inline_class_declaration.dart:11:17: Error: Final field 'it' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final List<T> it;
+// ^^
+//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inline_class/inline_class_declaration.dart.weak.modular.expect b/pkg/front_end/testcases/inline_class/inline_class_declaration.dart.weak.modular.expect
index 17de42b..4cfec83 100644
--- a/pkg/front_end/testcases/inline_class/inline_class_declaration.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/inline_class/inline_class_declaration.dart.weak.modular.expect
@@ -1,4 +1,17 @@
library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inline_class/inline_class_declaration.dart:7:13: Error: Final field 'it' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int it;
+// ^^
+//
+// pkg/front_end/testcases/inline_class/inline_class_declaration.dart:11:17: Error: Final field 'it' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final List<T> it;
+// ^^
+//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inline_class/inline_class_declaration.dart.weak.transformed.expect b/pkg/front_end/testcases/inline_class/inline_class_declaration.dart.weak.transformed.expect
index 0bef8c1..2c63a24 100644
--- a/pkg/front_end/testcases/inline_class/inline_class_declaration.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inline_class/inline_class_declaration.dart.weak.transformed.expect
@@ -1,4 +1,17 @@
library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inline_class/inline_class_declaration.dart:7:13: Error: Final field 'it' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int it;
+// ^^
+//
+// pkg/front_end/testcases/inline_class/inline_class_declaration.dart:11:17: Error: Final field 'it' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final List<T> it;
+// ^^
+//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inline_class/procedures.dart.strong.expect b/pkg/front_end/testcases/inline_class/procedures.dart.strong.expect
index 65cef0e..03cd44e 100644
--- a/pkg/front_end/testcases/inline_class/procedures.dart.strong.expect
+++ b/pkg/front_end/testcases/inline_class/procedures.dart.strong.expect
@@ -1,4 +1,17 @@
library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inline_class/procedures.dart:6:13: Error: Final field 'it' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int it;
+// ^^
+//
+// pkg/front_end/testcases/inline_class/procedures.dart:39:11: Error: Final field 'it' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final T it;
+// ^^
+//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inline_class/procedures.dart.strong.transformed.expect b/pkg/front_end/testcases/inline_class/procedures.dart.strong.transformed.expect
index 65cef0e..03cd44e 100644
--- a/pkg/front_end/testcases/inline_class/procedures.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inline_class/procedures.dart.strong.transformed.expect
@@ -1,4 +1,17 @@
library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inline_class/procedures.dart:6:13: Error: Final field 'it' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int it;
+// ^^
+//
+// pkg/front_end/testcases/inline_class/procedures.dart:39:11: Error: Final field 'it' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final T it;
+// ^^
+//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inline_class/procedures.dart.weak.expect b/pkg/front_end/testcases/inline_class/procedures.dart.weak.expect
index 65cef0e..03cd44e 100644
--- a/pkg/front_end/testcases/inline_class/procedures.dart.weak.expect
+++ b/pkg/front_end/testcases/inline_class/procedures.dart.weak.expect
@@ -1,4 +1,17 @@
library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inline_class/procedures.dart:6:13: Error: Final field 'it' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int it;
+// ^^
+//
+// pkg/front_end/testcases/inline_class/procedures.dart:39:11: Error: Final field 'it' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final T it;
+// ^^
+//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inline_class/procedures.dart.weak.modular.expect b/pkg/front_end/testcases/inline_class/procedures.dart.weak.modular.expect
index 65cef0e..03cd44e 100644
--- a/pkg/front_end/testcases/inline_class/procedures.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/inline_class/procedures.dart.weak.modular.expect
@@ -1,4 +1,17 @@
library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inline_class/procedures.dart:6:13: Error: Final field 'it' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int it;
+// ^^
+//
+// pkg/front_end/testcases/inline_class/procedures.dart:39:11: Error: Final field 'it' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final T it;
+// ^^
+//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inline_class/procedures.dart.weak.transformed.expect b/pkg/front_end/testcases/inline_class/procedures.dart.weak.transformed.expect
index 65cef0e..03cd44e 100644
--- a/pkg/front_end/testcases/inline_class/procedures.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inline_class/procedures.dart.weak.transformed.expect
@@ -1,4 +1,17 @@
library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inline_class/procedures.dart:6:13: Error: Final field 'it' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int it;
+// ^^
+//
+// pkg/front_end/testcases/inline_class/procedures.dart:39:11: Error: Final field 'it' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final T it;
+// ^^
+//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inline_class/representation.dart.strong.expect b/pkg/front_end/testcases/inline_class/representation.dart.strong.expect
index bc1ba48..6982699 100644
--- a/pkg/front_end/testcases/inline_class/representation.dart.strong.expect
+++ b/pkg/front_end/testcases/inline_class/representation.dart.strong.expect
@@ -9,6 +9,26 @@
// final bool instanceField;
// ^^^^^^^^^^^^^
//
+// pkg/front_end/testcases/inline_class/representation.dart:9:14: Error: Final field 'instanceField' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final bool instanceField;
+// ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/inline_class/representation.dart:13:14: Error: Final field 'instanceField1' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final bool instanceField1;
+// ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/inline_class/representation.dart:14:13: Error: Final field 'instanceField2' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int instanceField2;
+// ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/inline_class/representation.dart:18:14: Error: Final field 'instanceField' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final bool instanceField;
+// ^^^^^^^^^^^^^
+//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inline_class/representation.dart.strong.transformed.expect b/pkg/front_end/testcases/inline_class/representation.dart.strong.transformed.expect
index bc1ba48..6982699 100644
--- a/pkg/front_end/testcases/inline_class/representation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inline_class/representation.dart.strong.transformed.expect
@@ -9,6 +9,26 @@
// final bool instanceField;
// ^^^^^^^^^^^^^
//
+// pkg/front_end/testcases/inline_class/representation.dart:9:14: Error: Final field 'instanceField' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final bool instanceField;
+// ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/inline_class/representation.dart:13:14: Error: Final field 'instanceField1' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final bool instanceField1;
+// ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/inline_class/representation.dart:14:13: Error: Final field 'instanceField2' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int instanceField2;
+// ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/inline_class/representation.dart:18:14: Error: Final field 'instanceField' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final bool instanceField;
+// ^^^^^^^^^^^^^
+//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inline_class/representation.dart.weak.expect b/pkg/front_end/testcases/inline_class/representation.dart.weak.expect
index bc1ba48..6982699 100644
--- a/pkg/front_end/testcases/inline_class/representation.dart.weak.expect
+++ b/pkg/front_end/testcases/inline_class/representation.dart.weak.expect
@@ -9,6 +9,26 @@
// final bool instanceField;
// ^^^^^^^^^^^^^
//
+// pkg/front_end/testcases/inline_class/representation.dart:9:14: Error: Final field 'instanceField' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final bool instanceField;
+// ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/inline_class/representation.dart:13:14: Error: Final field 'instanceField1' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final bool instanceField1;
+// ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/inline_class/representation.dart:14:13: Error: Final field 'instanceField2' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int instanceField2;
+// ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/inline_class/representation.dart:18:14: Error: Final field 'instanceField' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final bool instanceField;
+// ^^^^^^^^^^^^^
+//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inline_class/representation.dart.weak.modular.expect b/pkg/front_end/testcases/inline_class/representation.dart.weak.modular.expect
index bc1ba48..6982699 100644
--- a/pkg/front_end/testcases/inline_class/representation.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/inline_class/representation.dart.weak.modular.expect
@@ -9,6 +9,26 @@
// final bool instanceField;
// ^^^^^^^^^^^^^
//
+// pkg/front_end/testcases/inline_class/representation.dart:9:14: Error: Final field 'instanceField' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final bool instanceField;
+// ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/inline_class/representation.dart:13:14: Error: Final field 'instanceField1' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final bool instanceField1;
+// ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/inline_class/representation.dart:14:13: Error: Final field 'instanceField2' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int instanceField2;
+// ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/inline_class/representation.dart:18:14: Error: Final field 'instanceField' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final bool instanceField;
+// ^^^^^^^^^^^^^
+//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inline_class/representation.dart.weak.transformed.expect b/pkg/front_end/testcases/inline_class/representation.dart.weak.transformed.expect
index bc1ba48..6982699 100644
--- a/pkg/front_end/testcases/inline_class/representation.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inline_class/representation.dart.weak.transformed.expect
@@ -9,6 +9,26 @@
// final bool instanceField;
// ^^^^^^^^^^^^^
//
+// pkg/front_end/testcases/inline_class/representation.dart:9:14: Error: Final field 'instanceField' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final bool instanceField;
+// ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/inline_class/representation.dart:13:14: Error: Final field 'instanceField1' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final bool instanceField1;
+// ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/inline_class/representation.dart:14:13: Error: Final field 'instanceField2' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final int instanceField2;
+// ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/inline_class/representation.dart:18:14: Error: Final field 'instanceField' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+// final bool instanceField;
+// ^^^^^^^^^^^^^
+//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.strong.expect b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.strong.expect
index 9aa345d..eb2b0e2 100644
--- a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.strong.expect
@@ -22,11 +22,6 @@
// void patchedMethod([int i]) {}
// ^
//
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:13:29: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
-// Try adding either an explicit non-'null' default value or the 'required' modifier.
-// void _injectedMethod([int i]) {}
-// ^
-//
// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:17:25: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
// Try adding either an explicit non-'null' default value or the 'required' modifier.
// void patchedMethod([int i]) {}
@@ -37,6 +32,11 @@
// void _injectedMethod([int i]) {}
// ^
//
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:13:29: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+// void _injectedMethod([int i]) {}
+// ^
+//
// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:11:18: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
// Try adding either an explicit non-'null' default value or the 'required' modifier.
// void method([int i]) {}
diff --git a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.strong.transformed.expect
index 9aa345d..eb2b0e2 100644
--- a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.strong.transformed.expect
@@ -22,11 +22,6 @@
// void patchedMethod([int i]) {}
// ^
//
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:13:29: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
-// Try adding either an explicit non-'null' default value or the 'required' modifier.
-// void _injectedMethod([int i]) {}
-// ^
-//
// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:17:25: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
// Try adding either an explicit non-'null' default value or the 'required' modifier.
// void patchedMethod([int i]) {}
@@ -37,6 +32,11 @@
// void _injectedMethod([int i]) {}
// ^
//
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:13:29: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+// void _injectedMethod([int i]) {}
+// ^
+//
// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:11:18: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
// Try adding either an explicit non-'null' default value or the 'required' modifier.
// void method([int i]) {}
diff --git a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.expect b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.expect
index 9aa345d..eb2b0e2 100644
--- a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.expect
@@ -22,11 +22,6 @@
// void patchedMethod([int i]) {}
// ^
//
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:13:29: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
-// Try adding either an explicit non-'null' default value or the 'required' modifier.
-// void _injectedMethod([int i]) {}
-// ^
-//
// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:17:25: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
// Try adding either an explicit non-'null' default value or the 'required' modifier.
// void patchedMethod([int i]) {}
@@ -37,6 +32,11 @@
// void _injectedMethod([int i]) {}
// ^
//
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:13:29: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+// void _injectedMethod([int i]) {}
+// ^
+//
// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:11:18: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
// Try adding either an explicit non-'null' default value or the 'required' modifier.
// void method([int i]) {}
diff --git a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.modular.expect
index 9aa345d..eb2b0e2 100644
--- a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.modular.expect
@@ -22,11 +22,6 @@
// void patchedMethod([int i]) {}
// ^
//
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:13:29: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
-// Try adding either an explicit non-'null' default value or the 'required' modifier.
-// void _injectedMethod([int i]) {}
-// ^
-//
// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:17:25: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
// Try adding either an explicit non-'null' default value or the 'required' modifier.
// void patchedMethod([int i]) {}
@@ -37,6 +32,11 @@
// void _injectedMethod([int i]) {}
// ^
//
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:13:29: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+// void _injectedMethod([int i]) {}
+// ^
+//
// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:11:18: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
// Try adding either an explicit non-'null' default value or the 'required' modifier.
// void method([int i]) {}
diff --git a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.outline.expect
index ede4192..9ea4887 100644
--- a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.outline.expect
@@ -20,11 +20,6 @@
// void patchedMethod([int i]) {}
// ^
//
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:13:29: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
-// Try adding either an explicit non-'null' default value or the 'required' modifier.
-// void _injectedMethod([int i]) {}
-// ^
-//
// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:17:25: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
// Try adding either an explicit non-'null' default value or the 'required' modifier.
// void patchedMethod([int i]) {}
@@ -35,6 +30,11 @@
// void _injectedMethod([int i]) {}
// ^
//
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:13:29: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+// void _injectedMethod([int i]) {}
+// ^
+//
// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:11:18: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
// Try adding either an explicit non-'null' default value or the 'required' modifier.
// void method([int i]) {}
diff --git a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.transformed.expect
index 9aa345d..eb2b0e2 100644
--- a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.transformed.expect
@@ -22,11 +22,6 @@
// void patchedMethod([int i]) {}
// ^
//
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:13:29: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
-// Try adding either an explicit non-'null' default value or the 'required' modifier.
-// void _injectedMethod([int i]) {}
-// ^
-//
// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:17:25: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
// Try adding either an explicit non-'null' default value or the 'required' modifier.
// void patchedMethod([int i]) {}
@@ -37,6 +32,11 @@
// void _injectedMethod([int i]) {}
// ^
//
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:13:29: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+// void _injectedMethod([int i]) {}
+// ^
+//
// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:11:18: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
// Try adding either an explicit non-'null' default value or the 'required' modifier.
// void method([int i]) {}
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index 56f36f2..7957341 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -117,6 +117,7 @@
general/type_variable_in_static_context: FormatterCrash
general/var_as_type_name: FormatterCrash
inline_class/constructors: FormatterCrash
+inline_class/initializers: FormatterCrash
inline_class/inline_class_declaration: FormatterCrash
inline_class/procedures: FormatterCrash
inline_class/representation: FormatterCrash