Version 2.18.0-226.0.dev
Merge commit 'c50236ff9ca3a4ec91de870fe4f52d4492947756' into 'dev'
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b8bee49..5139f56 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -24,6 +24,10 @@
- The `Stream.fromIterable` stream can now be listened to more than once.
+### `dart:collection`
+
+- Deprecates `BidirectionalIterator`.
+
## 2.18.0
### Language
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
index 42e8fa8..e6fcee3 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -7821,6 +7821,101 @@
correctionMessage: r"""Try adding a parameter list to the typedef.""");
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+ Message Function(
+ String
+ name)> templateMixinApplicationNoConcreteGetter = const Template<
+ Message Function(String name)>(
+ problemMessageTemplate:
+ r"""The class doesn't have a concrete implementation of the super-accessed member '#name'.""",
+ withArguments: _withArgumentsMixinApplicationNoConcreteGetter);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)> codeMixinApplicationNoConcreteGetter =
+ const Code<Message Function(String name)>(
+ "MixinApplicationNoConcreteGetter",
+ analyzerCodes: <String>[
+ "MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER"
+ ]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsMixinApplicationNoConcreteGetter(String name) {
+ if (name.isEmpty) throw 'No name provided';
+ name = demangleMixinApplicationName(name);
+ return new Message(codeMixinApplicationNoConcreteGetter,
+ problemMessage:
+ """The class doesn't have a concrete implementation of the super-accessed member '${name}'.""",
+ arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeMixinApplicationNoConcreteMemberContext =
+ messageMixinApplicationNoConcreteMemberContext;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageMixinApplicationNoConcreteMemberContext =
+ const MessageCode("MixinApplicationNoConcreteMemberContext",
+ severity: Severity.context,
+ problemMessage:
+ r"""This is the super-access that doesn't have a concrete target.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+ Message Function(
+ String
+ name)> templateMixinApplicationNoConcreteMethod = const Template<
+ Message Function(String name)>(
+ problemMessageTemplate:
+ r"""The class doesn't have a concrete implementation of the super-invoked member '#name'.""",
+ withArguments: _withArgumentsMixinApplicationNoConcreteMethod);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)> codeMixinApplicationNoConcreteMethod =
+ const Code<Message Function(String name)>(
+ "MixinApplicationNoConcreteMethod",
+ analyzerCodes: <String>[
+ "MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER"
+ ]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsMixinApplicationNoConcreteMethod(String name) {
+ if (name.isEmpty) throw 'No name provided';
+ name = demangleMixinApplicationName(name);
+ return new Message(codeMixinApplicationNoConcreteMethod,
+ problemMessage:
+ """The class doesn't have a concrete implementation of the super-invoked member '${name}'.""",
+ arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+ Message Function(
+ String
+ name)> templateMixinApplicationNoConcreteSetter = const Template<
+ Message Function(String name)>(
+ problemMessageTemplate:
+ r"""The class doesn't have a concrete implementation of the super-accessed setter '#name'.""",
+ withArguments: _withArgumentsMixinApplicationNoConcreteSetter);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)> codeMixinApplicationNoConcreteSetter =
+ const Code<Message Function(String name)>(
+ "MixinApplicationNoConcreteSetter",
+ analyzerCodes: <String>[
+ "MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER"
+ ]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsMixinApplicationNoConcreteSetter(String name) {
+ if (name.isEmpty) throw 'No name provided';
+ name = demangleMixinApplicationName(name);
+ return new Message(codeMixinApplicationNoConcreteSetter,
+ problemMessage:
+ """The class doesn't have a concrete implementation of the super-accessed setter '${name}'.""",
+ arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Code<Null> codeMixinDeclaresConstructor = messageMixinDeclaresConstructor;
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
diff --git a/pkg/compiler/lib/src/js_model/element_map_impl.dart b/pkg/compiler/lib/src/js_model/element_map_impl.dart
index aa4e6c3..a1a18b5 100644
--- a/pkg/compiler/lib/src/js_model/element_map_impl.dart
+++ b/pkg/compiler/lib/src/js_model/element_map_impl.dart
@@ -772,7 +772,7 @@
//
// so we need get the superclasses from the on-clause, A, B, and C,
// through [superclassConstraints].
- for (ir.Supertype constraint in node.superclassConstraints()) {
+ for (ir.Supertype constraint in node.onClause) {
interfaces.add(processSupertype(constraint));
}
// Set superclass to `Object`.
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index 46cbef3..0fb9528 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -410,7 +410,7 @@
//
// so we need get the superclasses from the on-clause, A, B, and C,
// through [superclassConstraints].
- for (ir.Supertype constraint in node.superclassConstraints()) {
+ for (ir.Supertype constraint in node.onClause) {
interfaces.add(processSupertype(constraint));
}
// Set superclass to `Object`.
diff --git a/pkg/compiler/lib/src/kernel/transformations/clone_mixin_methods_with_super.dart b/pkg/compiler/lib/src/kernel/transformations/clone_mixin_methods_with_super.dart
index abefe2d..c5e1d6a0 100644
--- a/pkg/compiler/lib/src/kernel/transformations/clone_mixin_methods_with_super.dart
+++ b/pkg/compiler/lib/src/kernel/transformations/clone_mixin_methods_with_super.dart
@@ -60,8 +60,10 @@
ensureExistingProcedureMaps();
Procedure? existingGetter = existingNonSetters[field.name];
Procedure? existingSetter = existingSetters[field.name];
- cls.addField(cloneVisitor.cloneField(
- field, null, existingGetter?.reference, existingSetter?.reference));
+ Field clone = cloneVisitor.cloneField(
+ field, null, existingGetter?.reference, existingSetter?.reference);
+ cls.addField(clone);
+ clone.transformerFlags = field.transformerFlags;
if (existingGetter != null) {
cls.procedures.remove(existingGetter);
}
@@ -84,8 +86,10 @@
if (existingProcedure != null) {
cls.procedures.remove(existingProcedure);
}
- cls.addProcedure(cloneVisitor.cloneProcedure(
- procedure, existingProcedure?.reference));
+ Procedure clone = cloneVisitor.cloneProcedure(
+ procedure, existingProcedure?.reference);
+ cls.addProcedure(clone);
+ clone.transformerFlags = procedure.transformerFlags;
continue;
}
}
diff --git a/pkg/compiler/lib/src/kernel/transformations/late_lowering.dart b/pkg/compiler/lib/src/kernel/transformations/late_lowering.dart
index 1cc5b85..11cfe13 100644
--- a/pkg/compiler/lib/src/kernel/transformations/late_lowering.dart
+++ b/pkg/compiler/lib/src/kernel/transformations/late_lowering.dart
@@ -537,6 +537,9 @@
fileUri: fileUri, reference: field.getterReference)
..fileOffset = fileOffset
..isNonNullableByDefault = true;
+ // The initializer is copied from [field] to [getter] so we copy the
+ // transformer flags to reflect whether the getter contains super calls.
+ getter.transformerFlags = field.transformerFlags;
enclosingClass.addProcedure(getter);
VariableDeclaration setterValue = VariableDeclaration('value', type: type)
diff --git a/pkg/dartdev/lib/src/commands/compile.dart b/pkg/dartdev/lib/src/commands/compile.dart
index 0e0d501..288c8d0 100644
--- a/pkg/dartdev/lib/src/commands/compile.dart
+++ b/pkg/dartdev/lib/src/commands/compile.dart
@@ -14,6 +14,7 @@
import '../core.dart';
import '../experiments.dart';
import '../sdk.dart';
+import '../utils.dart';
import '../vm_interop_handler.dart';
const int compileErrorExitCode = 64;
@@ -136,6 +137,16 @@
return msg;
}
+ @override
+ ArgParser createArgParser() {
+ return ArgParser(
+ // Don't parse the training arguments for JIT snapshots, but don't accept
+ // flags after the script name for kernel snapshots.
+ allowTrailingOptions: !isJitSnapshot,
+ usageLineLength: dartdevUsageLineLength,
+ );
+ }
+
bool get isJitSnapshot => commandName == jitSnapshotCmdName;
@override
diff --git a/pkg/dartdev/test/commands/compile_test.dart b/pkg/dartdev/test/commands/compile_test.dart
index 0d497b4..a4e5741 100644
--- a/pkg/dartdev/test/commands/compile_test.dart
+++ b/pkg/dartdev/test/commands/compile_test.dart
@@ -1029,10 +1029,15 @@
outFile,
inFile,
'foo',
+ // Ensure training args aren't parsed by the CLI.
+ // See https://github.com/dart-lang/sdk/issues/49302
+ '-e',
+ '--foobar=bar',
],
);
- expect(result.stdout, predicate((dynamic o) => '$o'.contains('[foo]')));
+ expect(result.stdout,
+ predicate((dynamic o) => '$o'.contains('[foo, -e, --foobar=bar]')));
expect(result.stderr, isEmpty);
expect(result.exitCode, 0);
expect(File(outFile).existsSync(), true,
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index a90af23..3bc7339 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -1397,8 +1397,7 @@
var savedClass = _classEmittingSignatures;
_classEmittingSignatures = c;
- var interfaces = c.implementedTypes.toList()
- ..addAll(c.superclassConstraints());
+ var interfaces = c.implementedTypes.toList()..addAll(c.onClause);
if (interfaces.isNotEmpty) {
body.add(js.statement('#[#] = () => [#];', [
className,
diff --git a/pkg/front_end/lib/src/fasta/kernel/benchmarker.dart b/pkg/front_end/lib/src/fasta/kernel/benchmarker.dart
index b567677..87743e7 100644
--- a/pkg/front_end/lib/src/fasta/kernel/benchmarker.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/benchmarker.dart
@@ -176,6 +176,7 @@
outline_installAllComponentProblems,
body_buildBodies,
+ body_checkMixinSuperAccesses,
body_finishSynthesizedParameters,
body_finishDeferredLoadTearoffs,
body_finishNoSuchMethodForwarders,
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 a489884..101ed7f 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -617,6 +617,9 @@
benchmarker?.enterPhase(BenchmarkPhases.body_buildBodies);
await loader.buildBodies(loader.sourceLibraryBuilders);
+ benchmarker?.enterPhase(BenchmarkPhases.body_checkMixinSuperAccesses);
+ loader.checkMixinSuperAccesses();
+
benchmarker?.enterPhase(BenchmarkPhases.body_finishSynthesizedParameters);
finishSynthesizedParameters();
diff --git a/pkg/front_end/lib/src/fasta/kernel/verifier.dart b/pkg/front_end/lib/src/fasta/kernel/verifier.dart
index acdf960..40f67fa 100644
--- a/pkg/front_end/lib/src/fasta/kernel/verifier.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/verifier.dart
@@ -9,8 +9,6 @@
import 'package:kernel/ast.dart';
import 'package:kernel/target/targets.dart';
-import 'package:kernel/transformations/flags.dart' show TransformerFlag;
-
import 'package:kernel/type_environment.dart' show TypeEnvironment;
import 'package:kernel/verifier.dart'
@@ -170,7 +168,7 @@
if (containingMember == null) {
problem(node, 'Super call outside of any member');
} else {
- if (containingMember.transformerFlags & TransformerFlag.superCalls == 0) {
+ if (!containingMember.containsSuperCalls) {
problem(
node, 'Super call in a member lacking TransformerFlag.superCalls');
}
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 3e629a1..d5bf381 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
@@ -955,7 +955,7 @@
// the declaration's superclass constraints.
InterfaceType supertype = cls.supertype!.asInterfaceType;
Substitution substitution = Substitution.fromSupertype(cls.mixedInType!);
- for (Supertype constraint in cls.mixedInClass!.superclassConstraints()) {
+ for (Supertype constraint in cls.mixedInClass!.onClause) {
InterfaceType requiredInterface =
substitution.substituteSupertype(constraint).asInterfaceType;
InterfaceType? implementedInterface = hierarchy.getTypeAsInstanceOf(
diff --git a/pkg/front_end/lib/src/fasta/source/source_field_builder.dart b/pkg/front_end/lib/src/fasta/source/source_field_builder.dart
index 2460d6f..00682eb 100644
--- a/pkg/front_end/lib/src/fasta/source/source_field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_field_builder.dart
@@ -392,8 +392,6 @@
ClassHierarchy classHierarchy,
List<DelayedActionPerformer> delayedActionPerformers,
List<DelayedDefaultValueCloner> delayedDefaultValueCloners) {
- _fieldEncoding.completeSignature(classHierarchy.coreTypes);
-
for (Annotatable annotatable in _fieldEncoding.annotatables) {
MetadataBuilder.buildAnnotations(
annotatable,
@@ -593,10 +591,6 @@
/// Returns a list of the setters created by this field encoding.
List<ClassMember> getLocalSetters(SourceFieldBuilder fieldBuilder);
- /// Ensures that the signatures all members created by this field encoding
- /// are fully typed.
- void completeSignature(CoreTypes coreTypes);
-
/// Returns `true` if this encoding is a late lowering.
bool get isLateLowering;
}
@@ -658,9 +652,6 @@
}
@override
- void completeSignature(CoreTypes coreTypes) {}
-
- @override
void createBodies(CoreTypes coreTypes, Expression? initializer) {
if (initializer != null) {
_field.initializer = initializer..parent = _field;
@@ -900,11 +891,6 @@
}
@override
- void completeSignature(CoreTypes coreTypes) {
- _lateIsSetField?.type = coreTypes.boolRawType(Nullability.nonNullable);
- }
-
- @override
void createBodies(CoreTypes coreTypes, Expression? initializer) {
assert(_type != null, "Type has not been computed for field $name.");
if (isSetEncoding == late_lowering.IsSetEncoding.useSentinel) {
@@ -924,6 +910,10 @@
}
_lateGetter.function.body = _createGetterBody(coreTypes, name, initializer)
..parent = _lateGetter.function;
+ // The initializer is copied from [_field] to [_lateGetter] so we copy the
+ // transformer flags to reflect whether the getter contains super calls.
+ _lateGetter.transformerFlags = _field.transformerFlags;
+
if (_lateSetter != null) {
_lateSetter!.function.body = _createSetterBody(
coreTypes, name, _lateSetter!.function.positionalParameters.first)
@@ -1099,7 +1089,9 @@
_lateIsSetField!
..isStatic = !isInstanceMember
..isStatic = _field.isStatic
- ..isExtensionMember = isExtensionMember;
+ ..isExtensionMember = isExtensionMember
+ ..type = libraryBuilder.loader
+ .createCoreType('bool', Nullability.nonNullable);
updatePrivateMemberName(_lateIsSetField!, libraryBuilder);
}
_lateGetter
@@ -1722,9 +1714,6 @@
}
@override
- void completeSignature(CoreTypes coreTypes) {}
-
- @override
void createBodies(CoreTypes coreTypes, Expression? initializer) {
//assert(initializer != 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 f7c0b5c..934983c 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
@@ -1300,6 +1300,7 @@
.addAll(part.library.problemsAsJson!);
}
part.collectInferableTypes(_inferableTypes!);
+ part.takeMixinApplications(_mixinApplications!);
if (library != part.library) {
// Mark the part library as synthetic as it's not an actual library
// (anymore).
@@ -1863,12 +1864,12 @@
if (declaration.declaresConstConstructor) {
modifiers |= declaresConstConstructorMask;
}
- ClassBuilder classBuilder = new SourceClassBuilder(
+ SourceClassBuilder classBuilder = new SourceClassBuilder(
metadata,
modifiers,
className,
typeVariables,
- applyMixins(supertype, mixins, startOffset, nameOffset, endOffset,
+ _applyMixins(supertype, mixins, startOffset, nameOffset, endOffset,
className, isMixinDeclaration,
typeVariables: typeVariables,
isMacro: false,
@@ -2137,7 +2138,7 @@
getterReference: referenceFrom?.reference);
}
- TypeBuilder? applyMixins(
+ TypeBuilder? _applyMixins(
TypeBuilder? supertype,
MixinApplicationBuilder? mixinApplications,
int startCharOffset,
@@ -2397,6 +2398,7 @@
applicationTypeArguments, charOffset,
instanceTypeVariableAccess:
InstanceTypeVariableAccessState.Allowed);
+ registerMixinApplication(application, mixin);
}
return supertype;
} else {
@@ -2404,6 +2406,34 @@
}
}
+ Map<SourceClassBuilder, TypeBuilder>? _mixinApplications = {};
+
+ /// Registers that [mixinApplication] is a mixin application introduced by
+ /// the [mixedInType] in a with-clause.
+ ///
+ /// This is used to check that super access in mixin declarations have a
+ /// concrete target.
+ void registerMixinApplication(
+ SourceClassBuilder mixinApplication, TypeBuilder mixedInType) {
+ assert(
+ _mixinApplications != null, "Late registration of mixin application.");
+ _mixinApplications![mixinApplication] = mixedInType;
+ }
+
+ void takeMixinApplications(
+ Map<SourceClassBuilder, TypeBuilder> mixinApplications) {
+ assert(_mixinApplications != null,
+ "Mixin applications have already been processed.");
+ mixinApplications.addAll(_mixinApplications!);
+ _mixinApplications = null;
+ Iterable<SourceLibraryBuilder>? patchLibraries = this.patchLibraries;
+ if (patchLibraries != null) {
+ for (SourceLibraryBuilder patchLibrary in patchLibraries) {
+ patchLibrary.takeMixinApplications(mixinApplications);
+ }
+ }
+ }
+
void addNamedMixinApplication(
List<MetadataBuilder>? metadata,
String name,
@@ -2420,7 +2450,7 @@
// Nested declaration began in `OutlineBuilder.beginNamedMixinApplication`.
endNestedDeclaration(TypeParameterScopeKind.namedMixinApplication, name)
.resolveNamedTypes(typeVariables, this);
- supertype = applyMixins(supertype, mixinApplication, startCharOffset,
+ supertype = _applyMixins(supertype, mixinApplication, startCharOffset,
charOffset, charEndOffset, name, false,
metadata: metadata,
name: name,
@@ -2876,7 +2906,7 @@
metadata,
name,
typeVariables,
- applyMixins(
+ _applyMixins(
loader.target.underscoreEnumType,
supertypeBuilder,
startCharOffset,
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 9f3e6da..d3b47de 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -69,6 +69,7 @@
import '../kernel/hierarchy/class_member.dart';
import '../kernel/hierarchy/delayed.dart';
import '../kernel/hierarchy/hierarchy_builder.dart';
+import '../kernel/hierarchy/hierarchy_node.dart';
import '../kernel/hierarchy/members_builder.dart';
import '../kernel/kernel_helper.dart'
show DelayedDefaultValueCloner, TypeDependency;
@@ -2099,6 +2100,18 @@
void ignoreAmbiguousSupertypes(Class cls, Supertype a, Supertype b) {}
+ /// Creates an [InterfaceType] for the `dart:core` type by the given [name].
+ ///
+ /// This method can be called before [coreTypes] has been computed and only
+ /// required [coreLibrary] to have been set.
+ InterfaceType createCoreType(String name, Nullability nullability,
+ [List<DartType>? typeArguments]) {
+ assert(_coreLibrary != null, "Core library has not been computed yet.");
+ ClassBuilder classBuilder =
+ coreLibrary.lookupLocalMember(name, required: true) as ClassBuilder;
+ return new InterfaceType(classBuilder.cls, nullability, typeArguments);
+ }
+
void computeCoreTypes(Component component) {
assert(_coreTypes == null, "CoreTypes has already been computed");
_coreTypes = new CoreTypes(component);
@@ -2230,7 +2243,7 @@
void checkMixins(List<SourceClassBuilder> sourceClasses) {
for (SourceClassBuilder builder in sourceClasses) {
- if (builder.libraryBuilder.loader == this && !builder.isPatch) {
+ if (!builder.isPatch) {
Class? mixedInClass = builder.cls.mixedInClass;
if (mixedInClass != null && mixedInClass.isMixinDeclaration) {
builder.checkMixinApplication(hierarchy, coreTypes);
@@ -2240,6 +2253,54 @@
ticker.logMs("Checked mixin declaration applications");
}
+ /// Checks that super member access from mixin declarations mixed into
+ /// the classes in the [sourceLibraryBuilders] have a concrete target
+ // TODO(johnniwinther): Make this work for when the mixin declaration is from
+ // an outline library.
+ void checkMixinSuperAccesses() {
+ _SuperMemberCache superMemberCache = new _SuperMemberCache();
+ for (SourceLibraryBuilder libraryBuilder in sourceLibraryBuilders) {
+ Map<SourceClassBuilder, TypeBuilder> mixinApplications = {};
+ libraryBuilder.takeMixinApplications(mixinApplications);
+ for (MapEntry<SourceClassBuilder, TypeBuilder> entry
+ in mixinApplications.entries) {
+ SourceClassBuilder mixinApplication = entry.key;
+ if (!mixinApplication.isPatch) {
+ ClassHierarchyNode node =
+ hierarchyBuilder.getNodeFromClassBuilder(mixinApplication);
+ ClassHierarchyNode? mixedInNode = node.mixedInNode;
+ if (mixedInNode != null) {
+ Class mixedInClass = mixedInNode.classBuilder.cls;
+ List<Supertype> onClause = mixedInClass.onClause;
+ if (onClause.isNotEmpty) {
+ for (Procedure procedure in mixedInClass.procedures) {
+ if (procedure.containsSuperCalls) {
+ procedure.function.body?.accept(new _CheckSuperAccess(
+ libraryBuilder,
+ mixinApplication.cls,
+ entry.value,
+ procedure,
+ superMemberCache));
+ }
+ }
+ for (Field field in mixedInClass.fields) {
+ if (field.containsSuperCalls) {
+ field.initializer?.accept(new _CheckSuperAccess(
+ libraryBuilder,
+ mixinApplication.cls,
+ entry.value,
+ field,
+ superMemberCache));
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ ticker.logMs("Checked mixin application super-accesses");
+ }
+
void buildOutlineExpressions(ClassHierarchy classHierarchy,
List<DelayedDefaultValueCloner> delayedDefaultValueCloners) {
List<DelayedActionPerformer> delayedActionPerformers =
@@ -2849,3 +2910,118 @@
return _supertypeMap[vertex] ??= computeSuperClasses(vertex);
}
}
+
+/// Visitor that checks that super accesses have a concrete target.
+// TODO(johnniwinther): Update this to perform member cloning when needed by
+// the backend.
+class _CheckSuperAccess extends RecursiveVisitor {
+ final SourceLibraryBuilder _sourceLibraryBuilder;
+ final Class _mixinApplicationClass;
+ final TypeBuilder _typeBuilder;
+ final Member _enclosingMember;
+ final _SuperMemberCache cache;
+
+ _CheckSuperAccess(this._sourceLibraryBuilder, this._mixinApplicationClass,
+ this._typeBuilder, this._enclosingMember, this.cache);
+
+ void _checkMember(Name name,
+ {required Template<Message Function(String name)> template,
+ required bool isSetter,
+ required int accessFileOffset}) {
+ Member? member = cache.findSuperMember(
+ _mixinApplicationClass.superclass, name,
+ isSetter: isSetter);
+ if (member == null) {
+ _sourceLibraryBuilder.addProblem(template.withArguments(name.text),
+ _typeBuilder.charOffset!, noLength, _typeBuilder.fileUri!,
+ context: [
+ messageMixinApplicationNoConcreteMemberContext.withLocation(
+ _enclosingMember.fileUri, accessFileOffset, noLength)
+ ]);
+ }
+ }
+
+ @override
+ void visitSuperMethodInvocation(SuperMethodInvocation node) {
+ super.visitSuperMethodInvocation(node);
+ _checkMember(node.interfaceTarget.name,
+ isSetter: false,
+ template: templateMixinApplicationNoConcreteMethod,
+ accessFileOffset: node.fileOffset);
+ }
+
+ @override
+ void visitSuperPropertyGet(SuperPropertyGet node) {
+ super.visitSuperPropertyGet(node);
+ _checkMember(node.interfaceTarget.name,
+ isSetter: false,
+ template: templateMixinApplicationNoConcreteGetter,
+ accessFileOffset: node.fileOffset);
+ }
+
+ @override
+ void visitSuperPropertySet(SuperPropertySet node) {
+ super.visitSuperPropertySet(node);
+ _checkMember(node.interfaceTarget.name,
+ isSetter: true,
+ template: templateMixinApplicationNoConcreteSetter,
+ accessFileOffset: node.fileOffset);
+ }
+}
+
+/// Cache of concrete members, used by [_CheckSuperAccess] to check that super
+/// accesses have a concrete target.
+class _SuperMemberCache {
+ Map<Class, Map<Name, Member>> _getterMaps = {};
+ Map<Class, Map<Name, Member>> _setterMaps = {};
+
+ Map<Name, Member> _computeGetters(Class cls) {
+ Map<Name, Member> cache = {};
+ for (Procedure procedure in cls.procedures) {
+ if (procedure.kind != ProcedureKind.Setter && !procedure.isAbstract) {
+ cache[procedure.name] = procedure;
+ }
+ }
+ for (Field field in cls.fields) {
+ cache[field.name] = field;
+ }
+ return cache;
+ }
+
+ Map<Name, Member> _computeSetters(Class cls) {
+ Map<Name, Member> cache = {};
+ for (Procedure procedure in cls.procedures) {
+ if (procedure.kind == ProcedureKind.Setter && !procedure.isAbstract) {
+ cache[procedure.name] = procedure;
+ }
+ }
+ for (Field field in cls.fields) {
+ if (field.hasSetter) {
+ cache[field.name] = field;
+ }
+ }
+ return cache;
+ }
+
+ Map<Name, Member> _getConcreteMembers(Class cls, {required bool isSetter}) {
+ if (isSetter) {
+ return _setterMaps[cls] ??= _computeSetters(cls);
+ } else {
+ return _getterMaps[cls] ??= _computeGetters(cls);
+ }
+ }
+
+ Member? findSuperMember(Class? superClass, Name name,
+ {required bool isSetter}) {
+ while (superClass != null) {
+ Map<Name, Member> cache =
+ _getConcreteMembers(superClass, isSetter: isSetter);
+ Member? member = cache[name];
+ if (member != null) {
+ return member;
+ }
+ superClass = superClass.superclass;
+ }
+ return null;
+ }
+}
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 5c0668e..5b1af01 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -5612,3 +5612,52 @@
class Base {}
class Mixin extends Base {}
class C extends Base with Mixin {}
+
+MixinApplicationNoConcreteMethod:
+ problemMessage: "The class doesn't have a concrete implementation of the super-invoked member '#name'."
+ analyzerCode: MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER
+ script: |
+ class Super {
+ void method() {}
+ }
+ mixin Mixin on Super {
+ void method() {
+ super.method();
+ }
+ }
+ abstract class AbstractSuper implements Super {}
+ class Class extends AbstractSuper with Mixin {}
+
+MixinApplicationNoConcreteGetter:
+ problemMessage: "The class doesn't have a concrete implementation of the super-accessed member '#name'."
+ analyzerCode: MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER
+ script: |
+ class Super {
+ int get getter => 42;
+ }
+ mixin Mixin on Super {
+ int get getter {
+ return super.getter;
+ }
+ }
+ abstract class AbstractSuper implements Super {}
+ class Class extends AbstractSuper with Mixin {}
+
+MixinApplicationNoConcreteSetter:
+ problemMessage: "The class doesn't have a concrete implementation of the super-accessed setter '#name'."
+ analyzerCode: MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER
+ script: |
+ class Super {
+ void set setter(int value) {}
+ }
+ mixin Mixin on Super {
+ void set setter(int value) {
+ super.setter = value;
+ }
+ }
+ abstract class AbstractSuper implements Super {}
+ class Class extends AbstractSuper with Mixin {}
+
+MixinApplicationNoConcreteMemberContext:
+ problemMessage: "This is the super-access that doesn't have a concrete target."
+ severity: CONTEXT
diff --git a/pkg/front_end/testcases/dart2js/mixin_super/main.dart b/pkg/front_end/testcases/dart2js/mixin_super/main.dart
new file mode 100644
index 0000000..1c32e50
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/mixin_super/main.dart
@@ -0,0 +1,59 @@
+// 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.
+
+import 'main_lib.dart';
+
+mixin Mixin1 on Super1, Super2 {
+ late int field1 = () {
+ return super.field1 = super.field1 + 1;
+ }();
+
+ late int field2 = () {
+ return 88;
+ }();
+
+ void method1() {
+ super.method1();
+ }
+
+ void method2() {}
+
+ int get property1 {
+ return super.property1;
+ }
+
+ void set property1(int value) {
+ super.property1 = value;
+ }
+
+ int get property2 {
+ return 42;
+ }
+
+ void set property2(int value) {}
+}
+
+abstract class Class1a extends Super1 implements Super2 {}
+
+class Class1b extends Class1a with Mixin1 /* Ok */ {}
+
+abstract class Class2a extends Super2 implements Super1 {}
+
+class Class2b extends Class2a with Mixin1 /* Error */ {}
+
+abstract class Class3a implements Super1, Super2 {}
+
+class Class3b extends Class3a with Mixin1 /* Error */ {}
+
+abstract class Class4a extends Super1 implements Super2 {}
+
+class Class4b extends Class4a with Mixin2 /* Ok */ {}
+
+abstract class Class5a extends Super2 implements Super1 {}
+
+class Class5b extends Class5a with Mixin2 /* Error */ {}
+
+abstract class Class6a implements Super1, Super2 {}
+
+class Class6b extends Class6a with Mixin2 /* Error */ {}
diff --git a/pkg/front_end/testcases/dart2js/mixin_super/main.dart.strong.expect b/pkg/front_end/testcases/dart2js/mixin_super/main.dart.strong.expect
new file mode 100644
index 0000000..1fb218a
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/mixin_super/main.dart.strong.expect
@@ -0,0 +1,492 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:17:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:23:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:9:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:9:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:17:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:23:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:9:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:9:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:33:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:37:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:19:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:19:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:33:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:37:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:19:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:19:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+import self as self;
+import "dart:core" as core;
+import "main_lib.dart" as mai;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+abstract class _Mixin1&Super1&Super2 extends core::Object implements mai::Super1, mai::Super2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Mixin1&Super1&Super2
+ : super core::Object::•()
+ ;
+}
+abstract class Mixin1 extends self::_Mixin1&Super1&Super2 /*isMixinDeclaration*/ {
+ late field core::int field1 = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int};
+ late field core::int field2 = (() → core::int {
+ return 88;
+ })(){() → core::int};
+ method method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ method method2() → void {}
+ get property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ set property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ get property2() → core::int {
+ return 42;
+ }
+ set property2(core::int value) → void {}
+}
+abstract class Class1a extends mai::Super1 implements mai::Super2 {
+ synthetic constructor •() → self::Class1a
+ : super mai::Super1::•()
+ ;
+}
+abstract class _Class1b&Class1a&Mixin1 = self::Class1a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class1b&Class1a&Mixin1
+ : super self::Class1a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{self::Mixin1::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{self::Mixin1::field2} = value;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class1b extends self::_Class1b&Class1a&Mixin1 {
+ synthetic constructor •() → self::Class1b
+ : super self::_Class1b&Class1a&Mixin1::•()
+ ;
+ static method _#new#tearOff() → self::Class1b
+ return new self::Class1b::•();
+}
+abstract class Class2a extends mai::Super2 implements mai::Super1 {
+ synthetic constructor •() → self::Class2a
+ : super mai::Super2::•()
+ ;
+}
+abstract class _Class2b&Class2a&Mixin1 = self::Class2a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class2b&Class2a&Mixin1
+ : super self::Class2a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{self::Mixin1::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{self::Mixin1::field2} = value;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class2b extends self::_Class2b&Class2a&Mixin1 {
+ synthetic constructor •() → self::Class2b
+ : super self::_Class2b&Class2a&Mixin1::•()
+ ;
+ static method _#new#tearOff() → self::Class2b
+ return new self::Class2b::•();
+}
+abstract class Class3a extends core::Object implements mai::Super1, mai::Super2 {
+ synthetic constructor •() → self::Class3a
+ : super core::Object::•()
+ ;
+}
+abstract class _Class3b&Class3a&Mixin1 = self::Class3a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class3b&Class3a&Mixin1
+ : super self::Class3a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{self::Mixin1::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{self::Mixin1::field2} = value;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class3b extends self::_Class3b&Class3a&Mixin1 {
+ synthetic constructor •() → self::Class3b
+ : super self::_Class3b&Class3a&Mixin1::•()
+ ;
+ static method _#new#tearOff() → self::Class3b
+ return new self::Class3b::•();
+}
+abstract class Class4a extends mai::Super1 implements mai::Super2 {
+ synthetic constructor •() → self::Class4a
+ : super mai::Super1::•()
+ ;
+}
+abstract class _Class4b&Class4a&Mixin2 = self::Class4a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class4b&Class4a&Mixin2
+ : super self::Class4a::•()
+ ;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{mai::Mixin2::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{mai::Mixin2::field2} = value;
+ mixin-super-stub get _#Mixin2#field1#AI() → core::int
+ return super.{mai::Mixin2::_#Mixin2#field1#AI};
+ mixin-super-stub set _#Mixin2#field1#AI(core::int value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1#AI} = value;
+ mixin-super-stub get _#Mixin2#field2#AI() → core::int
+ return super.{mai::Mixin2::_#Mixin2#field2#AI};
+ mixin-super-stub set _#Mixin2#field2#AI(core::int value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2#AI} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class4b extends self::_Class4b&Class4a&Mixin2 {
+ synthetic constructor •() → self::Class4b
+ : super self::_Class4b&Class4a&Mixin2::•()
+ ;
+ static method _#new#tearOff() → self::Class4b
+ return new self::Class4b::•();
+}
+abstract class Class5a extends mai::Super2 implements mai::Super1 {
+ synthetic constructor •() → self::Class5a
+ : super mai::Super2::•()
+ ;
+}
+abstract class _Class5b&Class5a&Mixin2 = self::Class5a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class5b&Class5a&Mixin2
+ : super self::Class5a::•()
+ ;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{mai::Mixin2::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{mai::Mixin2::field2} = value;
+ mixin-super-stub get _#Mixin2#field1#AI() → core::int
+ return super.{mai::Mixin2::_#Mixin2#field1#AI};
+ mixin-super-stub set _#Mixin2#field1#AI(core::int value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1#AI} = value;
+ mixin-super-stub get _#Mixin2#field2#AI() → core::int
+ return super.{mai::Mixin2::_#Mixin2#field2#AI};
+ mixin-super-stub set _#Mixin2#field2#AI(core::int value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2#AI} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class5b extends self::_Class5b&Class5a&Mixin2 {
+ synthetic constructor •() → self::Class5b
+ : super self::_Class5b&Class5a&Mixin2::•()
+ ;
+ static method _#new#tearOff() → self::Class5b
+ return new self::Class5b::•();
+}
+abstract class Class6a extends core::Object implements mai::Super1, mai::Super2 {
+ synthetic constructor •() → self::Class6a
+ : super core::Object::•()
+ ;
+}
+abstract class _Class6b&Class6a&Mixin2 = self::Class6a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class6b&Class6a&Mixin2
+ : super self::Class6a::•()
+ ;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{mai::Mixin2::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{mai::Mixin2::field2} = value;
+ mixin-super-stub get _#Mixin2#field1#AI() → core::int
+ return super.{mai::Mixin2::_#Mixin2#field1#AI};
+ mixin-super-stub set _#Mixin2#field1#AI(core::int value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1#AI} = value;
+ mixin-super-stub get _#Mixin2#field2#AI() → core::int
+ return super.{mai::Mixin2::_#Mixin2#field2#AI};
+ mixin-super-stub set _#Mixin2#field2#AI(core::int value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2#AI} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class6b extends self::_Class6b&Class6a&Mixin2 {
+ synthetic constructor •() → self::Class6b
+ : super self::_Class6b&Class6a&Mixin2::•()
+ ;
+ static method _#new#tearOff() → self::Class6b
+ return new self::Class6b::•();
+}
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class Super1 extends core::Object {
+ field core::int field1 = 42;
+ field core::int property1 = 42;
+ synthetic constructor •() → mai::Super1
+ : super core::Object::•()
+ ;
+ method method1() → void {}
+ static method _#new#tearOff() → mai::Super1
+ return new mai::Super1::•();
+}
+class Super2 extends core::Object {
+ field core::int field2 = 87;
+ field core::int property2 = 87;
+ synthetic constructor •() → mai::Super2
+ : super core::Object::•()
+ ;
+ method method2() → void {}
+ static method _#new#tearOff() → mai::Super2
+ return new mai::Super2::•();
+}
+abstract class _Mixin2&Super1&Super2 extends core::Object implements mai::Super1, mai::Super2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → mai::_Mixin2&Super1&Super2
+ : super core::Object::•()
+ ;
+}
+abstract class Mixin2 extends mai::_Mixin2&Super1&Super2 /*isMixinDeclaration*/ {
+ field core::int _#Mixin2#field1#AI = _in::createSentinel<core::int>();
+ field core::int _#Mixin2#field2#AI = _in::createSentinel<core::int>();
+ method method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ method method2() → void {}
+ get property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ set property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ get property2() → core::int {
+ return 42;
+ }
+ set property2(core::int value) → void {}
+ get field1() → core::int {
+ core::int value = this.{mai::Mixin2::_#Mixin2#field1#AI}{core::int};
+ if(_in::isSentinel(value))
+ value = this.{mai::Mixin2::_#Mixin2#field1#AI} = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int};
+ return value;
+ }
+ set field1(core::int value) → void
+ this.{mai::Mixin2::_#Mixin2#field1#AI} = value;
+ get field2() → core::int {
+ core::int value = this.{mai::Mixin2::_#Mixin2#field2#AI}{core::int};
+ if(_in::isSentinel(value))
+ value = this.{mai::Mixin2::_#Mixin2#field2#AI} = (() → core::int {
+ return 88;
+ })(){() → core::int};
+ return value;
+ }
+ set field2(core::int value) → void
+ this.{mai::Mixin2::_#Mixin2#field2#AI} = value;
+}
diff --git a/pkg/front_end/testcases/dart2js/mixin_super/main.dart.strong.transformed.expect b/pkg/front_end/testcases/dart2js/mixin_super/main.dart.strong.transformed.expect
new file mode 100644
index 0000000..9f8984c
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/mixin_super/main.dart.strong.transformed.expect
@@ -0,0 +1,563 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:17:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:23:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:9:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:9:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:17:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:23:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:9:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:9:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:33:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:37:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:19:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:19:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:33:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:37:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:19:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:19:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+import self as self;
+import "dart:core" as core;
+import "main_lib.dart" as mai;
+import "dart:_internal" as _in;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+abstract class _Mixin1&Super1&Super2 extends core::Object implements mai::Super1, mai::Super2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Mixin1&Super1&Super2
+ : super core::Object::•()
+ ;
+}
+abstract class Mixin1 extends self::_Mixin1&Super1&Super2 /*isMixinDeclaration*/ {
+ field core::int _#Mixin1#field1#AI = _in::createSentinel<core::int>();
+ field core::int _#Mixin1#field2#AI = _in::createSentinel<core::int>();
+ method method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ method method2() → void {}
+ get property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ set property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ get property2() → core::int {
+ return 42;
+ }
+ set property2(core::int value) → void {}
+ get field1() → core::int {
+ core::int value = this.{self::Mixin1::_#Mixin1#field1#AI}{core::int};
+ if(_in::isSentinel(value))
+ value = this.{self::Mixin1::_#Mixin1#field1#AI} = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int};
+ return value;
+ }
+ set field1(core::int value) → void
+ this.{self::Mixin1::_#Mixin1#field1#AI} = value;
+ get field2() → core::int {
+ core::int value = this.{self::Mixin1::_#Mixin1#field2#AI}{core::int};
+ if(_in::isSentinel(value))
+ value = this.{self::Mixin1::_#Mixin1#field2#AI} = (() → core::int {
+ return 88;
+ })(){() → core::int};
+ return value;
+ }
+ set field2(core::int value) → void
+ this.{self::Mixin1::_#Mixin1#field2#AI} = value;
+}
+abstract class Class1a extends mai::Super1 implements mai::Super2 {
+ synthetic constructor •() → self::Class1a
+ : super mai::Super1::•()
+ ;
+}
+abstract class _Class1b&Class1a&Mixin1 = self::Class1a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class1b&Class1a&Mixin1
+ : super self::Class1a::•()
+ ;
+ mixin-super-stub set field1(core::int value) → void
+ return super.{self::Mixin1::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{self::Mixin1::field2} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+ method method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ get property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ set property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ get field1() → core::int {
+ core::int value = this.{self::Mixin1::_#Mixin1#field1#AI}{core::int};
+ if(_in::isSentinel(value))
+ value = this.{self::Mixin1::_#Mixin1#field1#AI} = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int};
+ return value;
+ }
+}
+class Class1b extends self::_Class1b&Class1a&Mixin1 {
+ synthetic constructor •() → self::Class1b
+ : super self::_Class1b&Class1a&Mixin1::•()
+ ;
+ static method _#new#tearOff() → self::Class1b
+ return new self::Class1b::•();
+}
+abstract class Class2a extends mai::Super2 implements mai::Super1 {
+ synthetic constructor •() → self::Class2a
+ : super mai::Super2::•()
+ ;
+}
+abstract class _Class2b&Class2a&Mixin1 = self::Class2a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class2b&Class2a&Mixin1
+ : super self::Class2a::•()
+ ;
+ mixin-super-stub set field1(core::int value) → void
+ return super.{self::Mixin1::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{self::Mixin1::field2} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+ method method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ get property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ set property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ get field1() → core::int {
+ core::int value = this.{self::Mixin1::_#Mixin1#field1#AI}{core::int};
+ if(_in::isSentinel(value))
+ value = this.{self::Mixin1::_#Mixin1#field1#AI} = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int};
+ return value;
+ }
+}
+class Class2b extends self::_Class2b&Class2a&Mixin1 {
+ synthetic constructor •() → self::Class2b
+ : super self::_Class2b&Class2a&Mixin1::•()
+ ;
+ static method _#new#tearOff() → self::Class2b
+ return new self::Class2b::•();
+}
+abstract class Class3a extends core::Object implements mai::Super1, mai::Super2 {
+ synthetic constructor •() → self::Class3a
+ : super core::Object::•()
+ ;
+}
+abstract class _Class3b&Class3a&Mixin1 = self::Class3a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class3b&Class3a&Mixin1
+ : super self::Class3a::•()
+ ;
+ mixin-super-stub set field1(core::int value) → void
+ return super.{self::Mixin1::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{self::Mixin1::field2} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+ method method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ get property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ set property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ get field1() → core::int {
+ core::int value = this.{self::Mixin1::_#Mixin1#field1#AI}{core::int};
+ if(_in::isSentinel(value))
+ value = this.{self::Mixin1::_#Mixin1#field1#AI} = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int};
+ return value;
+ }
+}
+class Class3b extends self::_Class3b&Class3a&Mixin1 {
+ synthetic constructor •() → self::Class3b
+ : super self::_Class3b&Class3a&Mixin1::•()
+ ;
+ static method _#new#tearOff() → self::Class3b
+ return new self::Class3b::•();
+}
+abstract class Class4a extends mai::Super1 implements mai::Super2 {
+ synthetic constructor •() → self::Class4a
+ : super mai::Super1::•()
+ ;
+}
+abstract class _Class4b&Class4a&Mixin2 = self::Class4a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class4b&Class4a&Mixin2
+ : super self::Class4a::•()
+ ;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub set field1(core::int value) → void
+ return super.{mai::Mixin2::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{mai::Mixin2::field2} = value;
+ mixin-super-stub get _#Mixin2#field1#AI() → core::int
+ return super.{mai::Mixin2::_#Mixin2#field1#AI};
+ mixin-super-stub set _#Mixin2#field1#AI(core::int value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1#AI} = value;
+ mixin-super-stub get _#Mixin2#field2#AI() → core::int
+ return super.{mai::Mixin2::_#Mixin2#field2#AI};
+ mixin-super-stub set _#Mixin2#field2#AI(core::int value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2#AI} = value;
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+ method /* from org-dartlang-testcase:///main_lib.dart */ method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ get /* from org-dartlang-testcase:///main_lib.dart */ property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ set /* from org-dartlang-testcase:///main_lib.dart */ property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ get /* from org-dartlang-testcase:///main_lib.dart */ field1() → core::int {
+ core::int value = this.{mai::Mixin2::_#Mixin2#field1#AI}{core::int};
+ if(_in::isSentinel(value))
+ value = this.{mai::Mixin2::_#Mixin2#field1#AI} = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int};
+ return value;
+ }
+}
+class Class4b extends self::_Class4b&Class4a&Mixin2 {
+ synthetic constructor •() → self::Class4b
+ : super self::_Class4b&Class4a&Mixin2::•()
+ ;
+ static method _#new#tearOff() → self::Class4b
+ return new self::Class4b::•();
+}
+abstract class Class5a extends mai::Super2 implements mai::Super1 {
+ synthetic constructor •() → self::Class5a
+ : super mai::Super2::•()
+ ;
+}
+abstract class _Class5b&Class5a&Mixin2 = self::Class5a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class5b&Class5a&Mixin2
+ : super self::Class5a::•()
+ ;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub set field1(core::int value) → void
+ return super.{mai::Mixin2::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{mai::Mixin2::field2} = value;
+ mixin-super-stub get _#Mixin2#field1#AI() → core::int
+ return super.{mai::Mixin2::_#Mixin2#field1#AI};
+ mixin-super-stub set _#Mixin2#field1#AI(core::int value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1#AI} = value;
+ mixin-super-stub get _#Mixin2#field2#AI() → core::int
+ return super.{mai::Mixin2::_#Mixin2#field2#AI};
+ mixin-super-stub set _#Mixin2#field2#AI(core::int value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2#AI} = value;
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+ method /* from org-dartlang-testcase:///main_lib.dart */ method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ get /* from org-dartlang-testcase:///main_lib.dart */ property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ set /* from org-dartlang-testcase:///main_lib.dart */ property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ get /* from org-dartlang-testcase:///main_lib.dart */ field1() → core::int {
+ core::int value = this.{mai::Mixin2::_#Mixin2#field1#AI}{core::int};
+ if(_in::isSentinel(value))
+ value = this.{mai::Mixin2::_#Mixin2#field1#AI} = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int};
+ return value;
+ }
+}
+class Class5b extends self::_Class5b&Class5a&Mixin2 {
+ synthetic constructor •() → self::Class5b
+ : super self::_Class5b&Class5a&Mixin2::•()
+ ;
+ static method _#new#tearOff() → self::Class5b
+ return new self::Class5b::•();
+}
+abstract class Class6a extends core::Object implements mai::Super1, mai::Super2 {
+ synthetic constructor •() → self::Class6a
+ : super core::Object::•()
+ ;
+}
+abstract class _Class6b&Class6a&Mixin2 = self::Class6a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class6b&Class6a&Mixin2
+ : super self::Class6a::•()
+ ;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub set field1(core::int value) → void
+ return super.{mai::Mixin2::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{mai::Mixin2::field2} = value;
+ mixin-super-stub get _#Mixin2#field1#AI() → core::int
+ return super.{mai::Mixin2::_#Mixin2#field1#AI};
+ mixin-super-stub set _#Mixin2#field1#AI(core::int value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1#AI} = value;
+ mixin-super-stub get _#Mixin2#field2#AI() → core::int
+ return super.{mai::Mixin2::_#Mixin2#field2#AI};
+ mixin-super-stub set _#Mixin2#field2#AI(core::int value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2#AI} = value;
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+ method /* from org-dartlang-testcase:///main_lib.dart */ method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ get /* from org-dartlang-testcase:///main_lib.dart */ property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ set /* from org-dartlang-testcase:///main_lib.dart */ property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ get /* from org-dartlang-testcase:///main_lib.dart */ field1() → core::int {
+ core::int value = this.{mai::Mixin2::_#Mixin2#field1#AI}{core::int};
+ if(_in::isSentinel(value))
+ value = this.{mai::Mixin2::_#Mixin2#field1#AI} = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int};
+ return value;
+ }
+}
+class Class6b extends self::_Class6b&Class6a&Mixin2 {
+ synthetic constructor •() → self::Class6b
+ : super self::_Class6b&Class6a&Mixin2::•()
+ ;
+ static method _#new#tearOff() → self::Class6b
+ return new self::Class6b::•();
+}
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class Super1 extends core::Object {
+ field core::int field1 = 42;
+ field core::int property1 = 42;
+ synthetic constructor •() → mai::Super1
+ : super core::Object::•()
+ ;
+ method method1() → void {}
+ static method _#new#tearOff() → mai::Super1
+ return new mai::Super1::•();
+}
+class Super2 extends core::Object {
+ field core::int field2 = 87;
+ field core::int property2 = 87;
+ synthetic constructor •() → mai::Super2
+ : super core::Object::•()
+ ;
+ method method2() → void {}
+ static method _#new#tearOff() → mai::Super2
+ return new mai::Super2::•();
+}
+abstract class _Mixin2&Super1&Super2 extends core::Object implements mai::Super1, mai::Super2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → mai::_Mixin2&Super1&Super2
+ : super core::Object::•()
+ ;
+}
+abstract class Mixin2 extends mai::_Mixin2&Super1&Super2 /*isMixinDeclaration*/ {
+ field core::int _#Mixin2#field1#AI = _in::createSentinel<core::int>();
+ field core::int _#Mixin2#field2#AI = _in::createSentinel<core::int>();
+ method method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ method method2() → void {}
+ get property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ set property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ get property2() → core::int {
+ return 42;
+ }
+ set property2(core::int value) → void {}
+ get field1() → core::int {
+ core::int value = this.{mai::Mixin2::_#Mixin2#field1#AI}{core::int};
+ if(_in::isSentinel(value))
+ value = this.{mai::Mixin2::_#Mixin2#field1#AI} = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int};
+ return value;
+ }
+ set field1(core::int value) → void
+ this.{mai::Mixin2::_#Mixin2#field1#AI} = value;
+ get field2() → core::int {
+ core::int value = this.{mai::Mixin2::_#Mixin2#field2#AI}{core::int};
+ if(_in::isSentinel(value))
+ value = this.{mai::Mixin2::_#Mixin2#field2#AI} = (() → core::int {
+ return 88;
+ })(){() → core::int};
+ return value;
+ }
+ set field2(core::int value) → void
+ this.{mai::Mixin2::_#Mixin2#field2#AI} = value;
+}
diff --git a/pkg/front_end/testcases/dart2js/mixin_super/main.dart.textual_outline.expect b/pkg/front_end/testcases/dart2js/mixin_super/main.dart.textual_outline.expect
new file mode 100644
index 0000000..105f962
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/mixin_super/main.dart.textual_outline.expect
@@ -0,0 +1,40 @@
+import 'main_lib.dart';
+
+mixin Mixin1 on Super1, Super2 {
+ late int field1 = () {
+ return super.field1 = super.field1 + 1;
+ }();
+ late int field2 = () {
+ return 88;
+ }();
+ void method1() {}
+ void method2() {}
+ int get property1 {}
+ void set property1(int value) {}
+ int get property2 {}
+ void set property2(int value) {}
+}
+
+abstract class Class1a extends Super1 implements Super2 {}
+
+class Class1b extends Class1a with Mixin1 {}
+
+abstract class Class2a extends Super2 implements Super1 {}
+
+class Class2b extends Class2a with Mixin1 {}
+
+abstract class Class3a implements Super1, Super2 {}
+
+class Class3b extends Class3a with Mixin1 {}
+
+abstract class Class4a extends Super1 implements Super2 {}
+
+class Class4b extends Class4a with Mixin2 {}
+
+abstract class Class5a extends Super2 implements Super1 {}
+
+class Class5b extends Class5a with Mixin2 {}
+
+abstract class Class6a implements Super1, Super2 {}
+
+class Class6b extends Class6a with Mixin2 {}
diff --git a/pkg/front_end/testcases/dart2js/mixin_super/main.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/dart2js/mixin_super/main.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..d1d920c
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/mixin_super/main.dart.textual_outline_modelled.expect
@@ -0,0 +1,40 @@
+import 'main_lib.dart';
+
+abstract class Class1a extends Super1 implements Super2 {}
+
+abstract class Class2a extends Super2 implements Super1 {}
+
+abstract class Class3a implements Super1, Super2 {}
+
+abstract class Class4a extends Super1 implements Super2 {}
+
+abstract class Class5a extends Super2 implements Super1 {}
+
+abstract class Class6a implements Super1, Super2 {}
+
+class Class1b extends Class1a with Mixin1 {}
+
+class Class2b extends Class2a with Mixin1 {}
+
+class Class3b extends Class3a with Mixin1 {}
+
+class Class4b extends Class4a with Mixin2 {}
+
+class Class5b extends Class5a with Mixin2 {}
+
+class Class6b extends Class6a with Mixin2 {}
+
+mixin Mixin1 on Super1, Super2 {
+ int get property1 {}
+ int get property2 {}
+ late int field1 = () {
+ return super.field1 = super.field1 + 1;
+ }();
+ late int field2 = () {
+ return 88;
+ }();
+ void method1() {}
+ void method2() {}
+ void set property1(int value) {}
+ void set property2(int value) {}
+}
diff --git a/pkg/front_end/testcases/dart2js/mixin_super/main.dart.weak.expect b/pkg/front_end/testcases/dart2js/mixin_super/main.dart.weak.expect
new file mode 100644
index 0000000..1fb218a
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/mixin_super/main.dart.weak.expect
@@ -0,0 +1,492 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:17:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:23:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:9:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:9:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:17:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:23:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:9:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:9:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:33:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:37:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:19:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:19:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:33:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:37:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:19:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:19:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+import self as self;
+import "dart:core" as core;
+import "main_lib.dart" as mai;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+abstract class _Mixin1&Super1&Super2 extends core::Object implements mai::Super1, mai::Super2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Mixin1&Super1&Super2
+ : super core::Object::•()
+ ;
+}
+abstract class Mixin1 extends self::_Mixin1&Super1&Super2 /*isMixinDeclaration*/ {
+ late field core::int field1 = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int};
+ late field core::int field2 = (() → core::int {
+ return 88;
+ })(){() → core::int};
+ method method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ method method2() → void {}
+ get property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ set property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ get property2() → core::int {
+ return 42;
+ }
+ set property2(core::int value) → void {}
+}
+abstract class Class1a extends mai::Super1 implements mai::Super2 {
+ synthetic constructor •() → self::Class1a
+ : super mai::Super1::•()
+ ;
+}
+abstract class _Class1b&Class1a&Mixin1 = self::Class1a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class1b&Class1a&Mixin1
+ : super self::Class1a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{self::Mixin1::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{self::Mixin1::field2} = value;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class1b extends self::_Class1b&Class1a&Mixin1 {
+ synthetic constructor •() → self::Class1b
+ : super self::_Class1b&Class1a&Mixin1::•()
+ ;
+ static method _#new#tearOff() → self::Class1b
+ return new self::Class1b::•();
+}
+abstract class Class2a extends mai::Super2 implements mai::Super1 {
+ synthetic constructor •() → self::Class2a
+ : super mai::Super2::•()
+ ;
+}
+abstract class _Class2b&Class2a&Mixin1 = self::Class2a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class2b&Class2a&Mixin1
+ : super self::Class2a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{self::Mixin1::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{self::Mixin1::field2} = value;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class2b extends self::_Class2b&Class2a&Mixin1 {
+ synthetic constructor •() → self::Class2b
+ : super self::_Class2b&Class2a&Mixin1::•()
+ ;
+ static method _#new#tearOff() → self::Class2b
+ return new self::Class2b::•();
+}
+abstract class Class3a extends core::Object implements mai::Super1, mai::Super2 {
+ synthetic constructor •() → self::Class3a
+ : super core::Object::•()
+ ;
+}
+abstract class _Class3b&Class3a&Mixin1 = self::Class3a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class3b&Class3a&Mixin1
+ : super self::Class3a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{self::Mixin1::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{self::Mixin1::field2} = value;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class3b extends self::_Class3b&Class3a&Mixin1 {
+ synthetic constructor •() → self::Class3b
+ : super self::_Class3b&Class3a&Mixin1::•()
+ ;
+ static method _#new#tearOff() → self::Class3b
+ return new self::Class3b::•();
+}
+abstract class Class4a extends mai::Super1 implements mai::Super2 {
+ synthetic constructor •() → self::Class4a
+ : super mai::Super1::•()
+ ;
+}
+abstract class _Class4b&Class4a&Mixin2 = self::Class4a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class4b&Class4a&Mixin2
+ : super self::Class4a::•()
+ ;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{mai::Mixin2::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{mai::Mixin2::field2} = value;
+ mixin-super-stub get _#Mixin2#field1#AI() → core::int
+ return super.{mai::Mixin2::_#Mixin2#field1#AI};
+ mixin-super-stub set _#Mixin2#field1#AI(core::int value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1#AI} = value;
+ mixin-super-stub get _#Mixin2#field2#AI() → core::int
+ return super.{mai::Mixin2::_#Mixin2#field2#AI};
+ mixin-super-stub set _#Mixin2#field2#AI(core::int value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2#AI} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class4b extends self::_Class4b&Class4a&Mixin2 {
+ synthetic constructor •() → self::Class4b
+ : super self::_Class4b&Class4a&Mixin2::•()
+ ;
+ static method _#new#tearOff() → self::Class4b
+ return new self::Class4b::•();
+}
+abstract class Class5a extends mai::Super2 implements mai::Super1 {
+ synthetic constructor •() → self::Class5a
+ : super mai::Super2::•()
+ ;
+}
+abstract class _Class5b&Class5a&Mixin2 = self::Class5a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class5b&Class5a&Mixin2
+ : super self::Class5a::•()
+ ;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{mai::Mixin2::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{mai::Mixin2::field2} = value;
+ mixin-super-stub get _#Mixin2#field1#AI() → core::int
+ return super.{mai::Mixin2::_#Mixin2#field1#AI};
+ mixin-super-stub set _#Mixin2#field1#AI(core::int value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1#AI} = value;
+ mixin-super-stub get _#Mixin2#field2#AI() → core::int
+ return super.{mai::Mixin2::_#Mixin2#field2#AI};
+ mixin-super-stub set _#Mixin2#field2#AI(core::int value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2#AI} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class5b extends self::_Class5b&Class5a&Mixin2 {
+ synthetic constructor •() → self::Class5b
+ : super self::_Class5b&Class5a&Mixin2::•()
+ ;
+ static method _#new#tearOff() → self::Class5b
+ return new self::Class5b::•();
+}
+abstract class Class6a extends core::Object implements mai::Super1, mai::Super2 {
+ synthetic constructor •() → self::Class6a
+ : super core::Object::•()
+ ;
+}
+abstract class _Class6b&Class6a&Mixin2 = self::Class6a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class6b&Class6a&Mixin2
+ : super self::Class6a::•()
+ ;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{mai::Mixin2::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{mai::Mixin2::field2} = value;
+ mixin-super-stub get _#Mixin2#field1#AI() → core::int
+ return super.{mai::Mixin2::_#Mixin2#field1#AI};
+ mixin-super-stub set _#Mixin2#field1#AI(core::int value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1#AI} = value;
+ mixin-super-stub get _#Mixin2#field2#AI() → core::int
+ return super.{mai::Mixin2::_#Mixin2#field2#AI};
+ mixin-super-stub set _#Mixin2#field2#AI(core::int value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2#AI} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class6b extends self::_Class6b&Class6a&Mixin2 {
+ synthetic constructor •() → self::Class6b
+ : super self::_Class6b&Class6a&Mixin2::•()
+ ;
+ static method _#new#tearOff() → self::Class6b
+ return new self::Class6b::•();
+}
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class Super1 extends core::Object {
+ field core::int field1 = 42;
+ field core::int property1 = 42;
+ synthetic constructor •() → mai::Super1
+ : super core::Object::•()
+ ;
+ method method1() → void {}
+ static method _#new#tearOff() → mai::Super1
+ return new mai::Super1::•();
+}
+class Super2 extends core::Object {
+ field core::int field2 = 87;
+ field core::int property2 = 87;
+ synthetic constructor •() → mai::Super2
+ : super core::Object::•()
+ ;
+ method method2() → void {}
+ static method _#new#tearOff() → mai::Super2
+ return new mai::Super2::•();
+}
+abstract class _Mixin2&Super1&Super2 extends core::Object implements mai::Super1, mai::Super2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → mai::_Mixin2&Super1&Super2
+ : super core::Object::•()
+ ;
+}
+abstract class Mixin2 extends mai::_Mixin2&Super1&Super2 /*isMixinDeclaration*/ {
+ field core::int _#Mixin2#field1#AI = _in::createSentinel<core::int>();
+ field core::int _#Mixin2#field2#AI = _in::createSentinel<core::int>();
+ method method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ method method2() → void {}
+ get property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ set property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ get property2() → core::int {
+ return 42;
+ }
+ set property2(core::int value) → void {}
+ get field1() → core::int {
+ core::int value = this.{mai::Mixin2::_#Mixin2#field1#AI}{core::int};
+ if(_in::isSentinel(value))
+ value = this.{mai::Mixin2::_#Mixin2#field1#AI} = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int};
+ return value;
+ }
+ set field1(core::int value) → void
+ this.{mai::Mixin2::_#Mixin2#field1#AI} = value;
+ get field2() → core::int {
+ core::int value = this.{mai::Mixin2::_#Mixin2#field2#AI}{core::int};
+ if(_in::isSentinel(value))
+ value = this.{mai::Mixin2::_#Mixin2#field2#AI} = (() → core::int {
+ return 88;
+ })(){() → core::int};
+ return value;
+ }
+ set field2(core::int value) → void
+ this.{mai::Mixin2::_#Mixin2#field2#AI} = value;
+}
diff --git a/pkg/front_end/testcases/dart2js/mixin_super/main.dart.weak.modular.expect b/pkg/front_end/testcases/dart2js/mixin_super/main.dart.weak.modular.expect
new file mode 100644
index 0000000..808a599
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/mixin_super/main.dart.weak.modular.expect
@@ -0,0 +1,353 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:17:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:23:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:9:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:9:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:17:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:23:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:9:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:9:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+import self as self;
+import "dart:core" as core;
+import "main_lib.dart" as mai;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+abstract class _Mixin1&Super1&Super2 extends core::Object implements mai::Super1, mai::Super2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Mixin1&Super1&Super2
+ : super core::Object::•()
+ ;
+}
+abstract class Mixin1 extends self::_Mixin1&Super1&Super2 /*isMixinDeclaration*/ {
+ late field core::int field1 = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int};
+ late field core::int field2 = (() → core::int {
+ return 88;
+ })(){() → core::int};
+ method method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ method method2() → void {}
+ get property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ set property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ get property2() → core::int {
+ return 42;
+ }
+ set property2(core::int value) → void {}
+}
+abstract class Class1a extends mai::Super1 implements mai::Super2 {
+ synthetic constructor •() → self::Class1a
+ : super mai::Super1::•()
+ ;
+}
+abstract class _Class1b&Class1a&Mixin1 = self::Class1a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class1b&Class1a&Mixin1
+ : super self::Class1a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{self::Mixin1::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{self::Mixin1::field2} = value;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class1b extends self::_Class1b&Class1a&Mixin1 {
+ synthetic constructor •() → self::Class1b
+ : super self::_Class1b&Class1a&Mixin1::•()
+ ;
+ static method _#new#tearOff() → self::Class1b
+ return new self::Class1b::•();
+}
+abstract class Class2a extends mai::Super2 implements mai::Super1 {
+ synthetic constructor •() → self::Class2a
+ : super mai::Super2::•()
+ ;
+}
+abstract class _Class2b&Class2a&Mixin1 = self::Class2a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class2b&Class2a&Mixin1
+ : super self::Class2a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{self::Mixin1::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{self::Mixin1::field2} = value;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class2b extends self::_Class2b&Class2a&Mixin1 {
+ synthetic constructor •() → self::Class2b
+ : super self::_Class2b&Class2a&Mixin1::•()
+ ;
+ static method _#new#tearOff() → self::Class2b
+ return new self::Class2b::•();
+}
+abstract class Class3a extends core::Object implements mai::Super1, mai::Super2 {
+ synthetic constructor •() → self::Class3a
+ : super core::Object::•()
+ ;
+}
+abstract class _Class3b&Class3a&Mixin1 = self::Class3a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class3b&Class3a&Mixin1
+ : super self::Class3a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{self::Mixin1::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{self::Mixin1::field2} = value;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class3b extends self::_Class3b&Class3a&Mixin1 {
+ synthetic constructor •() → self::Class3b
+ : super self::_Class3b&Class3a&Mixin1::•()
+ ;
+ static method _#new#tearOff() → self::Class3b
+ return new self::Class3b::•();
+}
+abstract class Class4a extends mai::Super1 implements mai::Super2 {
+ synthetic constructor •() → self::Class4a
+ : super mai::Super1::•()
+ ;
+}
+abstract class _Class4b&Class4a&Mixin2 = self::Class4a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class4b&Class4a&Mixin2
+ : super self::Class4a::•()
+ ;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{mai::Mixin2::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{mai::Mixin2::field2} = value;
+ mixin-super-stub get _#Mixin2#field1#A() → core::int
+ return super.{mai::Mixin2::_#Mixin2#field1#A};
+ mixin-super-stub set _#Mixin2#field1#A(core::int value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1#A} = value;
+ mixin-super-stub get _#Mixin2#field2#A() → core::int
+ return super.{mai::Mixin2::_#Mixin2#field2#A};
+ mixin-super-stub set _#Mixin2#field2#A(core::int value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2#A} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class4b extends self::_Class4b&Class4a&Mixin2 {
+ synthetic constructor •() → self::Class4b
+ : super self::_Class4b&Class4a&Mixin2::•()
+ ;
+ static method _#new#tearOff() → self::Class4b
+ return new self::Class4b::•();
+}
+abstract class Class5a extends mai::Super2 implements mai::Super1 {
+ synthetic constructor •() → self::Class5a
+ : super mai::Super2::•()
+ ;
+}
+abstract class _Class5b&Class5a&Mixin2 = self::Class5a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class5b&Class5a&Mixin2
+ : super self::Class5a::•()
+ ;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{mai::Mixin2::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{mai::Mixin2::field2} = value;
+ mixin-super-stub get _#Mixin2#field1#A() → core::int
+ return super.{mai::Mixin2::_#Mixin2#field1#A};
+ mixin-super-stub set _#Mixin2#field1#A(core::int value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1#A} = value;
+ mixin-super-stub get _#Mixin2#field2#A() → core::int
+ return super.{mai::Mixin2::_#Mixin2#field2#A};
+ mixin-super-stub set _#Mixin2#field2#A(core::int value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2#A} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class5b extends self::_Class5b&Class5a&Mixin2 {
+ synthetic constructor •() → self::Class5b
+ : super self::_Class5b&Class5a&Mixin2::•()
+ ;
+ static method _#new#tearOff() → self::Class5b
+ return new self::Class5b::•();
+}
+abstract class Class6a extends core::Object implements mai::Super1, mai::Super2 {
+ synthetic constructor •() → self::Class6a
+ : super core::Object::•()
+ ;
+}
+abstract class _Class6b&Class6a&Mixin2 = self::Class6a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class6b&Class6a&Mixin2
+ : super self::Class6a::•()
+ ;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{mai::Mixin2::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{mai::Mixin2::field2} = value;
+ mixin-super-stub get _#Mixin2#field1#A() → core::int
+ return super.{mai::Mixin2::_#Mixin2#field1#A};
+ mixin-super-stub set _#Mixin2#field1#A(core::int value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1#A} = value;
+ mixin-super-stub get _#Mixin2#field2#A() → core::int
+ return super.{mai::Mixin2::_#Mixin2#field2#A};
+ mixin-super-stub set _#Mixin2#field2#A(core::int value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2#A} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class6b extends self::_Class6b&Class6a&Mixin2 {
+ synthetic constructor •() → self::Class6b
+ : super self::_Class6b&Class6a&Mixin2::•()
+ ;
+ static method _#new#tearOff() → self::Class6b
+ return new self::Class6b::•();
+}
diff --git a/pkg/front_end/testcases/dart2js/mixin_super/main.dart.weak.outline.expect b/pkg/front_end/testcases/dart2js/mixin_super/main.dart.weak.outline.expect
new file mode 100644
index 0000000..34aaada
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/mixin_super/main.dart.weak.outline.expect
@@ -0,0 +1,316 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "main_lib.dart" as mai;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+abstract class _Mixin1&Super1&Super2 extends core::Object implements mai::Super1, mai::Super2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Mixin1&Super1&Super2
+ ;
+}
+abstract class Mixin1 extends self::_Mixin1&Super1&Super2 /*isMixinDeclaration*/ {
+ late field core::int field1;
+ late field core::int field2;
+ method method1() → void
+ ;
+ method method2() → void
+ ;
+ get property1() → core::int
+ ;
+ set property1(core::int value) → void
+ ;
+ get property2() → core::int
+ ;
+ set property2(core::int value) → void
+ ;
+}
+abstract class Class1a extends mai::Super1 implements mai::Super2 {
+ synthetic constructor •() → self::Class1a
+ ;
+}
+abstract class _Class1b&Class1a&Mixin1 = self::Class1a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class1b&Class1a&Mixin1
+ : super self::Class1a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{self::Mixin1::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{self::Mixin1::field2} = value;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class1b extends self::_Class1b&Class1a&Mixin1 {
+ synthetic constructor •() → self::Class1b
+ ;
+ static method _#new#tearOff() → self::Class1b
+ return new self::Class1b::•();
+}
+abstract class Class2a extends mai::Super2 implements mai::Super1 {
+ synthetic constructor •() → self::Class2a
+ ;
+}
+abstract class _Class2b&Class2a&Mixin1 = self::Class2a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class2b&Class2a&Mixin1
+ : super self::Class2a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{self::Mixin1::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{self::Mixin1::field2} = value;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class2b extends self::_Class2b&Class2a&Mixin1 {
+ synthetic constructor •() → self::Class2b
+ ;
+ static method _#new#tearOff() → self::Class2b
+ return new self::Class2b::•();
+}
+abstract class Class3a extends core::Object implements mai::Super1, mai::Super2 {
+ synthetic constructor •() → self::Class3a
+ ;
+}
+abstract class _Class3b&Class3a&Mixin1 = self::Class3a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class3b&Class3a&Mixin1
+ : super self::Class3a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{self::Mixin1::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{self::Mixin1::field2} = value;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class3b extends self::_Class3b&Class3a&Mixin1 {
+ synthetic constructor •() → self::Class3b
+ ;
+ static method _#new#tearOff() → self::Class3b
+ return new self::Class3b::•();
+}
+abstract class Class4a extends mai::Super1 implements mai::Super2 {
+ synthetic constructor •() → self::Class4a
+ ;
+}
+abstract class _Class4b&Class4a&Mixin2 = self::Class4a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class4b&Class4a&Mixin2
+ : super self::Class4a::•()
+ ;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{mai::Mixin2::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{mai::Mixin2::field2} = value;
+ mixin-super-stub get _#Mixin2#field1#A() → core::int
+ return super.{mai::Mixin2::_#Mixin2#field1#A};
+ mixin-super-stub set _#Mixin2#field1#A(core::int value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1#A} = value;
+ mixin-super-stub get _#Mixin2#field2#A() → core::int
+ return super.{mai::Mixin2::_#Mixin2#field2#A};
+ mixin-super-stub set _#Mixin2#field2#A(core::int value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2#A} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class4b extends self::_Class4b&Class4a&Mixin2 {
+ synthetic constructor •() → self::Class4b
+ ;
+ static method _#new#tearOff() → self::Class4b
+ return new self::Class4b::•();
+}
+abstract class Class5a extends mai::Super2 implements mai::Super1 {
+ synthetic constructor •() → self::Class5a
+ ;
+}
+abstract class _Class5b&Class5a&Mixin2 = self::Class5a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class5b&Class5a&Mixin2
+ : super self::Class5a::•()
+ ;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{mai::Mixin2::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{mai::Mixin2::field2} = value;
+ mixin-super-stub get _#Mixin2#field1#A() → core::int
+ return super.{mai::Mixin2::_#Mixin2#field1#A};
+ mixin-super-stub set _#Mixin2#field1#A(core::int value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1#A} = value;
+ mixin-super-stub get _#Mixin2#field2#A() → core::int
+ return super.{mai::Mixin2::_#Mixin2#field2#A};
+ mixin-super-stub set _#Mixin2#field2#A(core::int value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2#A} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class5b extends self::_Class5b&Class5a&Mixin2 {
+ synthetic constructor •() → self::Class5b
+ ;
+ static method _#new#tearOff() → self::Class5b
+ return new self::Class5b::•();
+}
+abstract class Class6a extends core::Object implements mai::Super1, mai::Super2 {
+ synthetic constructor •() → self::Class6a
+ ;
+}
+abstract class _Class6b&Class6a&Mixin2 = self::Class6a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class6b&Class6a&Mixin2
+ : super self::Class6a::•()
+ ;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{mai::Mixin2::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{mai::Mixin2::field2} = value;
+ mixin-super-stub get _#Mixin2#field1#A() → core::int
+ return super.{mai::Mixin2::_#Mixin2#field1#A};
+ mixin-super-stub set _#Mixin2#field1#A(core::int value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1#A} = value;
+ mixin-super-stub get _#Mixin2#field2#A() → core::int
+ return super.{mai::Mixin2::_#Mixin2#field2#A};
+ mixin-super-stub set _#Mixin2#field2#A(core::int value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2#A} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class6b extends self::_Class6b&Class6a&Mixin2 {
+ synthetic constructor •() → self::Class6b
+ ;
+ static method _#new#tearOff() → self::Class6b
+ return new self::Class6b::•();
+}
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+import "dart:_late_helper" as _la;
+import "dart:_internal" as _in;
+
+class Super1 extends core::Object {
+ field core::int field1;
+ field core::int property1;
+ synthetic constructor •() → mai::Super1
+ ;
+ method method1() → void
+ ;
+ static method _#new#tearOff() → mai::Super1
+ return new mai::Super1::•();
+}
+class Super2 extends core::Object {
+ field core::int field2;
+ field core::int property2;
+ synthetic constructor •() → mai::Super2
+ ;
+ method method2() → void
+ ;
+ static method _#new#tearOff() → mai::Super2
+ return new mai::Super2::•();
+}
+abstract class _Mixin2&Super1&Super2 extends core::Object implements mai::Super1, mai::Super2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → mai::_Mixin2&Super1&Super2
+ ;
+}
+abstract class Mixin2 extends mai::_Mixin2&Super1&Super2 /*isMixinDeclaration*/ {
+ field core::int _#Mixin2#field1#A = _in::createSentinel<core::int>();
+ field core::int _#Mixin2#field2#A = _in::createSentinel<core::int>();
+ method method1() → void
+ ;
+ method method2() → void
+ ;
+ get property1() → core::int
+ ;
+ set property1(core::int value) → void
+ ;
+ get property2() → core::int
+ ;
+ set property2(core::int value) → void
+ ;
+ get field1() → core::int
+ return _la::_lateReadCheck<core::int>(this.{mai::Mixin2::_#Mixin2#field1#A}{core::int}, "field1");
+ set field1(core::int value) → void
+ this.{mai::Mixin2::_#Mixin2#field1#A} = value;
+ get field2() → core::int
+ return _la::_lateReadCheck<core::int>(this.{mai::Mixin2::_#Mixin2#field2#A}{core::int}, "field2");
+ set field2(core::int value) → void
+ this.{mai::Mixin2::_#Mixin2#field2#A} = value;
+}
diff --git a/pkg/front_end/testcases/dart2js/mixin_super/main.dart.weak.transformed.expect b/pkg/front_end/testcases/dart2js/mixin_super/main.dart.weak.transformed.expect
new file mode 100644
index 0000000..9f8984c
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/mixin_super/main.dart.weak.transformed.expect
@@ -0,0 +1,563 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:17:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:23:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:9:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:9:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:17:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:23:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:9:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:9:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:33:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:37:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:19:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:19:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:33:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:37:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:19:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dart2js/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart:19:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+import self as self;
+import "dart:core" as core;
+import "main_lib.dart" as mai;
+import "dart:_internal" as _in;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+abstract class _Mixin1&Super1&Super2 extends core::Object implements mai::Super1, mai::Super2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Mixin1&Super1&Super2
+ : super core::Object::•()
+ ;
+}
+abstract class Mixin1 extends self::_Mixin1&Super1&Super2 /*isMixinDeclaration*/ {
+ field core::int _#Mixin1#field1#AI = _in::createSentinel<core::int>();
+ field core::int _#Mixin1#field2#AI = _in::createSentinel<core::int>();
+ method method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ method method2() → void {}
+ get property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ set property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ get property2() → core::int {
+ return 42;
+ }
+ set property2(core::int value) → void {}
+ get field1() → core::int {
+ core::int value = this.{self::Mixin1::_#Mixin1#field1#AI}{core::int};
+ if(_in::isSentinel(value))
+ value = this.{self::Mixin1::_#Mixin1#field1#AI} = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int};
+ return value;
+ }
+ set field1(core::int value) → void
+ this.{self::Mixin1::_#Mixin1#field1#AI} = value;
+ get field2() → core::int {
+ core::int value = this.{self::Mixin1::_#Mixin1#field2#AI}{core::int};
+ if(_in::isSentinel(value))
+ value = this.{self::Mixin1::_#Mixin1#field2#AI} = (() → core::int {
+ return 88;
+ })(){() → core::int};
+ return value;
+ }
+ set field2(core::int value) → void
+ this.{self::Mixin1::_#Mixin1#field2#AI} = value;
+}
+abstract class Class1a extends mai::Super1 implements mai::Super2 {
+ synthetic constructor •() → self::Class1a
+ : super mai::Super1::•()
+ ;
+}
+abstract class _Class1b&Class1a&Mixin1 = self::Class1a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class1b&Class1a&Mixin1
+ : super self::Class1a::•()
+ ;
+ mixin-super-stub set field1(core::int value) → void
+ return super.{self::Mixin1::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{self::Mixin1::field2} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+ method method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ get property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ set property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ get field1() → core::int {
+ core::int value = this.{self::Mixin1::_#Mixin1#field1#AI}{core::int};
+ if(_in::isSentinel(value))
+ value = this.{self::Mixin1::_#Mixin1#field1#AI} = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int};
+ return value;
+ }
+}
+class Class1b extends self::_Class1b&Class1a&Mixin1 {
+ synthetic constructor •() → self::Class1b
+ : super self::_Class1b&Class1a&Mixin1::•()
+ ;
+ static method _#new#tearOff() → self::Class1b
+ return new self::Class1b::•();
+}
+abstract class Class2a extends mai::Super2 implements mai::Super1 {
+ synthetic constructor •() → self::Class2a
+ : super mai::Super2::•()
+ ;
+}
+abstract class _Class2b&Class2a&Mixin1 = self::Class2a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class2b&Class2a&Mixin1
+ : super self::Class2a::•()
+ ;
+ mixin-super-stub set field1(core::int value) → void
+ return super.{self::Mixin1::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{self::Mixin1::field2} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+ method method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ get property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ set property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ get field1() → core::int {
+ core::int value = this.{self::Mixin1::_#Mixin1#field1#AI}{core::int};
+ if(_in::isSentinel(value))
+ value = this.{self::Mixin1::_#Mixin1#field1#AI} = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int};
+ return value;
+ }
+}
+class Class2b extends self::_Class2b&Class2a&Mixin1 {
+ synthetic constructor •() → self::Class2b
+ : super self::_Class2b&Class2a&Mixin1::•()
+ ;
+ static method _#new#tearOff() → self::Class2b
+ return new self::Class2b::•();
+}
+abstract class Class3a extends core::Object implements mai::Super1, mai::Super2 {
+ synthetic constructor •() → self::Class3a
+ : super core::Object::•()
+ ;
+}
+abstract class _Class3b&Class3a&Mixin1 = self::Class3a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class3b&Class3a&Mixin1
+ : super self::Class3a::•()
+ ;
+ mixin-super-stub set field1(core::int value) → void
+ return super.{self::Mixin1::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{self::Mixin1::field2} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+ method method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ get property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ set property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ get field1() → core::int {
+ core::int value = this.{self::Mixin1::_#Mixin1#field1#AI}{core::int};
+ if(_in::isSentinel(value))
+ value = this.{self::Mixin1::_#Mixin1#field1#AI} = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int};
+ return value;
+ }
+}
+class Class3b extends self::_Class3b&Class3a&Mixin1 {
+ synthetic constructor •() → self::Class3b
+ : super self::_Class3b&Class3a&Mixin1::•()
+ ;
+ static method _#new#tearOff() → self::Class3b
+ return new self::Class3b::•();
+}
+abstract class Class4a extends mai::Super1 implements mai::Super2 {
+ synthetic constructor •() → self::Class4a
+ : super mai::Super1::•()
+ ;
+}
+abstract class _Class4b&Class4a&Mixin2 = self::Class4a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class4b&Class4a&Mixin2
+ : super self::Class4a::•()
+ ;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub set field1(core::int value) → void
+ return super.{mai::Mixin2::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{mai::Mixin2::field2} = value;
+ mixin-super-stub get _#Mixin2#field1#AI() → core::int
+ return super.{mai::Mixin2::_#Mixin2#field1#AI};
+ mixin-super-stub set _#Mixin2#field1#AI(core::int value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1#AI} = value;
+ mixin-super-stub get _#Mixin2#field2#AI() → core::int
+ return super.{mai::Mixin2::_#Mixin2#field2#AI};
+ mixin-super-stub set _#Mixin2#field2#AI(core::int value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2#AI} = value;
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+ method /* from org-dartlang-testcase:///main_lib.dart */ method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ get /* from org-dartlang-testcase:///main_lib.dart */ property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ set /* from org-dartlang-testcase:///main_lib.dart */ property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ get /* from org-dartlang-testcase:///main_lib.dart */ field1() → core::int {
+ core::int value = this.{mai::Mixin2::_#Mixin2#field1#AI}{core::int};
+ if(_in::isSentinel(value))
+ value = this.{mai::Mixin2::_#Mixin2#field1#AI} = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int};
+ return value;
+ }
+}
+class Class4b extends self::_Class4b&Class4a&Mixin2 {
+ synthetic constructor •() → self::Class4b
+ : super self::_Class4b&Class4a&Mixin2::•()
+ ;
+ static method _#new#tearOff() → self::Class4b
+ return new self::Class4b::•();
+}
+abstract class Class5a extends mai::Super2 implements mai::Super1 {
+ synthetic constructor •() → self::Class5a
+ : super mai::Super2::•()
+ ;
+}
+abstract class _Class5b&Class5a&Mixin2 = self::Class5a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class5b&Class5a&Mixin2
+ : super self::Class5a::•()
+ ;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub set field1(core::int value) → void
+ return super.{mai::Mixin2::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{mai::Mixin2::field2} = value;
+ mixin-super-stub get _#Mixin2#field1#AI() → core::int
+ return super.{mai::Mixin2::_#Mixin2#field1#AI};
+ mixin-super-stub set _#Mixin2#field1#AI(core::int value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1#AI} = value;
+ mixin-super-stub get _#Mixin2#field2#AI() → core::int
+ return super.{mai::Mixin2::_#Mixin2#field2#AI};
+ mixin-super-stub set _#Mixin2#field2#AI(core::int value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2#AI} = value;
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+ method /* from org-dartlang-testcase:///main_lib.dart */ method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ get /* from org-dartlang-testcase:///main_lib.dart */ property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ set /* from org-dartlang-testcase:///main_lib.dart */ property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ get /* from org-dartlang-testcase:///main_lib.dart */ field1() → core::int {
+ core::int value = this.{mai::Mixin2::_#Mixin2#field1#AI}{core::int};
+ if(_in::isSentinel(value))
+ value = this.{mai::Mixin2::_#Mixin2#field1#AI} = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int};
+ return value;
+ }
+}
+class Class5b extends self::_Class5b&Class5a&Mixin2 {
+ synthetic constructor •() → self::Class5b
+ : super self::_Class5b&Class5a&Mixin2::•()
+ ;
+ static method _#new#tearOff() → self::Class5b
+ return new self::Class5b::•();
+}
+abstract class Class6a extends core::Object implements mai::Super1, mai::Super2 {
+ synthetic constructor •() → self::Class6a
+ : super core::Object::•()
+ ;
+}
+abstract class _Class6b&Class6a&Mixin2 = self::Class6a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class6b&Class6a&Mixin2
+ : super self::Class6a::•()
+ ;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub set field1(core::int value) → void
+ return super.{mai::Mixin2::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{mai::Mixin2::field2} = value;
+ mixin-super-stub get _#Mixin2#field1#AI() → core::int
+ return super.{mai::Mixin2::_#Mixin2#field1#AI};
+ mixin-super-stub set _#Mixin2#field1#AI(core::int value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1#AI} = value;
+ mixin-super-stub get _#Mixin2#field2#AI() → core::int
+ return super.{mai::Mixin2::_#Mixin2#field2#AI};
+ mixin-super-stub set _#Mixin2#field2#AI(core::int value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2#AI} = value;
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+ method /* from org-dartlang-testcase:///main_lib.dart */ method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ get /* from org-dartlang-testcase:///main_lib.dart */ property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ set /* from org-dartlang-testcase:///main_lib.dart */ property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ get /* from org-dartlang-testcase:///main_lib.dart */ field1() → core::int {
+ core::int value = this.{mai::Mixin2::_#Mixin2#field1#AI}{core::int};
+ if(_in::isSentinel(value))
+ value = this.{mai::Mixin2::_#Mixin2#field1#AI} = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int};
+ return value;
+ }
+}
+class Class6b extends self::_Class6b&Class6a&Mixin2 {
+ synthetic constructor •() → self::Class6b
+ : super self::_Class6b&Class6a&Mixin2::•()
+ ;
+ static method _#new#tearOff() → self::Class6b
+ return new self::Class6b::•();
+}
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class Super1 extends core::Object {
+ field core::int field1 = 42;
+ field core::int property1 = 42;
+ synthetic constructor •() → mai::Super1
+ : super core::Object::•()
+ ;
+ method method1() → void {}
+ static method _#new#tearOff() → mai::Super1
+ return new mai::Super1::•();
+}
+class Super2 extends core::Object {
+ field core::int field2 = 87;
+ field core::int property2 = 87;
+ synthetic constructor •() → mai::Super2
+ : super core::Object::•()
+ ;
+ method method2() → void {}
+ static method _#new#tearOff() → mai::Super2
+ return new mai::Super2::•();
+}
+abstract class _Mixin2&Super1&Super2 extends core::Object implements mai::Super1, mai::Super2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → mai::_Mixin2&Super1&Super2
+ : super core::Object::•()
+ ;
+}
+abstract class Mixin2 extends mai::_Mixin2&Super1&Super2 /*isMixinDeclaration*/ {
+ field core::int _#Mixin2#field1#AI = _in::createSentinel<core::int>();
+ field core::int _#Mixin2#field2#AI = _in::createSentinel<core::int>();
+ method method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ method method2() → void {}
+ get property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ set property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ get property2() → core::int {
+ return 42;
+ }
+ set property2(core::int value) → void {}
+ get field1() → core::int {
+ core::int value = this.{mai::Mixin2::_#Mixin2#field1#AI}{core::int};
+ if(_in::isSentinel(value))
+ value = this.{mai::Mixin2::_#Mixin2#field1#AI} = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int};
+ return value;
+ }
+ set field1(core::int value) → void
+ this.{mai::Mixin2::_#Mixin2#field1#AI} = value;
+ get field2() → core::int {
+ core::int value = this.{mai::Mixin2::_#Mixin2#field2#AI}{core::int};
+ if(_in::isSentinel(value))
+ value = this.{mai::Mixin2::_#Mixin2#field2#AI} = (() → core::int {
+ return 88;
+ })(){() → core::int};
+ return value;
+ }
+ set field2(core::int value) → void
+ this.{mai::Mixin2::_#Mixin2#field2#AI} = value;
+}
diff --git a/pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart b/pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart
new file mode 100644
index 0000000..2d5e63b
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart
@@ -0,0 +1,45 @@
+// 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.
+
+class Super1 {
+ void method1() {}
+ int field1 = 42;
+ int property1 = 42;
+}
+
+class Super2 {
+ void method2() {}
+ int field2 = 87;
+ int property2 = 87;
+}
+
+mixin Mixin2 on Super1, Super2 {
+ late int field1 = () {
+ return super.field1 = super.field1 + 1;
+ }();
+
+ late int field2 = () {
+ return 88;
+ }();
+
+ void method1() {
+ super.method1();
+ }
+
+ void method2() {}
+
+ int get property1 {
+ return super.property1;
+ }
+
+ void set property1(int value) {
+ super.property1 = value;
+ }
+
+ int get property2 {
+ return 42;
+ }
+
+ void set property2(int value) {}
+}
diff --git a/pkg/front_end/testcases/dart2js/mixin_super/test.options b/pkg/front_end/testcases/dart2js/mixin_super/test.options
new file mode 100644
index 0000000..bfe6dc8
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/mixin_super/test.options
@@ -0,0 +1 @@
+main_lib.dart
\ No newline at end of file
diff --git a/pkg/front_end/testcases/dartdevc/mixin_super/main.dart b/pkg/front_end/testcases/dartdevc/mixin_super/main.dart
new file mode 100644
index 0000000..1c32e50
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/mixin_super/main.dart
@@ -0,0 +1,59 @@
+// 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.
+
+import 'main_lib.dart';
+
+mixin Mixin1 on Super1, Super2 {
+ late int field1 = () {
+ return super.field1 = super.field1 + 1;
+ }();
+
+ late int field2 = () {
+ return 88;
+ }();
+
+ void method1() {
+ super.method1();
+ }
+
+ void method2() {}
+
+ int get property1 {
+ return super.property1;
+ }
+
+ void set property1(int value) {
+ super.property1 = value;
+ }
+
+ int get property2 {
+ return 42;
+ }
+
+ void set property2(int value) {}
+}
+
+abstract class Class1a extends Super1 implements Super2 {}
+
+class Class1b extends Class1a with Mixin1 /* Ok */ {}
+
+abstract class Class2a extends Super2 implements Super1 {}
+
+class Class2b extends Class2a with Mixin1 /* Error */ {}
+
+abstract class Class3a implements Super1, Super2 {}
+
+class Class3b extends Class3a with Mixin1 /* Error */ {}
+
+abstract class Class4a extends Super1 implements Super2 {}
+
+class Class4b extends Class4a with Mixin2 /* Ok */ {}
+
+abstract class Class5a extends Super2 implements Super1 {}
+
+class Class5b extends Class5a with Mixin2 /* Error */ {}
+
+abstract class Class6a implements Super1, Super2 {}
+
+class Class6b extends Class6a with Mixin2 /* Error */ {}
diff --git a/pkg/front_end/testcases/dartdevc/mixin_super/main.dart.strong.expect b/pkg/front_end/testcases/dartdevc/mixin_super/main.dart.strong.expect
new file mode 100644
index 0000000..82b5515
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/mixin_super/main.dart.strong.expect
@@ -0,0 +1,515 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:9:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:9:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:17:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:23:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:9:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:9:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:17:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:23:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:19:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:19:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:33:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:37:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:19:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:19:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:33:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:37:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+import self as self;
+import "dart:core" as core;
+import "main_lib.dart" as mai;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+abstract class _Mixin1&Super1&Super2 extends core::Object implements mai::Super1, mai::Super2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Mixin1&Super1&Super2
+ : super core::Object::•()
+ ;
+}
+abstract class Mixin1 extends self::_Mixin1&Super1&Super2 /*isMixinDeclaration*/ {
+ field core::int? _#Mixin1#field1 = null;
+ field core::int? _#Mixin1#field2 = null;
+ get field1() → core::int
+ return let final core::int? #t1 = this.{self::Mixin1::_#Mixin1#field1}{core::int?} in #t1 == null ?{core::int} this.{self::Mixin1::_#Mixin1#field1} = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int} : #t1{core::int};
+ set field1(core::int field1#param) → void
+ this.{self::Mixin1::_#Mixin1#field1} = field1#param;
+ get field2() → core::int
+ return let final core::int? #t2 = this.{self::Mixin1::_#Mixin1#field2}{core::int?} in #t2 == null ?{core::int} this.{self::Mixin1::_#Mixin1#field2} = (() → core::int {
+ return 88;
+ })(){() → core::int} : #t2{core::int};
+ set field2(core::int field2#param) → void
+ this.{self::Mixin1::_#Mixin1#field2} = field2#param;
+ method method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ method method2() → void {}
+ get property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ set property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ get property2() → core::int {
+ return 42;
+ }
+ set property2(core::int value) → void {}
+}
+abstract class Class1a extends mai::Super1 implements mai::Super2 {
+ synthetic constructor •() → self::Class1a
+ : super mai::Super1::•()
+ ;
+}
+abstract class _Class1b&Class1a&Mixin1 = self::Class1a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class1b&Class1a&Mixin1
+ : super self::Class1a::•()
+ ;
+ mixin-super-stub get _#Mixin1#field1() → core::int?
+ return super.{self::Mixin1::_#Mixin1#field1};
+ mixin-super-stub set _#Mixin1#field1(core::int? value) → void
+ return super.{self::Mixin1::_#Mixin1#field1} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int field1#param) → void
+ return super.{self::Mixin1::field1} = field1#param;
+ mixin-super-stub get _#Mixin1#field2() → core::int?
+ return super.{self::Mixin1::_#Mixin1#field2};
+ mixin-super-stub set _#Mixin1#field2(core::int? value) → void
+ return super.{self::Mixin1::_#Mixin1#field2} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int field2#param) → void
+ return super.{self::Mixin1::field2} = field2#param;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class1b extends self::_Class1b&Class1a&Mixin1 {
+ synthetic constructor •() → self::Class1b
+ : super self::_Class1b&Class1a&Mixin1::•()
+ ;
+ static method _#new#tearOff() → self::Class1b
+ return new self::Class1b::•();
+}
+abstract class Class2a extends mai::Super2 implements mai::Super1 {
+ synthetic constructor •() → self::Class2a
+ : super mai::Super2::•()
+ ;
+}
+abstract class _Class2b&Class2a&Mixin1 = self::Class2a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class2b&Class2a&Mixin1
+ : super self::Class2a::•()
+ ;
+ mixin-super-stub get _#Mixin1#field1() → core::int?
+ return super.{self::Mixin1::_#Mixin1#field1};
+ mixin-super-stub set _#Mixin1#field1(core::int? value) → void
+ return super.{self::Mixin1::_#Mixin1#field1} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int field1#param) → void
+ return super.{self::Mixin1::field1} = field1#param;
+ mixin-super-stub get _#Mixin1#field2() → core::int?
+ return super.{self::Mixin1::_#Mixin1#field2};
+ mixin-super-stub set _#Mixin1#field2(core::int? value) → void
+ return super.{self::Mixin1::_#Mixin1#field2} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int field2#param) → void
+ return super.{self::Mixin1::field2} = field2#param;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class2b extends self::_Class2b&Class2a&Mixin1 {
+ synthetic constructor •() → self::Class2b
+ : super self::_Class2b&Class2a&Mixin1::•()
+ ;
+ static method _#new#tearOff() → self::Class2b
+ return new self::Class2b::•();
+}
+abstract class Class3a extends core::Object implements mai::Super1, mai::Super2 {
+ synthetic constructor •() → self::Class3a
+ : super core::Object::•()
+ ;
+}
+abstract class _Class3b&Class3a&Mixin1 = self::Class3a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class3b&Class3a&Mixin1
+ : super self::Class3a::•()
+ ;
+ mixin-super-stub get _#Mixin1#field1() → core::int?
+ return super.{self::Mixin1::_#Mixin1#field1};
+ mixin-super-stub set _#Mixin1#field1(core::int? value) → void
+ return super.{self::Mixin1::_#Mixin1#field1} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int field1#param) → void
+ return super.{self::Mixin1::field1} = field1#param;
+ mixin-super-stub get _#Mixin1#field2() → core::int?
+ return super.{self::Mixin1::_#Mixin1#field2};
+ mixin-super-stub set _#Mixin1#field2(core::int? value) → void
+ return super.{self::Mixin1::_#Mixin1#field2} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int field2#param) → void
+ return super.{self::Mixin1::field2} = field2#param;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class3b extends self::_Class3b&Class3a&Mixin1 {
+ synthetic constructor •() → self::Class3b
+ : super self::_Class3b&Class3a&Mixin1::•()
+ ;
+ static method _#new#tearOff() → self::Class3b
+ return new self::Class3b::•();
+}
+abstract class Class4a extends mai::Super1 implements mai::Super2 {
+ synthetic constructor •() → self::Class4a
+ : super mai::Super1::•()
+ ;
+}
+abstract class _Class4b&Class4a&Mixin2 = self::Class4a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class4b&Class4a&Mixin2
+ : super self::Class4a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int field1#param) → void
+ return super.{mai::Mixin2::field1} = field1#param;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int field2#param) → void
+ return super.{mai::Mixin2::field2} = field2#param;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get _#Mixin2#field1() → core::int?
+ return super.{mai::Mixin2::_#Mixin2#field1};
+ mixin-super-stub set _#Mixin2#field1(core::int? value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1} = value;
+ mixin-super-stub get _#Mixin2#field2() → core::int?
+ return super.{mai::Mixin2::_#Mixin2#field2};
+ mixin-super-stub set _#Mixin2#field2(core::int? value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class4b extends self::_Class4b&Class4a&Mixin2 {
+ synthetic constructor •() → self::Class4b
+ : super self::_Class4b&Class4a&Mixin2::•()
+ ;
+ static method _#new#tearOff() → self::Class4b
+ return new self::Class4b::•();
+}
+abstract class Class5a extends mai::Super2 implements mai::Super1 {
+ synthetic constructor •() → self::Class5a
+ : super mai::Super2::•()
+ ;
+}
+abstract class _Class5b&Class5a&Mixin2 = self::Class5a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class5b&Class5a&Mixin2
+ : super self::Class5a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int field1#param) → void
+ return super.{mai::Mixin2::field1} = field1#param;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int field2#param) → void
+ return super.{mai::Mixin2::field2} = field2#param;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get _#Mixin2#field1() → core::int?
+ return super.{mai::Mixin2::_#Mixin2#field1};
+ mixin-super-stub set _#Mixin2#field1(core::int? value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1} = value;
+ mixin-super-stub get _#Mixin2#field2() → core::int?
+ return super.{mai::Mixin2::_#Mixin2#field2};
+ mixin-super-stub set _#Mixin2#field2(core::int? value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class5b extends self::_Class5b&Class5a&Mixin2 {
+ synthetic constructor •() → self::Class5b
+ : super self::_Class5b&Class5a&Mixin2::•()
+ ;
+ static method _#new#tearOff() → self::Class5b
+ return new self::Class5b::•();
+}
+abstract class Class6a extends core::Object implements mai::Super1, mai::Super2 {
+ synthetic constructor •() → self::Class6a
+ : super core::Object::•()
+ ;
+}
+abstract class _Class6b&Class6a&Mixin2 = self::Class6a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class6b&Class6a&Mixin2
+ : super self::Class6a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int field1#param) → void
+ return super.{mai::Mixin2::field1} = field1#param;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int field2#param) → void
+ return super.{mai::Mixin2::field2} = field2#param;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get _#Mixin2#field1() → core::int?
+ return super.{mai::Mixin2::_#Mixin2#field1};
+ mixin-super-stub set _#Mixin2#field1(core::int? value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1} = value;
+ mixin-super-stub get _#Mixin2#field2() → core::int?
+ return super.{mai::Mixin2::_#Mixin2#field2};
+ mixin-super-stub set _#Mixin2#field2(core::int? value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class6b extends self::_Class6b&Class6a&Mixin2 {
+ synthetic constructor •() → self::Class6b
+ : super self::_Class6b&Class6a&Mixin2::•()
+ ;
+ static method _#new#tearOff() → self::Class6b
+ return new self::Class6b::•();
+}
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+
+class Super1 extends core::Object {
+ field core::int field1 = 42;
+ field core::int property1 = 42;
+ synthetic constructor •() → mai::Super1
+ : super core::Object::•()
+ ;
+ method method1() → void {}
+ static method _#new#tearOff() → mai::Super1
+ return new mai::Super1::•();
+}
+class Super2 extends core::Object {
+ field core::int field2 = 87;
+ field core::int property2 = 87;
+ synthetic constructor •() → mai::Super2
+ : super core::Object::•()
+ ;
+ method method2() → void {}
+ static method _#new#tearOff() → mai::Super2
+ return new mai::Super2::•();
+}
+abstract class _Mixin2&Super1&Super2 extends core::Object implements mai::Super1, mai::Super2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → mai::_Mixin2&Super1&Super2
+ : super core::Object::•()
+ ;
+}
+abstract class Mixin2 extends mai::_Mixin2&Super1&Super2 /*isMixinDeclaration*/ {
+ field core::int? _#Mixin2#field1 = null;
+ field core::int? _#Mixin2#field2 = null;
+ get field1() → core::int
+ return let final core::int? #t3 = this.{mai::Mixin2::_#Mixin2#field1}{core::int?} in #t3 == null ?{core::int} this.{mai::Mixin2::_#Mixin2#field1} = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int} : #t3{core::int};
+ set field1(core::int field1#param) → void
+ this.{mai::Mixin2::_#Mixin2#field1} = field1#param;
+ get field2() → core::int
+ return let final core::int? #t4 = this.{mai::Mixin2::_#Mixin2#field2}{core::int?} in #t4 == null ?{core::int} this.{mai::Mixin2::_#Mixin2#field2} = (() → core::int {
+ return 88;
+ })(){() → core::int} : #t4{core::int};
+ set field2(core::int field2#param) → void
+ this.{mai::Mixin2::_#Mixin2#field2} = field2#param;
+ method method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ method method2() → void {}
+ get property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ set property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ get property2() → core::int {
+ return 42;
+ }
+ set property2(core::int value) → void {}
+}
diff --git a/pkg/front_end/testcases/dartdevc/mixin_super/main.dart.strong.transformed.expect b/pkg/front_end/testcases/dartdevc/mixin_super/main.dart.strong.transformed.expect
new file mode 100644
index 0000000..82b5515
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/mixin_super/main.dart.strong.transformed.expect
@@ -0,0 +1,515 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:9:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:9:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:17:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:23:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:9:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:9:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:17:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:23:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:19:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:19:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:33:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:37:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:19:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:19:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:33:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:37:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+import self as self;
+import "dart:core" as core;
+import "main_lib.dart" as mai;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+abstract class _Mixin1&Super1&Super2 extends core::Object implements mai::Super1, mai::Super2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Mixin1&Super1&Super2
+ : super core::Object::•()
+ ;
+}
+abstract class Mixin1 extends self::_Mixin1&Super1&Super2 /*isMixinDeclaration*/ {
+ field core::int? _#Mixin1#field1 = null;
+ field core::int? _#Mixin1#field2 = null;
+ get field1() → core::int
+ return let final core::int? #t1 = this.{self::Mixin1::_#Mixin1#field1}{core::int?} in #t1 == null ?{core::int} this.{self::Mixin1::_#Mixin1#field1} = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int} : #t1{core::int};
+ set field1(core::int field1#param) → void
+ this.{self::Mixin1::_#Mixin1#field1} = field1#param;
+ get field2() → core::int
+ return let final core::int? #t2 = this.{self::Mixin1::_#Mixin1#field2}{core::int?} in #t2 == null ?{core::int} this.{self::Mixin1::_#Mixin1#field2} = (() → core::int {
+ return 88;
+ })(){() → core::int} : #t2{core::int};
+ set field2(core::int field2#param) → void
+ this.{self::Mixin1::_#Mixin1#field2} = field2#param;
+ method method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ method method2() → void {}
+ get property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ set property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ get property2() → core::int {
+ return 42;
+ }
+ set property2(core::int value) → void {}
+}
+abstract class Class1a extends mai::Super1 implements mai::Super2 {
+ synthetic constructor •() → self::Class1a
+ : super mai::Super1::•()
+ ;
+}
+abstract class _Class1b&Class1a&Mixin1 = self::Class1a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class1b&Class1a&Mixin1
+ : super self::Class1a::•()
+ ;
+ mixin-super-stub get _#Mixin1#field1() → core::int?
+ return super.{self::Mixin1::_#Mixin1#field1};
+ mixin-super-stub set _#Mixin1#field1(core::int? value) → void
+ return super.{self::Mixin1::_#Mixin1#field1} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int field1#param) → void
+ return super.{self::Mixin1::field1} = field1#param;
+ mixin-super-stub get _#Mixin1#field2() → core::int?
+ return super.{self::Mixin1::_#Mixin1#field2};
+ mixin-super-stub set _#Mixin1#field2(core::int? value) → void
+ return super.{self::Mixin1::_#Mixin1#field2} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int field2#param) → void
+ return super.{self::Mixin1::field2} = field2#param;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class1b extends self::_Class1b&Class1a&Mixin1 {
+ synthetic constructor •() → self::Class1b
+ : super self::_Class1b&Class1a&Mixin1::•()
+ ;
+ static method _#new#tearOff() → self::Class1b
+ return new self::Class1b::•();
+}
+abstract class Class2a extends mai::Super2 implements mai::Super1 {
+ synthetic constructor •() → self::Class2a
+ : super mai::Super2::•()
+ ;
+}
+abstract class _Class2b&Class2a&Mixin1 = self::Class2a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class2b&Class2a&Mixin1
+ : super self::Class2a::•()
+ ;
+ mixin-super-stub get _#Mixin1#field1() → core::int?
+ return super.{self::Mixin1::_#Mixin1#field1};
+ mixin-super-stub set _#Mixin1#field1(core::int? value) → void
+ return super.{self::Mixin1::_#Mixin1#field1} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int field1#param) → void
+ return super.{self::Mixin1::field1} = field1#param;
+ mixin-super-stub get _#Mixin1#field2() → core::int?
+ return super.{self::Mixin1::_#Mixin1#field2};
+ mixin-super-stub set _#Mixin1#field2(core::int? value) → void
+ return super.{self::Mixin1::_#Mixin1#field2} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int field2#param) → void
+ return super.{self::Mixin1::field2} = field2#param;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class2b extends self::_Class2b&Class2a&Mixin1 {
+ synthetic constructor •() → self::Class2b
+ : super self::_Class2b&Class2a&Mixin1::•()
+ ;
+ static method _#new#tearOff() → self::Class2b
+ return new self::Class2b::•();
+}
+abstract class Class3a extends core::Object implements mai::Super1, mai::Super2 {
+ synthetic constructor •() → self::Class3a
+ : super core::Object::•()
+ ;
+}
+abstract class _Class3b&Class3a&Mixin1 = self::Class3a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class3b&Class3a&Mixin1
+ : super self::Class3a::•()
+ ;
+ mixin-super-stub get _#Mixin1#field1() → core::int?
+ return super.{self::Mixin1::_#Mixin1#field1};
+ mixin-super-stub set _#Mixin1#field1(core::int? value) → void
+ return super.{self::Mixin1::_#Mixin1#field1} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int field1#param) → void
+ return super.{self::Mixin1::field1} = field1#param;
+ mixin-super-stub get _#Mixin1#field2() → core::int?
+ return super.{self::Mixin1::_#Mixin1#field2};
+ mixin-super-stub set _#Mixin1#field2(core::int? value) → void
+ return super.{self::Mixin1::_#Mixin1#field2} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int field2#param) → void
+ return super.{self::Mixin1::field2} = field2#param;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class3b extends self::_Class3b&Class3a&Mixin1 {
+ synthetic constructor •() → self::Class3b
+ : super self::_Class3b&Class3a&Mixin1::•()
+ ;
+ static method _#new#tearOff() → self::Class3b
+ return new self::Class3b::•();
+}
+abstract class Class4a extends mai::Super1 implements mai::Super2 {
+ synthetic constructor •() → self::Class4a
+ : super mai::Super1::•()
+ ;
+}
+abstract class _Class4b&Class4a&Mixin2 = self::Class4a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class4b&Class4a&Mixin2
+ : super self::Class4a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int field1#param) → void
+ return super.{mai::Mixin2::field1} = field1#param;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int field2#param) → void
+ return super.{mai::Mixin2::field2} = field2#param;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get _#Mixin2#field1() → core::int?
+ return super.{mai::Mixin2::_#Mixin2#field1};
+ mixin-super-stub set _#Mixin2#field1(core::int? value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1} = value;
+ mixin-super-stub get _#Mixin2#field2() → core::int?
+ return super.{mai::Mixin2::_#Mixin2#field2};
+ mixin-super-stub set _#Mixin2#field2(core::int? value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class4b extends self::_Class4b&Class4a&Mixin2 {
+ synthetic constructor •() → self::Class4b
+ : super self::_Class4b&Class4a&Mixin2::•()
+ ;
+ static method _#new#tearOff() → self::Class4b
+ return new self::Class4b::•();
+}
+abstract class Class5a extends mai::Super2 implements mai::Super1 {
+ synthetic constructor •() → self::Class5a
+ : super mai::Super2::•()
+ ;
+}
+abstract class _Class5b&Class5a&Mixin2 = self::Class5a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class5b&Class5a&Mixin2
+ : super self::Class5a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int field1#param) → void
+ return super.{mai::Mixin2::field1} = field1#param;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int field2#param) → void
+ return super.{mai::Mixin2::field2} = field2#param;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get _#Mixin2#field1() → core::int?
+ return super.{mai::Mixin2::_#Mixin2#field1};
+ mixin-super-stub set _#Mixin2#field1(core::int? value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1} = value;
+ mixin-super-stub get _#Mixin2#field2() → core::int?
+ return super.{mai::Mixin2::_#Mixin2#field2};
+ mixin-super-stub set _#Mixin2#field2(core::int? value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class5b extends self::_Class5b&Class5a&Mixin2 {
+ synthetic constructor •() → self::Class5b
+ : super self::_Class5b&Class5a&Mixin2::•()
+ ;
+ static method _#new#tearOff() → self::Class5b
+ return new self::Class5b::•();
+}
+abstract class Class6a extends core::Object implements mai::Super1, mai::Super2 {
+ synthetic constructor •() → self::Class6a
+ : super core::Object::•()
+ ;
+}
+abstract class _Class6b&Class6a&Mixin2 = self::Class6a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class6b&Class6a&Mixin2
+ : super self::Class6a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int field1#param) → void
+ return super.{mai::Mixin2::field1} = field1#param;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int field2#param) → void
+ return super.{mai::Mixin2::field2} = field2#param;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get _#Mixin2#field1() → core::int?
+ return super.{mai::Mixin2::_#Mixin2#field1};
+ mixin-super-stub set _#Mixin2#field1(core::int? value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1} = value;
+ mixin-super-stub get _#Mixin2#field2() → core::int?
+ return super.{mai::Mixin2::_#Mixin2#field2};
+ mixin-super-stub set _#Mixin2#field2(core::int? value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class6b extends self::_Class6b&Class6a&Mixin2 {
+ synthetic constructor •() → self::Class6b
+ : super self::_Class6b&Class6a&Mixin2::•()
+ ;
+ static method _#new#tearOff() → self::Class6b
+ return new self::Class6b::•();
+}
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+
+class Super1 extends core::Object {
+ field core::int field1 = 42;
+ field core::int property1 = 42;
+ synthetic constructor •() → mai::Super1
+ : super core::Object::•()
+ ;
+ method method1() → void {}
+ static method _#new#tearOff() → mai::Super1
+ return new mai::Super1::•();
+}
+class Super2 extends core::Object {
+ field core::int field2 = 87;
+ field core::int property2 = 87;
+ synthetic constructor •() → mai::Super2
+ : super core::Object::•()
+ ;
+ method method2() → void {}
+ static method _#new#tearOff() → mai::Super2
+ return new mai::Super2::•();
+}
+abstract class _Mixin2&Super1&Super2 extends core::Object implements mai::Super1, mai::Super2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → mai::_Mixin2&Super1&Super2
+ : super core::Object::•()
+ ;
+}
+abstract class Mixin2 extends mai::_Mixin2&Super1&Super2 /*isMixinDeclaration*/ {
+ field core::int? _#Mixin2#field1 = null;
+ field core::int? _#Mixin2#field2 = null;
+ get field1() → core::int
+ return let final core::int? #t3 = this.{mai::Mixin2::_#Mixin2#field1}{core::int?} in #t3 == null ?{core::int} this.{mai::Mixin2::_#Mixin2#field1} = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int} : #t3{core::int};
+ set field1(core::int field1#param) → void
+ this.{mai::Mixin2::_#Mixin2#field1} = field1#param;
+ get field2() → core::int
+ return let final core::int? #t4 = this.{mai::Mixin2::_#Mixin2#field2}{core::int?} in #t4 == null ?{core::int} this.{mai::Mixin2::_#Mixin2#field2} = (() → core::int {
+ return 88;
+ })(){() → core::int} : #t4{core::int};
+ set field2(core::int field2#param) → void
+ this.{mai::Mixin2::_#Mixin2#field2} = field2#param;
+ method method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ method method2() → void {}
+ get property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ set property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ get property2() → core::int {
+ return 42;
+ }
+ set property2(core::int value) → void {}
+}
diff --git a/pkg/front_end/testcases/dartdevc/mixin_super/main.dart.textual_outline.expect b/pkg/front_end/testcases/dartdevc/mixin_super/main.dart.textual_outline.expect
new file mode 100644
index 0000000..105f962
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/mixin_super/main.dart.textual_outline.expect
@@ -0,0 +1,40 @@
+import 'main_lib.dart';
+
+mixin Mixin1 on Super1, Super2 {
+ late int field1 = () {
+ return super.field1 = super.field1 + 1;
+ }();
+ late int field2 = () {
+ return 88;
+ }();
+ void method1() {}
+ void method2() {}
+ int get property1 {}
+ void set property1(int value) {}
+ int get property2 {}
+ void set property2(int value) {}
+}
+
+abstract class Class1a extends Super1 implements Super2 {}
+
+class Class1b extends Class1a with Mixin1 {}
+
+abstract class Class2a extends Super2 implements Super1 {}
+
+class Class2b extends Class2a with Mixin1 {}
+
+abstract class Class3a implements Super1, Super2 {}
+
+class Class3b extends Class3a with Mixin1 {}
+
+abstract class Class4a extends Super1 implements Super2 {}
+
+class Class4b extends Class4a with Mixin2 {}
+
+abstract class Class5a extends Super2 implements Super1 {}
+
+class Class5b extends Class5a with Mixin2 {}
+
+abstract class Class6a implements Super1, Super2 {}
+
+class Class6b extends Class6a with Mixin2 {}
diff --git a/pkg/front_end/testcases/dartdevc/mixin_super/main.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/dartdevc/mixin_super/main.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..d1d920c
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/mixin_super/main.dart.textual_outline_modelled.expect
@@ -0,0 +1,40 @@
+import 'main_lib.dart';
+
+abstract class Class1a extends Super1 implements Super2 {}
+
+abstract class Class2a extends Super2 implements Super1 {}
+
+abstract class Class3a implements Super1, Super2 {}
+
+abstract class Class4a extends Super1 implements Super2 {}
+
+abstract class Class5a extends Super2 implements Super1 {}
+
+abstract class Class6a implements Super1, Super2 {}
+
+class Class1b extends Class1a with Mixin1 {}
+
+class Class2b extends Class2a with Mixin1 {}
+
+class Class3b extends Class3a with Mixin1 {}
+
+class Class4b extends Class4a with Mixin2 {}
+
+class Class5b extends Class5a with Mixin2 {}
+
+class Class6b extends Class6a with Mixin2 {}
+
+mixin Mixin1 on Super1, Super2 {
+ int get property1 {}
+ int get property2 {}
+ late int field1 = () {
+ return super.field1 = super.field1 + 1;
+ }();
+ late int field2 = () {
+ return 88;
+ }();
+ void method1() {}
+ void method2() {}
+ void set property1(int value) {}
+ void set property2(int value) {}
+}
diff --git a/pkg/front_end/testcases/dartdevc/mixin_super/main.dart.weak.expect b/pkg/front_end/testcases/dartdevc/mixin_super/main.dart.weak.expect
new file mode 100644
index 0000000..8b5e70c
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/mixin_super/main.dart.weak.expect
@@ -0,0 +1,595 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:9:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:9:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:17:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:23:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:9:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:9:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:17:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:23:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:19:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:19:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:33:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:37:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:19:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:19:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:33:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:37:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+import self as self;
+import "dart:core" as core;
+import "main_lib.dart" as mai;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+abstract class _Mixin1&Super1&Super2 extends core::Object implements mai::Super1, mai::Super2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Mixin1&Super1&Super2
+ : super core::Object::•()
+ ;
+}
+abstract class Mixin1 extends self::_Mixin1&Super1&Super2 /*isMixinDeclaration*/ {
+ field core::int? _#Mixin1#field1 = null;
+ field core::bool _#Mixin1#field1#isSet = false;
+ field core::int? _#Mixin1#field2 = null;
+ field core::bool _#Mixin1#field2#isSet = false;
+ get field1() → core::int {
+ if(!this.{self::Mixin1::_#Mixin1#field1#isSet}{core::bool}) {
+ this.{self::Mixin1::_#Mixin1#field1} = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int};
+ this.{self::Mixin1::_#Mixin1#field1#isSet} = true;
+ }
+ return let final core::int? #t1 = this.{self::Mixin1::_#Mixin1#field1}{core::int?} in #t1{core::int};
+ }
+ set field1(core::int field1#param) → void {
+ this.{self::Mixin1::_#Mixin1#field1#isSet} = true;
+ this.{self::Mixin1::_#Mixin1#field1} = field1#param;
+ }
+ get field2() → core::int {
+ if(!this.{self::Mixin1::_#Mixin1#field2#isSet}{core::bool}) {
+ this.{self::Mixin1::_#Mixin1#field2} = (() → core::int {
+ return 88;
+ })(){() → core::int};
+ this.{self::Mixin1::_#Mixin1#field2#isSet} = true;
+ }
+ return let final core::int? #t2 = this.{self::Mixin1::_#Mixin1#field2}{core::int?} in #t2{core::int};
+ }
+ set field2(core::int field2#param) → void {
+ this.{self::Mixin1::_#Mixin1#field2#isSet} = true;
+ this.{self::Mixin1::_#Mixin1#field2} = field2#param;
+ }
+ method method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ method method2() → void {}
+ get property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ set property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ get property2() → core::int {
+ return 42;
+ }
+ set property2(core::int value) → void {}
+}
+abstract class Class1a extends mai::Super1 implements mai::Super2 {
+ synthetic constructor •() → self::Class1a
+ : super mai::Super1::•()
+ ;
+}
+abstract class _Class1b&Class1a&Mixin1 = self::Class1a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class1b&Class1a&Mixin1
+ : super self::Class1a::•()
+ ;
+ mixin-super-stub get _#Mixin1#field1() → core::int?
+ return super.{self::Mixin1::_#Mixin1#field1};
+ mixin-super-stub set _#Mixin1#field1(core::int? value) → void
+ return super.{self::Mixin1::_#Mixin1#field1} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int field1#param) → void
+ return super.{self::Mixin1::field1} = field1#param;
+ mixin-super-stub get _#Mixin1#field1#isSet() → core::bool
+ return super.{self::Mixin1::_#Mixin1#field1#isSet};
+ mixin-super-stub set _#Mixin1#field1#isSet(core::bool value) → void
+ return super.{self::Mixin1::_#Mixin1#field1#isSet} = value;
+ mixin-super-stub get _#Mixin1#field2() → core::int?
+ return super.{self::Mixin1::_#Mixin1#field2};
+ mixin-super-stub set _#Mixin1#field2(core::int? value) → void
+ return super.{self::Mixin1::_#Mixin1#field2} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int field2#param) → void
+ return super.{self::Mixin1::field2} = field2#param;
+ mixin-super-stub get _#Mixin1#field2#isSet() → core::bool
+ return super.{self::Mixin1::_#Mixin1#field2#isSet};
+ mixin-super-stub set _#Mixin1#field2#isSet(core::bool value) → void
+ return super.{self::Mixin1::_#Mixin1#field2#isSet} = value;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class1b extends self::_Class1b&Class1a&Mixin1 {
+ synthetic constructor •() → self::Class1b
+ : super self::_Class1b&Class1a&Mixin1::•()
+ ;
+ static method _#new#tearOff() → self::Class1b
+ return new self::Class1b::•();
+}
+abstract class Class2a extends mai::Super2 implements mai::Super1 {
+ synthetic constructor •() → self::Class2a
+ : super mai::Super2::•()
+ ;
+}
+abstract class _Class2b&Class2a&Mixin1 = self::Class2a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class2b&Class2a&Mixin1
+ : super self::Class2a::•()
+ ;
+ mixin-super-stub get _#Mixin1#field1() → core::int?
+ return super.{self::Mixin1::_#Mixin1#field1};
+ mixin-super-stub set _#Mixin1#field1(core::int? value) → void
+ return super.{self::Mixin1::_#Mixin1#field1} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int field1#param) → void
+ return super.{self::Mixin1::field1} = field1#param;
+ mixin-super-stub get _#Mixin1#field1#isSet() → core::bool
+ return super.{self::Mixin1::_#Mixin1#field1#isSet};
+ mixin-super-stub set _#Mixin1#field1#isSet(core::bool value) → void
+ return super.{self::Mixin1::_#Mixin1#field1#isSet} = value;
+ mixin-super-stub get _#Mixin1#field2() → core::int?
+ return super.{self::Mixin1::_#Mixin1#field2};
+ mixin-super-stub set _#Mixin1#field2(core::int? value) → void
+ return super.{self::Mixin1::_#Mixin1#field2} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int field2#param) → void
+ return super.{self::Mixin1::field2} = field2#param;
+ mixin-super-stub get _#Mixin1#field2#isSet() → core::bool
+ return super.{self::Mixin1::_#Mixin1#field2#isSet};
+ mixin-super-stub set _#Mixin1#field2#isSet(core::bool value) → void
+ return super.{self::Mixin1::_#Mixin1#field2#isSet} = value;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class2b extends self::_Class2b&Class2a&Mixin1 {
+ synthetic constructor •() → self::Class2b
+ : super self::_Class2b&Class2a&Mixin1::•()
+ ;
+ static method _#new#tearOff() → self::Class2b
+ return new self::Class2b::•();
+}
+abstract class Class3a extends core::Object implements mai::Super1, mai::Super2 {
+ synthetic constructor •() → self::Class3a
+ : super core::Object::•()
+ ;
+}
+abstract class _Class3b&Class3a&Mixin1 = self::Class3a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class3b&Class3a&Mixin1
+ : super self::Class3a::•()
+ ;
+ mixin-super-stub get _#Mixin1#field1() → core::int?
+ return super.{self::Mixin1::_#Mixin1#field1};
+ mixin-super-stub set _#Mixin1#field1(core::int? value) → void
+ return super.{self::Mixin1::_#Mixin1#field1} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int field1#param) → void
+ return super.{self::Mixin1::field1} = field1#param;
+ mixin-super-stub get _#Mixin1#field1#isSet() → core::bool
+ return super.{self::Mixin1::_#Mixin1#field1#isSet};
+ mixin-super-stub set _#Mixin1#field1#isSet(core::bool value) → void
+ return super.{self::Mixin1::_#Mixin1#field1#isSet} = value;
+ mixin-super-stub get _#Mixin1#field2() → core::int?
+ return super.{self::Mixin1::_#Mixin1#field2};
+ mixin-super-stub set _#Mixin1#field2(core::int? value) → void
+ return super.{self::Mixin1::_#Mixin1#field2} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int field2#param) → void
+ return super.{self::Mixin1::field2} = field2#param;
+ mixin-super-stub get _#Mixin1#field2#isSet() → core::bool
+ return super.{self::Mixin1::_#Mixin1#field2#isSet};
+ mixin-super-stub set _#Mixin1#field2#isSet(core::bool value) → void
+ return super.{self::Mixin1::_#Mixin1#field2#isSet} = value;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class3b extends self::_Class3b&Class3a&Mixin1 {
+ synthetic constructor •() → self::Class3b
+ : super self::_Class3b&Class3a&Mixin1::•()
+ ;
+ static method _#new#tearOff() → self::Class3b
+ return new self::Class3b::•();
+}
+abstract class Class4a extends mai::Super1 implements mai::Super2 {
+ synthetic constructor •() → self::Class4a
+ : super mai::Super1::•()
+ ;
+}
+abstract class _Class4b&Class4a&Mixin2 = self::Class4a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class4b&Class4a&Mixin2
+ : super self::Class4a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int field1#param) → void
+ return super.{mai::Mixin2::field1} = field1#param;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int field2#param) → void
+ return super.{mai::Mixin2::field2} = field2#param;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get _#Mixin2#field1() → core::int?
+ return super.{mai::Mixin2::_#Mixin2#field1};
+ mixin-super-stub set _#Mixin2#field1(core::int? value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1} = value;
+ mixin-super-stub get _#Mixin2#field1#isSet() → core::bool
+ return super.{mai::Mixin2::_#Mixin2#field1#isSet};
+ mixin-super-stub set _#Mixin2#field1#isSet(core::bool value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1#isSet} = value;
+ mixin-super-stub get _#Mixin2#field2() → core::int?
+ return super.{mai::Mixin2::_#Mixin2#field2};
+ mixin-super-stub set _#Mixin2#field2(core::int? value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2} = value;
+ mixin-super-stub get _#Mixin2#field2#isSet() → core::bool
+ return super.{mai::Mixin2::_#Mixin2#field2#isSet};
+ mixin-super-stub set _#Mixin2#field2#isSet(core::bool value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2#isSet} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class4b extends self::_Class4b&Class4a&Mixin2 {
+ synthetic constructor •() → self::Class4b
+ : super self::_Class4b&Class4a&Mixin2::•()
+ ;
+ static method _#new#tearOff() → self::Class4b
+ return new self::Class4b::•();
+}
+abstract class Class5a extends mai::Super2 implements mai::Super1 {
+ synthetic constructor •() → self::Class5a
+ : super mai::Super2::•()
+ ;
+}
+abstract class _Class5b&Class5a&Mixin2 = self::Class5a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class5b&Class5a&Mixin2
+ : super self::Class5a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int field1#param) → void
+ return super.{mai::Mixin2::field1} = field1#param;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int field2#param) → void
+ return super.{mai::Mixin2::field2} = field2#param;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get _#Mixin2#field1() → core::int?
+ return super.{mai::Mixin2::_#Mixin2#field1};
+ mixin-super-stub set _#Mixin2#field1(core::int? value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1} = value;
+ mixin-super-stub get _#Mixin2#field1#isSet() → core::bool
+ return super.{mai::Mixin2::_#Mixin2#field1#isSet};
+ mixin-super-stub set _#Mixin2#field1#isSet(core::bool value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1#isSet} = value;
+ mixin-super-stub get _#Mixin2#field2() → core::int?
+ return super.{mai::Mixin2::_#Mixin2#field2};
+ mixin-super-stub set _#Mixin2#field2(core::int? value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2} = value;
+ mixin-super-stub get _#Mixin2#field2#isSet() → core::bool
+ return super.{mai::Mixin2::_#Mixin2#field2#isSet};
+ mixin-super-stub set _#Mixin2#field2#isSet(core::bool value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2#isSet} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class5b extends self::_Class5b&Class5a&Mixin2 {
+ synthetic constructor •() → self::Class5b
+ : super self::_Class5b&Class5a&Mixin2::•()
+ ;
+ static method _#new#tearOff() → self::Class5b
+ return new self::Class5b::•();
+}
+abstract class Class6a extends core::Object implements mai::Super1, mai::Super2 {
+ synthetic constructor •() → self::Class6a
+ : super core::Object::•()
+ ;
+}
+abstract class _Class6b&Class6a&Mixin2 = self::Class6a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class6b&Class6a&Mixin2
+ : super self::Class6a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int field1#param) → void
+ return super.{mai::Mixin2::field1} = field1#param;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int field2#param) → void
+ return super.{mai::Mixin2::field2} = field2#param;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get _#Mixin2#field1() → core::int?
+ return super.{mai::Mixin2::_#Mixin2#field1};
+ mixin-super-stub set _#Mixin2#field1(core::int? value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1} = value;
+ mixin-super-stub get _#Mixin2#field1#isSet() → core::bool
+ return super.{mai::Mixin2::_#Mixin2#field1#isSet};
+ mixin-super-stub set _#Mixin2#field1#isSet(core::bool value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1#isSet} = value;
+ mixin-super-stub get _#Mixin2#field2() → core::int?
+ return super.{mai::Mixin2::_#Mixin2#field2};
+ mixin-super-stub set _#Mixin2#field2(core::int? value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2} = value;
+ mixin-super-stub get _#Mixin2#field2#isSet() → core::bool
+ return super.{mai::Mixin2::_#Mixin2#field2#isSet};
+ mixin-super-stub set _#Mixin2#field2#isSet(core::bool value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2#isSet} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class6b extends self::_Class6b&Class6a&Mixin2 {
+ synthetic constructor •() → self::Class6b
+ : super self::_Class6b&Class6a&Mixin2::•()
+ ;
+ static method _#new#tearOff() → self::Class6b
+ return new self::Class6b::•();
+}
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+
+class Super1 extends core::Object {
+ field core::int field1 = 42;
+ field core::int property1 = 42;
+ synthetic constructor •() → mai::Super1
+ : super core::Object::•()
+ ;
+ method method1() → void {}
+ static method _#new#tearOff() → mai::Super1
+ return new mai::Super1::•();
+}
+class Super2 extends core::Object {
+ field core::int field2 = 87;
+ field core::int property2 = 87;
+ synthetic constructor •() → mai::Super2
+ : super core::Object::•()
+ ;
+ method method2() → void {}
+ static method _#new#tearOff() → mai::Super2
+ return new mai::Super2::•();
+}
+abstract class _Mixin2&Super1&Super2 extends core::Object implements mai::Super1, mai::Super2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → mai::_Mixin2&Super1&Super2
+ : super core::Object::•()
+ ;
+}
+abstract class Mixin2 extends mai::_Mixin2&Super1&Super2 /*isMixinDeclaration*/ {
+ field core::int? _#Mixin2#field1 = null;
+ field core::bool _#Mixin2#field1#isSet = false;
+ field core::int? _#Mixin2#field2 = null;
+ field core::bool _#Mixin2#field2#isSet = false;
+ get field1() → core::int {
+ if(!this.{mai::Mixin2::_#Mixin2#field1#isSet}{core::bool}) {
+ this.{mai::Mixin2::_#Mixin2#field1} = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int};
+ this.{mai::Mixin2::_#Mixin2#field1#isSet} = true;
+ }
+ return let final core::int? #t3 = this.{mai::Mixin2::_#Mixin2#field1}{core::int?} in #t3{core::int};
+ }
+ set field1(core::int field1#param) → void {
+ this.{mai::Mixin2::_#Mixin2#field1#isSet} = true;
+ this.{mai::Mixin2::_#Mixin2#field1} = field1#param;
+ }
+ get field2() → core::int {
+ if(!this.{mai::Mixin2::_#Mixin2#field2#isSet}{core::bool}) {
+ this.{mai::Mixin2::_#Mixin2#field2} = (() → core::int {
+ return 88;
+ })(){() → core::int};
+ this.{mai::Mixin2::_#Mixin2#field2#isSet} = true;
+ }
+ return let final core::int? #t4 = this.{mai::Mixin2::_#Mixin2#field2}{core::int?} in #t4{core::int};
+ }
+ set field2(core::int field2#param) → void {
+ this.{mai::Mixin2::_#Mixin2#field2#isSet} = true;
+ this.{mai::Mixin2::_#Mixin2#field2} = field2#param;
+ }
+ method method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ method method2() → void {}
+ get property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ set property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ get property2() → core::int {
+ return 42;
+ }
+ set property2(core::int value) → void {}
+}
diff --git a/pkg/front_end/testcases/dartdevc/mixin_super/main.dart.weak.modular.expect b/pkg/front_end/testcases/dartdevc/mixin_super/main.dart.weak.modular.expect
new file mode 100644
index 0000000..44eb126
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/mixin_super/main.dart.weak.modular.expect
@@ -0,0 +1,449 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:9:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:9:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:17:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:23:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:9:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:9:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:17:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:23:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+import self as self;
+import "dart:core" as core;
+import "main_lib.dart" as mai;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+abstract class _Mixin1&Super1&Super2 extends core::Object implements mai::Super1, mai::Super2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Mixin1&Super1&Super2
+ : super core::Object::•()
+ ;
+}
+abstract class Mixin1 extends self::_Mixin1&Super1&Super2 /*isMixinDeclaration*/ {
+ field core::int? _#Mixin1#field1 = null;
+ field core::bool _#Mixin1#field1#isSet = false;
+ field core::int? _#Mixin1#field2 = null;
+ field core::bool _#Mixin1#field2#isSet = false;
+ get field1() → core::int {
+ if(!this.{self::Mixin1::_#Mixin1#field1#isSet}{core::bool}) {
+ this.{self::Mixin1::_#Mixin1#field1} = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int};
+ this.{self::Mixin1::_#Mixin1#field1#isSet} = true;
+ }
+ return let final core::int? #t1 = this.{self::Mixin1::_#Mixin1#field1}{core::int?} in #t1{core::int};
+ }
+ set field1(core::int field1#param) → void {
+ this.{self::Mixin1::_#Mixin1#field1#isSet} = true;
+ this.{self::Mixin1::_#Mixin1#field1} = field1#param;
+ }
+ get field2() → core::int {
+ if(!this.{self::Mixin1::_#Mixin1#field2#isSet}{core::bool}) {
+ this.{self::Mixin1::_#Mixin1#field2} = (() → core::int {
+ return 88;
+ })(){() → core::int};
+ this.{self::Mixin1::_#Mixin1#field2#isSet} = true;
+ }
+ return let final core::int? #t2 = this.{self::Mixin1::_#Mixin1#field2}{core::int?} in #t2{core::int};
+ }
+ set field2(core::int field2#param) → void {
+ this.{self::Mixin1::_#Mixin1#field2#isSet} = true;
+ this.{self::Mixin1::_#Mixin1#field2} = field2#param;
+ }
+ method method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ method method2() → void {}
+ get property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ set property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ get property2() → core::int {
+ return 42;
+ }
+ set property2(core::int value) → void {}
+}
+abstract class Class1a extends mai::Super1 implements mai::Super2 {
+ synthetic constructor •() → self::Class1a
+ : super mai::Super1::•()
+ ;
+}
+abstract class _Class1b&Class1a&Mixin1 = self::Class1a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class1b&Class1a&Mixin1
+ : super self::Class1a::•()
+ ;
+ mixin-super-stub get _#Mixin1#field1() → core::int?
+ return super.{self::Mixin1::_#Mixin1#field1};
+ mixin-super-stub set _#Mixin1#field1(core::int? value) → void
+ return super.{self::Mixin1::_#Mixin1#field1} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int field1#param) → void
+ return super.{self::Mixin1::field1} = field1#param;
+ mixin-super-stub get _#Mixin1#field1#isSet() → core::bool
+ return super.{self::Mixin1::_#Mixin1#field1#isSet};
+ mixin-super-stub set _#Mixin1#field1#isSet(core::bool value) → void
+ return super.{self::Mixin1::_#Mixin1#field1#isSet} = value;
+ mixin-super-stub get _#Mixin1#field2() → core::int?
+ return super.{self::Mixin1::_#Mixin1#field2};
+ mixin-super-stub set _#Mixin1#field2(core::int? value) → void
+ return super.{self::Mixin1::_#Mixin1#field2} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int field2#param) → void
+ return super.{self::Mixin1::field2} = field2#param;
+ mixin-super-stub get _#Mixin1#field2#isSet() → core::bool
+ return super.{self::Mixin1::_#Mixin1#field2#isSet};
+ mixin-super-stub set _#Mixin1#field2#isSet(core::bool value) → void
+ return super.{self::Mixin1::_#Mixin1#field2#isSet} = value;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class1b extends self::_Class1b&Class1a&Mixin1 {
+ synthetic constructor •() → self::Class1b
+ : super self::_Class1b&Class1a&Mixin1::•()
+ ;
+ static method _#new#tearOff() → self::Class1b
+ return new self::Class1b::•();
+}
+abstract class Class2a extends mai::Super2 implements mai::Super1 {
+ synthetic constructor •() → self::Class2a
+ : super mai::Super2::•()
+ ;
+}
+abstract class _Class2b&Class2a&Mixin1 = self::Class2a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class2b&Class2a&Mixin1
+ : super self::Class2a::•()
+ ;
+ mixin-super-stub get _#Mixin1#field1() → core::int?
+ return super.{self::Mixin1::_#Mixin1#field1};
+ mixin-super-stub set _#Mixin1#field1(core::int? value) → void
+ return super.{self::Mixin1::_#Mixin1#field1} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int field1#param) → void
+ return super.{self::Mixin1::field1} = field1#param;
+ mixin-super-stub get _#Mixin1#field1#isSet() → core::bool
+ return super.{self::Mixin1::_#Mixin1#field1#isSet};
+ mixin-super-stub set _#Mixin1#field1#isSet(core::bool value) → void
+ return super.{self::Mixin1::_#Mixin1#field1#isSet} = value;
+ mixin-super-stub get _#Mixin1#field2() → core::int?
+ return super.{self::Mixin1::_#Mixin1#field2};
+ mixin-super-stub set _#Mixin1#field2(core::int? value) → void
+ return super.{self::Mixin1::_#Mixin1#field2} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int field2#param) → void
+ return super.{self::Mixin1::field2} = field2#param;
+ mixin-super-stub get _#Mixin1#field2#isSet() → core::bool
+ return super.{self::Mixin1::_#Mixin1#field2#isSet};
+ mixin-super-stub set _#Mixin1#field2#isSet(core::bool value) → void
+ return super.{self::Mixin1::_#Mixin1#field2#isSet} = value;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class2b extends self::_Class2b&Class2a&Mixin1 {
+ synthetic constructor •() → self::Class2b
+ : super self::_Class2b&Class2a&Mixin1::•()
+ ;
+ static method _#new#tearOff() → self::Class2b
+ return new self::Class2b::•();
+}
+abstract class Class3a extends core::Object implements mai::Super1, mai::Super2 {
+ synthetic constructor •() → self::Class3a
+ : super core::Object::•()
+ ;
+}
+abstract class _Class3b&Class3a&Mixin1 = self::Class3a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class3b&Class3a&Mixin1
+ : super self::Class3a::•()
+ ;
+ mixin-super-stub get _#Mixin1#field1() → core::int?
+ return super.{self::Mixin1::_#Mixin1#field1};
+ mixin-super-stub set _#Mixin1#field1(core::int? value) → void
+ return super.{self::Mixin1::_#Mixin1#field1} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int field1#param) → void
+ return super.{self::Mixin1::field1} = field1#param;
+ mixin-super-stub get _#Mixin1#field1#isSet() → core::bool
+ return super.{self::Mixin1::_#Mixin1#field1#isSet};
+ mixin-super-stub set _#Mixin1#field1#isSet(core::bool value) → void
+ return super.{self::Mixin1::_#Mixin1#field1#isSet} = value;
+ mixin-super-stub get _#Mixin1#field2() → core::int?
+ return super.{self::Mixin1::_#Mixin1#field2};
+ mixin-super-stub set _#Mixin1#field2(core::int? value) → void
+ return super.{self::Mixin1::_#Mixin1#field2} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int field2#param) → void
+ return super.{self::Mixin1::field2} = field2#param;
+ mixin-super-stub get _#Mixin1#field2#isSet() → core::bool
+ return super.{self::Mixin1::_#Mixin1#field2#isSet};
+ mixin-super-stub set _#Mixin1#field2#isSet(core::bool value) → void
+ return super.{self::Mixin1::_#Mixin1#field2#isSet} = value;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class3b extends self::_Class3b&Class3a&Mixin1 {
+ synthetic constructor •() → self::Class3b
+ : super self::_Class3b&Class3a&Mixin1::•()
+ ;
+ static method _#new#tearOff() → self::Class3b
+ return new self::Class3b::•();
+}
+abstract class Class4a extends mai::Super1 implements mai::Super2 {
+ synthetic constructor •() → self::Class4a
+ : super mai::Super1::•()
+ ;
+}
+abstract class _Class4b&Class4a&Mixin2 = self::Class4a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class4b&Class4a&Mixin2
+ : super self::Class4a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int field1#param) → void
+ return super.{mai::Mixin2::field1} = field1#param;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int field2#param) → void
+ return super.{mai::Mixin2::field2} = field2#param;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get _#Mixin2#field1() → core::int?
+ return super.{mai::Mixin2::_#Mixin2#field1};
+ mixin-super-stub set _#Mixin2#field1(core::int? value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1} = value;
+ mixin-super-stub get _#Mixin2#field1#isSet() → core::bool
+ return super.{mai::Mixin2::_#Mixin2#field1#isSet};
+ mixin-super-stub set _#Mixin2#field1#isSet(core::bool value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1#isSet} = value;
+ mixin-super-stub get _#Mixin2#field2() → core::int?
+ return super.{mai::Mixin2::_#Mixin2#field2};
+ mixin-super-stub set _#Mixin2#field2(core::int? value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2} = value;
+ mixin-super-stub get _#Mixin2#field2#isSet() → core::bool
+ return super.{mai::Mixin2::_#Mixin2#field2#isSet};
+ mixin-super-stub set _#Mixin2#field2#isSet(core::bool value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2#isSet} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class4b extends self::_Class4b&Class4a&Mixin2 {
+ synthetic constructor •() → self::Class4b
+ : super self::_Class4b&Class4a&Mixin2::•()
+ ;
+ static method _#new#tearOff() → self::Class4b
+ return new self::Class4b::•();
+}
+abstract class Class5a extends mai::Super2 implements mai::Super1 {
+ synthetic constructor •() → self::Class5a
+ : super mai::Super2::•()
+ ;
+}
+abstract class _Class5b&Class5a&Mixin2 = self::Class5a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class5b&Class5a&Mixin2
+ : super self::Class5a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int field1#param) → void
+ return super.{mai::Mixin2::field1} = field1#param;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int field2#param) → void
+ return super.{mai::Mixin2::field2} = field2#param;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get _#Mixin2#field1() → core::int?
+ return super.{mai::Mixin2::_#Mixin2#field1};
+ mixin-super-stub set _#Mixin2#field1(core::int? value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1} = value;
+ mixin-super-stub get _#Mixin2#field1#isSet() → core::bool
+ return super.{mai::Mixin2::_#Mixin2#field1#isSet};
+ mixin-super-stub set _#Mixin2#field1#isSet(core::bool value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1#isSet} = value;
+ mixin-super-stub get _#Mixin2#field2() → core::int?
+ return super.{mai::Mixin2::_#Mixin2#field2};
+ mixin-super-stub set _#Mixin2#field2(core::int? value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2} = value;
+ mixin-super-stub get _#Mixin2#field2#isSet() → core::bool
+ return super.{mai::Mixin2::_#Mixin2#field2#isSet};
+ mixin-super-stub set _#Mixin2#field2#isSet(core::bool value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2#isSet} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class5b extends self::_Class5b&Class5a&Mixin2 {
+ synthetic constructor •() → self::Class5b
+ : super self::_Class5b&Class5a&Mixin2::•()
+ ;
+ static method _#new#tearOff() → self::Class5b
+ return new self::Class5b::•();
+}
+abstract class Class6a extends core::Object implements mai::Super1, mai::Super2 {
+ synthetic constructor •() → self::Class6a
+ : super core::Object::•()
+ ;
+}
+abstract class _Class6b&Class6a&Mixin2 = self::Class6a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class6b&Class6a&Mixin2
+ : super self::Class6a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int field1#param) → void
+ return super.{mai::Mixin2::field1} = field1#param;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int field2#param) → void
+ return super.{mai::Mixin2::field2} = field2#param;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get _#Mixin2#field1() → core::int?
+ return super.{mai::Mixin2::_#Mixin2#field1};
+ mixin-super-stub set _#Mixin2#field1(core::int? value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1} = value;
+ mixin-super-stub get _#Mixin2#field1#isSet() → core::bool
+ return super.{mai::Mixin2::_#Mixin2#field1#isSet};
+ mixin-super-stub set _#Mixin2#field1#isSet(core::bool value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1#isSet} = value;
+ mixin-super-stub get _#Mixin2#field2() → core::int?
+ return super.{mai::Mixin2::_#Mixin2#field2};
+ mixin-super-stub set _#Mixin2#field2(core::int? value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2} = value;
+ mixin-super-stub get _#Mixin2#field2#isSet() → core::bool
+ return super.{mai::Mixin2::_#Mixin2#field2#isSet};
+ mixin-super-stub set _#Mixin2#field2#isSet(core::bool value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2#isSet} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class6b extends self::_Class6b&Class6a&Mixin2 {
+ synthetic constructor •() → self::Class6b
+ : super self::_Class6b&Class6a&Mixin2::•()
+ ;
+ static method _#new#tearOff() → self::Class6b
+ return new self::Class6b::•();
+}
diff --git a/pkg/front_end/testcases/dartdevc/mixin_super/main.dart.weak.outline.expect b/pkg/front_end/testcases/dartdevc/mixin_super/main.dart.weak.outline.expect
new file mode 100644
index 0000000..e7dd810
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/mixin_super/main.dart.weak.outline.expect
@@ -0,0 +1,390 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "main_lib.dart" as mai;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+abstract class _Mixin1&Super1&Super2 extends core::Object implements mai::Super1, mai::Super2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Mixin1&Super1&Super2
+ ;
+}
+abstract class Mixin1 extends self::_Mixin1&Super1&Super2 /*isMixinDeclaration*/ {
+ field core::int? _#Mixin1#field1;
+ field core::bool _#Mixin1#field1#isSet;
+ field core::int? _#Mixin1#field2;
+ field core::bool _#Mixin1#field2#isSet;
+ get field1() → core::int;
+ set field1(core::int field1#param) → void;
+ get field2() → core::int;
+ set field2(core::int field2#param) → void;
+ method method1() → void
+ ;
+ method method2() → void
+ ;
+ get property1() → core::int
+ ;
+ set property1(core::int value) → void
+ ;
+ get property2() → core::int
+ ;
+ set property2(core::int value) → void
+ ;
+}
+abstract class Class1a extends mai::Super1 implements mai::Super2 {
+ synthetic constructor •() → self::Class1a
+ ;
+}
+abstract class _Class1b&Class1a&Mixin1 = self::Class1a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class1b&Class1a&Mixin1
+ : super self::Class1a::•()
+ ;
+ mixin-super-stub get _#Mixin1#field1() → core::int?
+ return super.{self::Mixin1::_#Mixin1#field1};
+ mixin-super-stub set _#Mixin1#field1(core::int? value) → void
+ return super.{self::Mixin1::_#Mixin1#field1} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int field1#param) → void
+ return super.{self::Mixin1::field1} = field1#param;
+ mixin-super-stub get _#Mixin1#field1#isSet() → core::bool
+ return super.{self::Mixin1::_#Mixin1#field1#isSet};
+ mixin-super-stub set _#Mixin1#field1#isSet(core::bool value) → void
+ return super.{self::Mixin1::_#Mixin1#field1#isSet} = value;
+ mixin-super-stub get _#Mixin1#field2() → core::int?
+ return super.{self::Mixin1::_#Mixin1#field2};
+ mixin-super-stub set _#Mixin1#field2(core::int? value) → void
+ return super.{self::Mixin1::_#Mixin1#field2} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int field2#param) → void
+ return super.{self::Mixin1::field2} = field2#param;
+ mixin-super-stub get _#Mixin1#field2#isSet() → core::bool
+ return super.{self::Mixin1::_#Mixin1#field2#isSet};
+ mixin-super-stub set _#Mixin1#field2#isSet(core::bool value) → void
+ return super.{self::Mixin1::_#Mixin1#field2#isSet} = value;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class1b extends self::_Class1b&Class1a&Mixin1 {
+ synthetic constructor •() → self::Class1b
+ ;
+ static method _#new#tearOff() → self::Class1b
+ return new self::Class1b::•();
+}
+abstract class Class2a extends mai::Super2 implements mai::Super1 {
+ synthetic constructor •() → self::Class2a
+ ;
+}
+abstract class _Class2b&Class2a&Mixin1 = self::Class2a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class2b&Class2a&Mixin1
+ : super self::Class2a::•()
+ ;
+ mixin-super-stub get _#Mixin1#field1() → core::int?
+ return super.{self::Mixin1::_#Mixin1#field1};
+ mixin-super-stub set _#Mixin1#field1(core::int? value) → void
+ return super.{self::Mixin1::_#Mixin1#field1} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int field1#param) → void
+ return super.{self::Mixin1::field1} = field1#param;
+ mixin-super-stub get _#Mixin1#field1#isSet() → core::bool
+ return super.{self::Mixin1::_#Mixin1#field1#isSet};
+ mixin-super-stub set _#Mixin1#field1#isSet(core::bool value) → void
+ return super.{self::Mixin1::_#Mixin1#field1#isSet} = value;
+ mixin-super-stub get _#Mixin1#field2() → core::int?
+ return super.{self::Mixin1::_#Mixin1#field2};
+ mixin-super-stub set _#Mixin1#field2(core::int? value) → void
+ return super.{self::Mixin1::_#Mixin1#field2} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int field2#param) → void
+ return super.{self::Mixin1::field2} = field2#param;
+ mixin-super-stub get _#Mixin1#field2#isSet() → core::bool
+ return super.{self::Mixin1::_#Mixin1#field2#isSet};
+ mixin-super-stub set _#Mixin1#field2#isSet(core::bool value) → void
+ return super.{self::Mixin1::_#Mixin1#field2#isSet} = value;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class2b extends self::_Class2b&Class2a&Mixin1 {
+ synthetic constructor •() → self::Class2b
+ ;
+ static method _#new#tearOff() → self::Class2b
+ return new self::Class2b::•();
+}
+abstract class Class3a extends core::Object implements mai::Super1, mai::Super2 {
+ synthetic constructor •() → self::Class3a
+ ;
+}
+abstract class _Class3b&Class3a&Mixin1 = self::Class3a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class3b&Class3a&Mixin1
+ : super self::Class3a::•()
+ ;
+ mixin-super-stub get _#Mixin1#field1() → core::int?
+ return super.{self::Mixin1::_#Mixin1#field1};
+ mixin-super-stub set _#Mixin1#field1(core::int? value) → void
+ return super.{self::Mixin1::_#Mixin1#field1} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int field1#param) → void
+ return super.{self::Mixin1::field1} = field1#param;
+ mixin-super-stub get _#Mixin1#field1#isSet() → core::bool
+ return super.{self::Mixin1::_#Mixin1#field1#isSet};
+ mixin-super-stub set _#Mixin1#field1#isSet(core::bool value) → void
+ return super.{self::Mixin1::_#Mixin1#field1#isSet} = value;
+ mixin-super-stub get _#Mixin1#field2() → core::int?
+ return super.{self::Mixin1::_#Mixin1#field2};
+ mixin-super-stub set _#Mixin1#field2(core::int? value) → void
+ return super.{self::Mixin1::_#Mixin1#field2} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int field2#param) → void
+ return super.{self::Mixin1::field2} = field2#param;
+ mixin-super-stub get _#Mixin1#field2#isSet() → core::bool
+ return super.{self::Mixin1::_#Mixin1#field2#isSet};
+ mixin-super-stub set _#Mixin1#field2#isSet(core::bool value) → void
+ return super.{self::Mixin1::_#Mixin1#field2#isSet} = value;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class3b extends self::_Class3b&Class3a&Mixin1 {
+ synthetic constructor •() → self::Class3b
+ ;
+ static method _#new#tearOff() → self::Class3b
+ return new self::Class3b::•();
+}
+abstract class Class4a extends mai::Super1 implements mai::Super2 {
+ synthetic constructor •() → self::Class4a
+ ;
+}
+abstract class _Class4b&Class4a&Mixin2 = self::Class4a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class4b&Class4a&Mixin2
+ : super self::Class4a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int field1#param) → void
+ return super.{mai::Mixin2::field1} = field1#param;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int field2#param) → void
+ return super.{mai::Mixin2::field2} = field2#param;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get _#Mixin2#field1() → core::int?
+ return super.{mai::Mixin2::_#Mixin2#field1};
+ mixin-super-stub set _#Mixin2#field1(core::int? value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1} = value;
+ mixin-super-stub get _#Mixin2#field1#isSet() → core::bool
+ return super.{mai::Mixin2::_#Mixin2#field1#isSet};
+ mixin-super-stub set _#Mixin2#field1#isSet(core::bool value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1#isSet} = value;
+ mixin-super-stub get _#Mixin2#field2() → core::int?
+ return super.{mai::Mixin2::_#Mixin2#field2};
+ mixin-super-stub set _#Mixin2#field2(core::int? value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2} = value;
+ mixin-super-stub get _#Mixin2#field2#isSet() → core::bool
+ return super.{mai::Mixin2::_#Mixin2#field2#isSet};
+ mixin-super-stub set _#Mixin2#field2#isSet(core::bool value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2#isSet} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class4b extends self::_Class4b&Class4a&Mixin2 {
+ synthetic constructor •() → self::Class4b
+ ;
+ static method _#new#tearOff() → self::Class4b
+ return new self::Class4b::•();
+}
+abstract class Class5a extends mai::Super2 implements mai::Super1 {
+ synthetic constructor •() → self::Class5a
+ ;
+}
+abstract class _Class5b&Class5a&Mixin2 = self::Class5a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class5b&Class5a&Mixin2
+ : super self::Class5a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int field1#param) → void
+ return super.{mai::Mixin2::field1} = field1#param;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int field2#param) → void
+ return super.{mai::Mixin2::field2} = field2#param;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get _#Mixin2#field1() → core::int?
+ return super.{mai::Mixin2::_#Mixin2#field1};
+ mixin-super-stub set _#Mixin2#field1(core::int? value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1} = value;
+ mixin-super-stub get _#Mixin2#field1#isSet() → core::bool
+ return super.{mai::Mixin2::_#Mixin2#field1#isSet};
+ mixin-super-stub set _#Mixin2#field1#isSet(core::bool value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1#isSet} = value;
+ mixin-super-stub get _#Mixin2#field2() → core::int?
+ return super.{mai::Mixin2::_#Mixin2#field2};
+ mixin-super-stub set _#Mixin2#field2(core::int? value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2} = value;
+ mixin-super-stub get _#Mixin2#field2#isSet() → core::bool
+ return super.{mai::Mixin2::_#Mixin2#field2#isSet};
+ mixin-super-stub set _#Mixin2#field2#isSet(core::bool value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2#isSet} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class5b extends self::_Class5b&Class5a&Mixin2 {
+ synthetic constructor •() → self::Class5b
+ ;
+ static method _#new#tearOff() → self::Class5b
+ return new self::Class5b::•();
+}
+abstract class Class6a extends core::Object implements mai::Super1, mai::Super2 {
+ synthetic constructor •() → self::Class6a
+ ;
+}
+abstract class _Class6b&Class6a&Mixin2 = self::Class6a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class6b&Class6a&Mixin2
+ : super self::Class6a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int field1#param) → void
+ return super.{mai::Mixin2::field1} = field1#param;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int field2#param) → void
+ return super.{mai::Mixin2::field2} = field2#param;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get _#Mixin2#field1() → core::int?
+ return super.{mai::Mixin2::_#Mixin2#field1};
+ mixin-super-stub set _#Mixin2#field1(core::int? value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1} = value;
+ mixin-super-stub get _#Mixin2#field1#isSet() → core::bool
+ return super.{mai::Mixin2::_#Mixin2#field1#isSet};
+ mixin-super-stub set _#Mixin2#field1#isSet(core::bool value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1#isSet} = value;
+ mixin-super-stub get _#Mixin2#field2() → core::int?
+ return super.{mai::Mixin2::_#Mixin2#field2};
+ mixin-super-stub set _#Mixin2#field2(core::int? value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2} = value;
+ mixin-super-stub get _#Mixin2#field2#isSet() → core::bool
+ return super.{mai::Mixin2::_#Mixin2#field2#isSet};
+ mixin-super-stub set _#Mixin2#field2#isSet(core::bool value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2#isSet} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class6b extends self::_Class6b&Class6a&Mixin2 {
+ synthetic constructor •() → self::Class6b
+ ;
+ static method _#new#tearOff() → self::Class6b
+ return new self::Class6b::•();
+}
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+
+class Super1 extends core::Object {
+ field core::int field1;
+ field core::int property1;
+ synthetic constructor •() → mai::Super1
+ ;
+ method method1() → void
+ ;
+ static method _#new#tearOff() → mai::Super1
+ return new mai::Super1::•();
+}
+class Super2 extends core::Object {
+ field core::int field2;
+ field core::int property2;
+ synthetic constructor •() → mai::Super2
+ ;
+ method method2() → void
+ ;
+ static method _#new#tearOff() → mai::Super2
+ return new mai::Super2::•();
+}
+abstract class _Mixin2&Super1&Super2 extends core::Object implements mai::Super1, mai::Super2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → mai::_Mixin2&Super1&Super2
+ ;
+}
+abstract class Mixin2 extends mai::_Mixin2&Super1&Super2 /*isMixinDeclaration*/ {
+ field core::int? _#Mixin2#field1;
+ field core::bool _#Mixin2#field1#isSet;
+ field core::int? _#Mixin2#field2;
+ field core::bool _#Mixin2#field2#isSet;
+ get field1() → core::int;
+ set field1(core::int field1#param) → void;
+ get field2() → core::int;
+ set field2(core::int field2#param) → void;
+ method method1() → void
+ ;
+ method method2() → void
+ ;
+ get property1() → core::int
+ ;
+ set property1(core::int value) → void
+ ;
+ get property2() → core::int
+ ;
+ set property2(core::int value) → void
+ ;
+}
diff --git a/pkg/front_end/testcases/dartdevc/mixin_super/main.dart.weak.transformed.expect b/pkg/front_end/testcases/dartdevc/mixin_super/main.dart.weak.transformed.expect
new file mode 100644
index 0000000..8b5e70c
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/mixin_super/main.dart.weak.transformed.expect
@@ -0,0 +1,595 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:9:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:9:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:17:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:23:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:9:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:9:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:17:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:23:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:19:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:19:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:33:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:37:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:19:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:19:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:33:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/dartdevc/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart:37:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+import self as self;
+import "dart:core" as core;
+import "main_lib.dart" as mai;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+abstract class _Mixin1&Super1&Super2 extends core::Object implements mai::Super1, mai::Super2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Mixin1&Super1&Super2
+ : super core::Object::•()
+ ;
+}
+abstract class Mixin1 extends self::_Mixin1&Super1&Super2 /*isMixinDeclaration*/ {
+ field core::int? _#Mixin1#field1 = null;
+ field core::bool _#Mixin1#field1#isSet = false;
+ field core::int? _#Mixin1#field2 = null;
+ field core::bool _#Mixin1#field2#isSet = false;
+ get field1() → core::int {
+ if(!this.{self::Mixin1::_#Mixin1#field1#isSet}{core::bool}) {
+ this.{self::Mixin1::_#Mixin1#field1} = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int};
+ this.{self::Mixin1::_#Mixin1#field1#isSet} = true;
+ }
+ return let final core::int? #t1 = this.{self::Mixin1::_#Mixin1#field1}{core::int?} in #t1{core::int};
+ }
+ set field1(core::int field1#param) → void {
+ this.{self::Mixin1::_#Mixin1#field1#isSet} = true;
+ this.{self::Mixin1::_#Mixin1#field1} = field1#param;
+ }
+ get field2() → core::int {
+ if(!this.{self::Mixin1::_#Mixin1#field2#isSet}{core::bool}) {
+ this.{self::Mixin1::_#Mixin1#field2} = (() → core::int {
+ return 88;
+ })(){() → core::int};
+ this.{self::Mixin1::_#Mixin1#field2#isSet} = true;
+ }
+ return let final core::int? #t2 = this.{self::Mixin1::_#Mixin1#field2}{core::int?} in #t2{core::int};
+ }
+ set field2(core::int field2#param) → void {
+ this.{self::Mixin1::_#Mixin1#field2#isSet} = true;
+ this.{self::Mixin1::_#Mixin1#field2} = field2#param;
+ }
+ method method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ method method2() → void {}
+ get property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ set property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ get property2() → core::int {
+ return 42;
+ }
+ set property2(core::int value) → void {}
+}
+abstract class Class1a extends mai::Super1 implements mai::Super2 {
+ synthetic constructor •() → self::Class1a
+ : super mai::Super1::•()
+ ;
+}
+abstract class _Class1b&Class1a&Mixin1 = self::Class1a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class1b&Class1a&Mixin1
+ : super self::Class1a::•()
+ ;
+ mixin-super-stub get _#Mixin1#field1() → core::int?
+ return super.{self::Mixin1::_#Mixin1#field1};
+ mixin-super-stub set _#Mixin1#field1(core::int? value) → void
+ return super.{self::Mixin1::_#Mixin1#field1} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int field1#param) → void
+ return super.{self::Mixin1::field1} = field1#param;
+ mixin-super-stub get _#Mixin1#field1#isSet() → core::bool
+ return super.{self::Mixin1::_#Mixin1#field1#isSet};
+ mixin-super-stub set _#Mixin1#field1#isSet(core::bool value) → void
+ return super.{self::Mixin1::_#Mixin1#field1#isSet} = value;
+ mixin-super-stub get _#Mixin1#field2() → core::int?
+ return super.{self::Mixin1::_#Mixin1#field2};
+ mixin-super-stub set _#Mixin1#field2(core::int? value) → void
+ return super.{self::Mixin1::_#Mixin1#field2} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int field2#param) → void
+ return super.{self::Mixin1::field2} = field2#param;
+ mixin-super-stub get _#Mixin1#field2#isSet() → core::bool
+ return super.{self::Mixin1::_#Mixin1#field2#isSet};
+ mixin-super-stub set _#Mixin1#field2#isSet(core::bool value) → void
+ return super.{self::Mixin1::_#Mixin1#field2#isSet} = value;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class1b extends self::_Class1b&Class1a&Mixin1 {
+ synthetic constructor •() → self::Class1b
+ : super self::_Class1b&Class1a&Mixin1::•()
+ ;
+ static method _#new#tearOff() → self::Class1b
+ return new self::Class1b::•();
+}
+abstract class Class2a extends mai::Super2 implements mai::Super1 {
+ synthetic constructor •() → self::Class2a
+ : super mai::Super2::•()
+ ;
+}
+abstract class _Class2b&Class2a&Mixin1 = self::Class2a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class2b&Class2a&Mixin1
+ : super self::Class2a::•()
+ ;
+ mixin-super-stub get _#Mixin1#field1() → core::int?
+ return super.{self::Mixin1::_#Mixin1#field1};
+ mixin-super-stub set _#Mixin1#field1(core::int? value) → void
+ return super.{self::Mixin1::_#Mixin1#field1} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int field1#param) → void
+ return super.{self::Mixin1::field1} = field1#param;
+ mixin-super-stub get _#Mixin1#field1#isSet() → core::bool
+ return super.{self::Mixin1::_#Mixin1#field1#isSet};
+ mixin-super-stub set _#Mixin1#field1#isSet(core::bool value) → void
+ return super.{self::Mixin1::_#Mixin1#field1#isSet} = value;
+ mixin-super-stub get _#Mixin1#field2() → core::int?
+ return super.{self::Mixin1::_#Mixin1#field2};
+ mixin-super-stub set _#Mixin1#field2(core::int? value) → void
+ return super.{self::Mixin1::_#Mixin1#field2} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int field2#param) → void
+ return super.{self::Mixin1::field2} = field2#param;
+ mixin-super-stub get _#Mixin1#field2#isSet() → core::bool
+ return super.{self::Mixin1::_#Mixin1#field2#isSet};
+ mixin-super-stub set _#Mixin1#field2#isSet(core::bool value) → void
+ return super.{self::Mixin1::_#Mixin1#field2#isSet} = value;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class2b extends self::_Class2b&Class2a&Mixin1 {
+ synthetic constructor •() → self::Class2b
+ : super self::_Class2b&Class2a&Mixin1::•()
+ ;
+ static method _#new#tearOff() → self::Class2b
+ return new self::Class2b::•();
+}
+abstract class Class3a extends core::Object implements mai::Super1, mai::Super2 {
+ synthetic constructor •() → self::Class3a
+ : super core::Object::•()
+ ;
+}
+abstract class _Class3b&Class3a&Mixin1 = self::Class3a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class3b&Class3a&Mixin1
+ : super self::Class3a::•()
+ ;
+ mixin-super-stub get _#Mixin1#field1() → core::int?
+ return super.{self::Mixin1::_#Mixin1#field1};
+ mixin-super-stub set _#Mixin1#field1(core::int? value) → void
+ return super.{self::Mixin1::_#Mixin1#field1} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int field1#param) → void
+ return super.{self::Mixin1::field1} = field1#param;
+ mixin-super-stub get _#Mixin1#field1#isSet() → core::bool
+ return super.{self::Mixin1::_#Mixin1#field1#isSet};
+ mixin-super-stub set _#Mixin1#field1#isSet(core::bool value) → void
+ return super.{self::Mixin1::_#Mixin1#field1#isSet} = value;
+ mixin-super-stub get _#Mixin1#field2() → core::int?
+ return super.{self::Mixin1::_#Mixin1#field2};
+ mixin-super-stub set _#Mixin1#field2(core::int? value) → void
+ return super.{self::Mixin1::_#Mixin1#field2} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int field2#param) → void
+ return super.{self::Mixin1::field2} = field2#param;
+ mixin-super-stub get _#Mixin1#field2#isSet() → core::bool
+ return super.{self::Mixin1::_#Mixin1#field2#isSet};
+ mixin-super-stub set _#Mixin1#field2#isSet(core::bool value) → void
+ return super.{self::Mixin1::_#Mixin1#field2#isSet} = value;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class3b extends self::_Class3b&Class3a&Mixin1 {
+ synthetic constructor •() → self::Class3b
+ : super self::_Class3b&Class3a&Mixin1::•()
+ ;
+ static method _#new#tearOff() → self::Class3b
+ return new self::Class3b::•();
+}
+abstract class Class4a extends mai::Super1 implements mai::Super2 {
+ synthetic constructor •() → self::Class4a
+ : super mai::Super1::•()
+ ;
+}
+abstract class _Class4b&Class4a&Mixin2 = self::Class4a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class4b&Class4a&Mixin2
+ : super self::Class4a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int field1#param) → void
+ return super.{mai::Mixin2::field1} = field1#param;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int field2#param) → void
+ return super.{mai::Mixin2::field2} = field2#param;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get _#Mixin2#field1() → core::int?
+ return super.{mai::Mixin2::_#Mixin2#field1};
+ mixin-super-stub set _#Mixin2#field1(core::int? value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1} = value;
+ mixin-super-stub get _#Mixin2#field1#isSet() → core::bool
+ return super.{mai::Mixin2::_#Mixin2#field1#isSet};
+ mixin-super-stub set _#Mixin2#field1#isSet(core::bool value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1#isSet} = value;
+ mixin-super-stub get _#Mixin2#field2() → core::int?
+ return super.{mai::Mixin2::_#Mixin2#field2};
+ mixin-super-stub set _#Mixin2#field2(core::int? value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2} = value;
+ mixin-super-stub get _#Mixin2#field2#isSet() → core::bool
+ return super.{mai::Mixin2::_#Mixin2#field2#isSet};
+ mixin-super-stub set _#Mixin2#field2#isSet(core::bool value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2#isSet} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class4b extends self::_Class4b&Class4a&Mixin2 {
+ synthetic constructor •() → self::Class4b
+ : super self::_Class4b&Class4a&Mixin2::•()
+ ;
+ static method _#new#tearOff() → self::Class4b
+ return new self::Class4b::•();
+}
+abstract class Class5a extends mai::Super2 implements mai::Super1 {
+ synthetic constructor •() → self::Class5a
+ : super mai::Super2::•()
+ ;
+}
+abstract class _Class5b&Class5a&Mixin2 = self::Class5a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class5b&Class5a&Mixin2
+ : super self::Class5a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int field1#param) → void
+ return super.{mai::Mixin2::field1} = field1#param;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int field2#param) → void
+ return super.{mai::Mixin2::field2} = field2#param;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get _#Mixin2#field1() → core::int?
+ return super.{mai::Mixin2::_#Mixin2#field1};
+ mixin-super-stub set _#Mixin2#field1(core::int? value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1} = value;
+ mixin-super-stub get _#Mixin2#field1#isSet() → core::bool
+ return super.{mai::Mixin2::_#Mixin2#field1#isSet};
+ mixin-super-stub set _#Mixin2#field1#isSet(core::bool value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1#isSet} = value;
+ mixin-super-stub get _#Mixin2#field2() → core::int?
+ return super.{mai::Mixin2::_#Mixin2#field2};
+ mixin-super-stub set _#Mixin2#field2(core::int? value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2} = value;
+ mixin-super-stub get _#Mixin2#field2#isSet() → core::bool
+ return super.{mai::Mixin2::_#Mixin2#field2#isSet};
+ mixin-super-stub set _#Mixin2#field2#isSet(core::bool value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2#isSet} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class5b extends self::_Class5b&Class5a&Mixin2 {
+ synthetic constructor •() → self::Class5b
+ : super self::_Class5b&Class5a&Mixin2::•()
+ ;
+ static method _#new#tearOff() → self::Class5b
+ return new self::Class5b::•();
+}
+abstract class Class6a extends core::Object implements mai::Super1, mai::Super2 {
+ synthetic constructor •() → self::Class6a
+ : super core::Object::•()
+ ;
+}
+abstract class _Class6b&Class6a&Mixin2 = self::Class6a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class6b&Class6a&Mixin2
+ : super self::Class6a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int field1#param) → void
+ return super.{mai::Mixin2::field1} = field1#param;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int field2#param) → void
+ return super.{mai::Mixin2::field2} = field2#param;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get _#Mixin2#field1() → core::int?
+ return super.{mai::Mixin2::_#Mixin2#field1};
+ mixin-super-stub set _#Mixin2#field1(core::int? value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1} = value;
+ mixin-super-stub get _#Mixin2#field1#isSet() → core::bool
+ return super.{mai::Mixin2::_#Mixin2#field1#isSet};
+ mixin-super-stub set _#Mixin2#field1#isSet(core::bool value) → void
+ return super.{mai::Mixin2::_#Mixin2#field1#isSet} = value;
+ mixin-super-stub get _#Mixin2#field2() → core::int?
+ return super.{mai::Mixin2::_#Mixin2#field2};
+ mixin-super-stub set _#Mixin2#field2(core::int? value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2} = value;
+ mixin-super-stub get _#Mixin2#field2#isSet() → core::bool
+ return super.{mai::Mixin2::_#Mixin2#field2#isSet};
+ mixin-super-stub set _#Mixin2#field2#isSet(core::bool value) → void
+ return super.{mai::Mixin2::_#Mixin2#field2#isSet} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class6b extends self::_Class6b&Class6a&Mixin2 {
+ synthetic constructor •() → self::Class6b
+ : super self::_Class6b&Class6a&Mixin2::•()
+ ;
+ static method _#new#tearOff() → self::Class6b
+ return new self::Class6b::•();
+}
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+
+class Super1 extends core::Object {
+ field core::int field1 = 42;
+ field core::int property1 = 42;
+ synthetic constructor •() → mai::Super1
+ : super core::Object::•()
+ ;
+ method method1() → void {}
+ static method _#new#tearOff() → mai::Super1
+ return new mai::Super1::•();
+}
+class Super2 extends core::Object {
+ field core::int field2 = 87;
+ field core::int property2 = 87;
+ synthetic constructor •() → mai::Super2
+ : super core::Object::•()
+ ;
+ method method2() → void {}
+ static method _#new#tearOff() → mai::Super2
+ return new mai::Super2::•();
+}
+abstract class _Mixin2&Super1&Super2 extends core::Object implements mai::Super1, mai::Super2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → mai::_Mixin2&Super1&Super2
+ : super core::Object::•()
+ ;
+}
+abstract class Mixin2 extends mai::_Mixin2&Super1&Super2 /*isMixinDeclaration*/ {
+ field core::int? _#Mixin2#field1 = null;
+ field core::bool _#Mixin2#field1#isSet = false;
+ field core::int? _#Mixin2#field2 = null;
+ field core::bool _#Mixin2#field2#isSet = false;
+ get field1() → core::int {
+ if(!this.{mai::Mixin2::_#Mixin2#field1#isSet}{core::bool}) {
+ this.{mai::Mixin2::_#Mixin2#field1} = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int};
+ this.{mai::Mixin2::_#Mixin2#field1#isSet} = true;
+ }
+ return let final core::int? #t3 = this.{mai::Mixin2::_#Mixin2#field1}{core::int?} in #t3{core::int};
+ }
+ set field1(core::int field1#param) → void {
+ this.{mai::Mixin2::_#Mixin2#field1#isSet} = true;
+ this.{mai::Mixin2::_#Mixin2#field1} = field1#param;
+ }
+ get field2() → core::int {
+ if(!this.{mai::Mixin2::_#Mixin2#field2#isSet}{core::bool}) {
+ this.{mai::Mixin2::_#Mixin2#field2} = (() → core::int {
+ return 88;
+ })(){() → core::int};
+ this.{mai::Mixin2::_#Mixin2#field2#isSet} = true;
+ }
+ return let final core::int? #t4 = this.{mai::Mixin2::_#Mixin2#field2}{core::int?} in #t4{core::int};
+ }
+ set field2(core::int field2#param) → void {
+ this.{mai::Mixin2::_#Mixin2#field2#isSet} = true;
+ this.{mai::Mixin2::_#Mixin2#field2} = field2#param;
+ }
+ method method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ method method2() → void {}
+ get property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ set property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ get property2() → core::int {
+ return 42;
+ }
+ set property2(core::int value) → void {}
+}
diff --git a/pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart b/pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart
new file mode 100644
index 0000000..2d5e63b
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart
@@ -0,0 +1,45 @@
+// 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.
+
+class Super1 {
+ void method1() {}
+ int field1 = 42;
+ int property1 = 42;
+}
+
+class Super2 {
+ void method2() {}
+ int field2 = 87;
+ int property2 = 87;
+}
+
+mixin Mixin2 on Super1, Super2 {
+ late int field1 = () {
+ return super.field1 = super.field1 + 1;
+ }();
+
+ late int field2 = () {
+ return 88;
+ }();
+
+ void method1() {
+ super.method1();
+ }
+
+ void method2() {}
+
+ int get property1 {
+ return super.property1;
+ }
+
+ void set property1(int value) {
+ super.property1 = value;
+ }
+
+ int get property2 {
+ return 42;
+ }
+
+ void set property2(int value) {}
+}
diff --git a/pkg/front_end/testcases/dartdevc/mixin_super/test.options b/pkg/front_end/testcases/dartdevc/mixin_super/test.options
new file mode 100644
index 0000000..bfe6dc8
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/mixin_super/test.options
@@ -0,0 +1 @@
+main_lib.dart
\ No newline at end of file
diff --git a/pkg/front_end/testcases/general/abstract_super_application.dart.weak.expect b/pkg/front_end/testcases/general/abstract_super_application.dart.weak.expect
index c9780cd..3c410b4 100644
--- a/pkg/front_end/testcases/general/abstract_super_application.dart.weak.expect
+++ b/pkg/front_end/testcases/general/abstract_super_application.dart.weak.expect
@@ -9,6 +9,27 @@
// class Class2 with Mixin implements Super {}
// ^
//
+// pkg/front_end/testcases/general/abstract_super_application.dart:26:19: Error: The class doesn't have a concrete implementation of the super-invoked member 'method'.
+// class Class2 with Mixin implements Super {}
+// ^
+// pkg/front_end/testcases/general/abstract_super_application.dart:12:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method();
+// ^
+//
+// pkg/front_end/testcases/general/abstract_super_application.dart:26:19: Error: The class doesn't have a concrete implementation of the super-accessed member 'property'.
+// class Class2 with Mixin implements Super {}
+// ^
+// pkg/front_end/testcases/general/abstract_super_application.dart:16:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property;
+// ^
+//
+// pkg/front_end/testcases/general/abstract_super_application.dart:26:19: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property'.
+// class Class2 with Mixin implements Super {}
+// ^
+// pkg/front_end/testcases/general/abstract_super_application.dart:20:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property = value;
+// ^
+//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/general/abstract_super_application.dart.weak.modular.expect b/pkg/front_end/testcases/general/abstract_super_application.dart.weak.modular.expect
index c9780cd..3c410b4 100644
--- a/pkg/front_end/testcases/general/abstract_super_application.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/general/abstract_super_application.dart.weak.modular.expect
@@ -9,6 +9,27 @@
// class Class2 with Mixin implements Super {}
// ^
//
+// pkg/front_end/testcases/general/abstract_super_application.dart:26:19: Error: The class doesn't have a concrete implementation of the super-invoked member 'method'.
+// class Class2 with Mixin implements Super {}
+// ^
+// pkg/front_end/testcases/general/abstract_super_application.dart:12:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method();
+// ^
+//
+// pkg/front_end/testcases/general/abstract_super_application.dart:26:19: Error: The class doesn't have a concrete implementation of the super-accessed member 'property'.
+// class Class2 with Mixin implements Super {}
+// ^
+// pkg/front_end/testcases/general/abstract_super_application.dart:16:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property;
+// ^
+//
+// pkg/front_end/testcases/general/abstract_super_application.dart:26:19: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property'.
+// class Class2 with Mixin implements Super {}
+// ^
+// pkg/front_end/testcases/general/abstract_super_application.dart:20:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property = value;
+// ^
+//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/general/abstract_super_application.dart.weak.transformed.expect b/pkg/front_end/testcases/general/abstract_super_application.dart.weak.transformed.expect
index 5418053..3ab956f 100644
--- a/pkg/front_end/testcases/general/abstract_super_application.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/abstract_super_application.dart.weak.transformed.expect
@@ -9,6 +9,27 @@
// class Class2 with Mixin implements Super {}
// ^
//
+// pkg/front_end/testcases/general/abstract_super_application.dart:26:19: Error: The class doesn't have a concrete implementation of the super-invoked member 'method'.
+// class Class2 with Mixin implements Super {}
+// ^
+// pkg/front_end/testcases/general/abstract_super_application.dart:12:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method();
+// ^
+//
+// pkg/front_end/testcases/general/abstract_super_application.dart:26:19: Error: The class doesn't have a concrete implementation of the super-accessed member 'property'.
+// class Class2 with Mixin implements Super {}
+// ^
+// pkg/front_end/testcases/general/abstract_super_application.dart:16:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property;
+// ^
+//
+// pkg/front_end/testcases/general/abstract_super_application.dart:26:19: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property'.
+// class Class2 with Mixin implements Super {}
+// ^
+// pkg/front_end/testcases/general/abstract_super_application.dart:20:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property = value;
+// ^
+//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/general/mixin_super/main.dart b/pkg/front_end/testcases/general/mixin_super/main.dart
new file mode 100644
index 0000000..1c32e50
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_super/main.dart
@@ -0,0 +1,59 @@
+// 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.
+
+import 'main_lib.dart';
+
+mixin Mixin1 on Super1, Super2 {
+ late int field1 = () {
+ return super.field1 = super.field1 + 1;
+ }();
+
+ late int field2 = () {
+ return 88;
+ }();
+
+ void method1() {
+ super.method1();
+ }
+
+ void method2() {}
+
+ int get property1 {
+ return super.property1;
+ }
+
+ void set property1(int value) {
+ super.property1 = value;
+ }
+
+ int get property2 {
+ return 42;
+ }
+
+ void set property2(int value) {}
+}
+
+abstract class Class1a extends Super1 implements Super2 {}
+
+class Class1b extends Class1a with Mixin1 /* Ok */ {}
+
+abstract class Class2a extends Super2 implements Super1 {}
+
+class Class2b extends Class2a with Mixin1 /* Error */ {}
+
+abstract class Class3a implements Super1, Super2 {}
+
+class Class3b extends Class3a with Mixin1 /* Error */ {}
+
+abstract class Class4a extends Super1 implements Super2 {}
+
+class Class4b extends Class4a with Mixin2 /* Ok */ {}
+
+abstract class Class5a extends Super2 implements Super1 {}
+
+class Class5b extends Class5a with Mixin2 /* Error */ {}
+
+abstract class Class6a implements Super1, Super2 {}
+
+class Class6b extends Class6a with Mixin2 /* Error */ {}
diff --git a/pkg/front_end/testcases/general/mixin_super/main.dart.textual_outline.expect b/pkg/front_end/testcases/general/mixin_super/main.dart.textual_outline.expect
new file mode 100644
index 0000000..105f962
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_super/main.dart.textual_outline.expect
@@ -0,0 +1,40 @@
+import 'main_lib.dart';
+
+mixin Mixin1 on Super1, Super2 {
+ late int field1 = () {
+ return super.field1 = super.field1 + 1;
+ }();
+ late int field2 = () {
+ return 88;
+ }();
+ void method1() {}
+ void method2() {}
+ int get property1 {}
+ void set property1(int value) {}
+ int get property2 {}
+ void set property2(int value) {}
+}
+
+abstract class Class1a extends Super1 implements Super2 {}
+
+class Class1b extends Class1a with Mixin1 {}
+
+abstract class Class2a extends Super2 implements Super1 {}
+
+class Class2b extends Class2a with Mixin1 {}
+
+abstract class Class3a implements Super1, Super2 {}
+
+class Class3b extends Class3a with Mixin1 {}
+
+abstract class Class4a extends Super1 implements Super2 {}
+
+class Class4b extends Class4a with Mixin2 {}
+
+abstract class Class5a extends Super2 implements Super1 {}
+
+class Class5b extends Class5a with Mixin2 {}
+
+abstract class Class6a implements Super1, Super2 {}
+
+class Class6b extends Class6a with Mixin2 {}
diff --git a/pkg/front_end/testcases/general/mixin_super/main.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/mixin_super/main.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..d1d920c
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_super/main.dart.textual_outline_modelled.expect
@@ -0,0 +1,40 @@
+import 'main_lib.dart';
+
+abstract class Class1a extends Super1 implements Super2 {}
+
+abstract class Class2a extends Super2 implements Super1 {}
+
+abstract class Class3a implements Super1, Super2 {}
+
+abstract class Class4a extends Super1 implements Super2 {}
+
+abstract class Class5a extends Super2 implements Super1 {}
+
+abstract class Class6a implements Super1, Super2 {}
+
+class Class1b extends Class1a with Mixin1 {}
+
+class Class2b extends Class2a with Mixin1 {}
+
+class Class3b extends Class3a with Mixin1 {}
+
+class Class4b extends Class4a with Mixin2 {}
+
+class Class5b extends Class5a with Mixin2 {}
+
+class Class6b extends Class6a with Mixin2 {}
+
+mixin Mixin1 on Super1, Super2 {
+ int get property1 {}
+ int get property2 {}
+ late int field1 = () {
+ return super.field1 = super.field1 + 1;
+ }();
+ late int field2 = () {
+ return 88;
+ }();
+ void method1() {}
+ void method2() {}
+ void set property1(int value) {}
+ void set property2(int value) {}
+}
diff --git a/pkg/front_end/testcases/general/mixin_super/main.dart.weak.expect b/pkg/front_end/testcases/general/mixin_super/main.dart.weak.expect
new file mode 100644
index 0000000..48e7699
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_super/main.dart.weak.expect
@@ -0,0 +1,435 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main.dart:17:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main.dart:23:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main.dart:9:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main.dart:9:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main.dart:17:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main.dart:23:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main.dart:9:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main.dart:9:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main_lib.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main_lib.dart:33:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main_lib.dart:37:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main_lib.dart:19:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main_lib.dart:19:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main_lib.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main_lib.dart:33:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main_lib.dart:37:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main_lib.dart:19:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main_lib.dart:19:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+import self as self;
+import "dart:core" as core;
+import "main_lib.dart" as mai;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+abstract class _Mixin1&Super1&Super2 extends core::Object implements mai::Super1, mai::Super2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Mixin1&Super1&Super2
+ : super core::Object::•()
+ ;
+}
+abstract class Mixin1 extends self::_Mixin1&Super1&Super2 /*isMixinDeclaration*/ {
+ late field core::int field1 = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int};
+ late field core::int field2 = (() → core::int {
+ return 88;
+ })(){() → core::int};
+ method method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ method method2() → void {}
+ get property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ set property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ get property2() → core::int {
+ return 42;
+ }
+ set property2(core::int value) → void {}
+}
+abstract class Class1a extends mai::Super1 implements mai::Super2 {
+ synthetic constructor •() → self::Class1a
+ : super mai::Super1::•()
+ ;
+}
+abstract class _Class1b&Class1a&Mixin1 = self::Class1a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class1b&Class1a&Mixin1
+ : super self::Class1a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{self::Mixin1::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{self::Mixin1::field2} = value;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class1b extends self::_Class1b&Class1a&Mixin1 {
+ synthetic constructor •() → self::Class1b
+ : super self::_Class1b&Class1a&Mixin1::•()
+ ;
+}
+abstract class Class2a extends mai::Super2 implements mai::Super1 {
+ synthetic constructor •() → self::Class2a
+ : super mai::Super2::•()
+ ;
+}
+abstract class _Class2b&Class2a&Mixin1 = self::Class2a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class2b&Class2a&Mixin1
+ : super self::Class2a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{self::Mixin1::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{self::Mixin1::field2} = value;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class2b extends self::_Class2b&Class2a&Mixin1 {
+ synthetic constructor •() → self::Class2b
+ : super self::_Class2b&Class2a&Mixin1::•()
+ ;
+}
+abstract class Class3a extends core::Object implements mai::Super1, mai::Super2 {
+ synthetic constructor •() → self::Class3a
+ : super core::Object::•()
+ ;
+}
+abstract class _Class3b&Class3a&Mixin1 = self::Class3a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class3b&Class3a&Mixin1
+ : super self::Class3a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{self::Mixin1::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{self::Mixin1::field2} = value;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class3b extends self::_Class3b&Class3a&Mixin1 {
+ synthetic constructor •() → self::Class3b
+ : super self::_Class3b&Class3a&Mixin1::•()
+ ;
+}
+abstract class Class4a extends mai::Super1 implements mai::Super2 {
+ synthetic constructor •() → self::Class4a
+ : super mai::Super1::•()
+ ;
+}
+abstract class _Class4b&Class4a&Mixin2 = self::Class4a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class4b&Class4a&Mixin2
+ : super self::Class4a::•()
+ ;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{mai::Mixin2::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{mai::Mixin2::field2} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class4b extends self::_Class4b&Class4a&Mixin2 {
+ synthetic constructor •() → self::Class4b
+ : super self::_Class4b&Class4a&Mixin2::•()
+ ;
+}
+abstract class Class5a extends mai::Super2 implements mai::Super1 {
+ synthetic constructor •() → self::Class5a
+ : super mai::Super2::•()
+ ;
+}
+abstract class _Class5b&Class5a&Mixin2 = self::Class5a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class5b&Class5a&Mixin2
+ : super self::Class5a::•()
+ ;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{mai::Mixin2::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{mai::Mixin2::field2} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class5b extends self::_Class5b&Class5a&Mixin2 {
+ synthetic constructor •() → self::Class5b
+ : super self::_Class5b&Class5a&Mixin2::•()
+ ;
+}
+abstract class Class6a extends core::Object implements mai::Super1, mai::Super2 {
+ synthetic constructor •() → self::Class6a
+ : super core::Object::•()
+ ;
+}
+abstract class _Class6b&Class6a&Mixin2 = self::Class6a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class6b&Class6a&Mixin2
+ : super self::Class6a::•()
+ ;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{mai::Mixin2::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{mai::Mixin2::field2} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class6b extends self::_Class6b&Class6a&Mixin2 {
+ synthetic constructor •() → self::Class6b
+ : super self::_Class6b&Class6a&Mixin2::•()
+ ;
+}
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+
+class Super1 extends core::Object {
+ field core::int field1 = 42;
+ field core::int property1 = 42;
+ synthetic constructor •() → mai::Super1
+ : super core::Object::•()
+ ;
+ method method1() → void {}
+}
+class Super2 extends core::Object {
+ field core::int field2 = 87;
+ field core::int property2 = 87;
+ synthetic constructor •() → mai::Super2
+ : super core::Object::•()
+ ;
+ method method2() → void {}
+}
+abstract class _Mixin2&Super1&Super2 extends core::Object implements mai::Super1, mai::Super2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → mai::_Mixin2&Super1&Super2
+ : super core::Object::•()
+ ;
+}
+abstract class Mixin2 extends mai::_Mixin2&Super1&Super2 /*isMixinDeclaration*/ {
+ late field core::int field1 = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int};
+ late field core::int field2 = (() → core::int {
+ return 88;
+ })(){() → core::int};
+ method method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ method method2() → void {}
+ get property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ set property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ get property2() → core::int {
+ return 42;
+ }
+ set property2(core::int value) → void {}
+}
diff --git a/pkg/front_end/testcases/general/mixin_super/main.dart.weak.modular.expect b/pkg/front_end/testcases/general/mixin_super/main.dart.weak.modular.expect
new file mode 100644
index 0000000..8eb525c
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_super/main.dart.weak.modular.expect
@@ -0,0 +1,317 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main.dart:17:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main.dart:23:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main.dart:9:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main.dart:9:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main.dart:17:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main.dart:23:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main.dart:9:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main.dart:9:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+import self as self;
+import "dart:core" as core;
+import "main_lib.dart" as mai;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+abstract class _Mixin1&Super1&Super2 extends core::Object implements mai::Super1, mai::Super2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Mixin1&Super1&Super2
+ : super core::Object::•()
+ ;
+}
+abstract class Mixin1 extends self::_Mixin1&Super1&Super2 /*isMixinDeclaration*/ {
+ late field core::int field1 = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int};
+ late field core::int field2 = (() → core::int {
+ return 88;
+ })(){() → core::int};
+ method method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ method method2() → void {}
+ get property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ set property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ get property2() → core::int {
+ return 42;
+ }
+ set property2(core::int value) → void {}
+}
+abstract class Class1a extends mai::Super1 implements mai::Super2 {
+ synthetic constructor •() → self::Class1a
+ : super mai::Super1::•()
+ ;
+}
+abstract class _Class1b&Class1a&Mixin1 = self::Class1a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class1b&Class1a&Mixin1
+ : super self::Class1a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{self::Mixin1::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{self::Mixin1::field2} = value;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class1b extends self::_Class1b&Class1a&Mixin1 {
+ synthetic constructor •() → self::Class1b
+ : super self::_Class1b&Class1a&Mixin1::•()
+ ;
+}
+abstract class Class2a extends mai::Super2 implements mai::Super1 {
+ synthetic constructor •() → self::Class2a
+ : super mai::Super2::•()
+ ;
+}
+abstract class _Class2b&Class2a&Mixin1 = self::Class2a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class2b&Class2a&Mixin1
+ : super self::Class2a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{self::Mixin1::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{self::Mixin1::field2} = value;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class2b extends self::_Class2b&Class2a&Mixin1 {
+ synthetic constructor •() → self::Class2b
+ : super self::_Class2b&Class2a&Mixin1::•()
+ ;
+}
+abstract class Class3a extends core::Object implements mai::Super1, mai::Super2 {
+ synthetic constructor •() → self::Class3a
+ : super core::Object::•()
+ ;
+}
+abstract class _Class3b&Class3a&Mixin1 = self::Class3a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class3b&Class3a&Mixin1
+ : super self::Class3a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{self::Mixin1::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{self::Mixin1::field2} = value;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class3b extends self::_Class3b&Class3a&Mixin1 {
+ synthetic constructor •() → self::Class3b
+ : super self::_Class3b&Class3a&Mixin1::•()
+ ;
+}
+abstract class Class4a extends mai::Super1 implements mai::Super2 {
+ synthetic constructor •() → self::Class4a
+ : super mai::Super1::•()
+ ;
+}
+abstract class _Class4b&Class4a&Mixin2 = self::Class4a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class4b&Class4a&Mixin2
+ : super self::Class4a::•()
+ ;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{mai::Mixin2::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{mai::Mixin2::field2} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class4b extends self::_Class4b&Class4a&Mixin2 {
+ synthetic constructor •() → self::Class4b
+ : super self::_Class4b&Class4a&Mixin2::•()
+ ;
+}
+abstract class Class5a extends mai::Super2 implements mai::Super1 {
+ synthetic constructor •() → self::Class5a
+ : super mai::Super2::•()
+ ;
+}
+abstract class _Class5b&Class5a&Mixin2 = self::Class5a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class5b&Class5a&Mixin2
+ : super self::Class5a::•()
+ ;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{mai::Mixin2::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{mai::Mixin2::field2} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class5b extends self::_Class5b&Class5a&Mixin2 {
+ synthetic constructor •() → self::Class5b
+ : super self::_Class5b&Class5a&Mixin2::•()
+ ;
+}
+abstract class Class6a extends core::Object implements mai::Super1, mai::Super2 {
+ synthetic constructor •() → self::Class6a
+ : super core::Object::•()
+ ;
+}
+abstract class _Class6b&Class6a&Mixin2 = self::Class6a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class6b&Class6a&Mixin2
+ : super self::Class6a::•()
+ ;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{mai::Mixin2::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{mai::Mixin2::field2} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class6b extends self::_Class6b&Class6a&Mixin2 {
+ synthetic constructor •() → self::Class6b
+ : super self::_Class6b&Class6a&Mixin2::•()
+ ;
+}
diff --git a/pkg/front_end/testcases/general/mixin_super/main.dart.weak.outline.expect b/pkg/front_end/testcases/general/mixin_super/main.dart.weak.outline.expect
new file mode 100644
index 0000000..73ee809
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_super/main.dart.weak.outline.expect
@@ -0,0 +1,266 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "main_lib.dart" as mai;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+abstract class _Mixin1&Super1&Super2 extends core::Object implements mai::Super1, mai::Super2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Mixin1&Super1&Super2
+ ;
+}
+abstract class Mixin1 extends self::_Mixin1&Super1&Super2 /*isMixinDeclaration*/ {
+ late field core::int field1;
+ late field core::int field2;
+ method method1() → void
+ ;
+ method method2() → void
+ ;
+ get property1() → core::int
+ ;
+ set property1(core::int value) → void
+ ;
+ get property2() → core::int
+ ;
+ set property2(core::int value) → void
+ ;
+}
+abstract class Class1a extends mai::Super1 implements mai::Super2 {
+ synthetic constructor •() → self::Class1a
+ ;
+}
+abstract class _Class1b&Class1a&Mixin1 = self::Class1a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class1b&Class1a&Mixin1
+ : super self::Class1a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{self::Mixin1::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{self::Mixin1::field2} = value;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class1b extends self::_Class1b&Class1a&Mixin1 {
+ synthetic constructor •() → self::Class1b
+ ;
+}
+abstract class Class2a extends mai::Super2 implements mai::Super1 {
+ synthetic constructor •() → self::Class2a
+ ;
+}
+abstract class _Class2b&Class2a&Mixin1 = self::Class2a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class2b&Class2a&Mixin1
+ : super self::Class2a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{self::Mixin1::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{self::Mixin1::field2} = value;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class2b extends self::_Class2b&Class2a&Mixin1 {
+ synthetic constructor •() → self::Class2b
+ ;
+}
+abstract class Class3a extends core::Object implements mai::Super1, mai::Super2 {
+ synthetic constructor •() → self::Class3a
+ ;
+}
+abstract class _Class3b&Class3a&Mixin1 = self::Class3a with self::Mixin1 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class3b&Class3a&Mixin1
+ : super self::Class3a::•()
+ ;
+ mixin-super-stub get field1() → core::int
+ return super.{self::Mixin1::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{self::Mixin1::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{self::Mixin1::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{self::Mixin1::field2} = value;
+ mixin-super-stub get property1() → core::int
+ return super.{self::Mixin1::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{self::Mixin1::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{self::Mixin1::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{self::Mixin1::property2} = value;
+ mixin-super-stub method method1() → void
+ return super.{self::Mixin1::method1}();
+ mixin-super-stub method method2() → void
+ return super.{self::Mixin1::method2}();
+}
+class Class3b extends self::_Class3b&Class3a&Mixin1 {
+ synthetic constructor •() → self::Class3b
+ ;
+}
+abstract class Class4a extends mai::Super1 implements mai::Super2 {
+ synthetic constructor •() → self::Class4a
+ ;
+}
+abstract class _Class4b&Class4a&Mixin2 = self::Class4a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class4b&Class4a&Mixin2
+ : super self::Class4a::•()
+ ;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{mai::Mixin2::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{mai::Mixin2::field2} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class4b extends self::_Class4b&Class4a&Mixin2 {
+ synthetic constructor •() → self::Class4b
+ ;
+}
+abstract class Class5a extends mai::Super2 implements mai::Super1 {
+ synthetic constructor •() → self::Class5a
+ ;
+}
+abstract class _Class5b&Class5a&Mixin2 = self::Class5a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class5b&Class5a&Mixin2
+ : super self::Class5a::•()
+ ;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{mai::Mixin2::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{mai::Mixin2::field2} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class5b extends self::_Class5b&Class5a&Mixin2 {
+ synthetic constructor •() → self::Class5b
+ ;
+}
+abstract class Class6a extends core::Object implements mai::Super1, mai::Super2 {
+ synthetic constructor •() → self::Class6a
+ ;
+}
+abstract class _Class6b&Class6a&Mixin2 = self::Class6a with mai::Mixin2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Class6b&Class6a&Mixin2
+ : super self::Class6a::•()
+ ;
+ mixin-super-stub get property1() → core::int
+ return super.{mai::Mixin2::property1};
+ mixin-super-stub set property1(core::int value) → void
+ return super.{mai::Mixin2::property1} = value;
+ mixin-super-stub get property2() → core::int
+ return super.{mai::Mixin2::property2};
+ mixin-super-stub set property2(core::int value) → void
+ return super.{mai::Mixin2::property2} = value;
+ mixin-super-stub get field1() → core::int
+ return super.{mai::Mixin2::field1};
+ mixin-super-stub set field1(core::int value) → void
+ return super.{mai::Mixin2::field1} = value;
+ mixin-super-stub get field2() → core::int
+ return super.{mai::Mixin2::field2};
+ mixin-super-stub set field2(core::int value) → void
+ return super.{mai::Mixin2::field2} = value;
+ mixin-super-stub method method1() → void
+ return super.{mai::Mixin2::method1}();
+ mixin-super-stub method method2() → void
+ return super.{mai::Mixin2::method2}();
+}
+class Class6b extends self::_Class6b&Class6a&Mixin2 {
+ synthetic constructor •() → self::Class6b
+ ;
+}
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+
+class Super1 extends core::Object {
+ field core::int field1;
+ field core::int property1;
+ synthetic constructor •() → mai::Super1
+ ;
+ method method1() → void
+ ;
+}
+class Super2 extends core::Object {
+ field core::int field2;
+ field core::int property2;
+ synthetic constructor •() → mai::Super2
+ ;
+ method method2() → void
+ ;
+}
+abstract class _Mixin2&Super1&Super2 extends core::Object implements mai::Super1, mai::Super2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → mai::_Mixin2&Super1&Super2
+ ;
+}
+abstract class Mixin2 extends mai::_Mixin2&Super1&Super2 /*isMixinDeclaration*/ {
+ late field core::int field1;
+ late field core::int field2;
+ method method1() → void
+ ;
+ method method2() → void
+ ;
+ get property1() → core::int
+ ;
+ set property1(core::int value) → void
+ ;
+ get property2() → core::int
+ ;
+ set property2(core::int value) → void
+ ;
+}
diff --git a/pkg/front_end/testcases/general/mixin_super/main.dart.weak.transformed.expect b/pkg/front_end/testcases/general/mixin_super/main.dart.weak.transformed.expect
new file mode 100644
index 0000000..e220725
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_super/main.dart.weak.transformed.expect
@@ -0,0 +1,435 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main.dart:17:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main.dart:23:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main.dart:9:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class2b extends Class2a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main.dart:9:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main.dart:17:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main.dart:23:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main.dart:9:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class3b extends Class3a with Mixin1 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main.dart:9:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main_lib.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main_lib.dart:33:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main_lib.dart:37:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main_lib.dart:19:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class5b extends Class5a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main_lib.dart:19:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main_lib.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
+// super.method1();
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main_lib.dart:33:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.property1;
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main_lib.dart:37:11: Context: This is the super-access that doesn't have a concrete target.
+// super.property1 = value;
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main_lib.dart:19:33: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+// pkg/front_end/testcases/general/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
+// class Class6b extends Class6a with Mixin2 /* Error */ {}
+// ^
+// pkg/front_end/testcases/general/mixin_super/main_lib.dart:19:18: Context: This is the super-access that doesn't have a concrete target.
+// return super.field1 = super.field1 + 1;
+// ^
+//
+import self as self;
+import "dart:core" as core;
+import "main_lib.dart" as mai;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+abstract class _Mixin1&Super1&Super2 extends core::Object implements mai::Super1, mai::Super2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_Mixin1&Super1&Super2
+ : super core::Object::•()
+ ;
+}
+abstract class Mixin1 extends self::_Mixin1&Super1&Super2 /*isMixinDeclaration*/ {
+ late field core::int field1 = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int};
+ late field core::int field2 = (() → core::int {
+ return 88;
+ })(){() → core::int};
+ method method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ method method2() → void {}
+ get property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ set property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ get property2() → core::int {
+ return 42;
+ }
+ set property2(core::int value) → void {}
+}
+abstract class Class1a extends mai::Super1 implements mai::Super2 {
+ synthetic constructor •() → self::Class1a
+ : super mai::Super1::•()
+ ;
+}
+abstract class _Class1b&Class1a&Mixin1 extends self::Class1a implements self::Mixin1 /*isAnonymousMixin,isEliminatedMixin*/ {
+ late field core::int field1 = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int};
+ late field core::int field2 = (() → core::int {
+ return 88;
+ })(){() → core::int};
+ synthetic constructor •() → self::_Class1b&Class1a&Mixin1
+ : super self::Class1a::•()
+ ;
+ get property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ get property2() → core::int {
+ return 42;
+ }
+ method method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ method method2() → void {}
+ set property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ set property2(core::int value) → void {}
+}
+class Class1b extends self::_Class1b&Class1a&Mixin1 {
+ synthetic constructor •() → self::Class1b
+ : super self::_Class1b&Class1a&Mixin1::•()
+ ;
+}
+abstract class Class2a extends mai::Super2 implements mai::Super1 {
+ synthetic constructor •() → self::Class2a
+ : super mai::Super2::•()
+ ;
+}
+abstract class _Class2b&Class2a&Mixin1 extends self::Class2a implements self::Mixin1 /*isAnonymousMixin,isEliminatedMixin*/ {
+ late field core::int field1 = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int};
+ late field core::int field2 = (() → core::int {
+ return 88;
+ })(){() → core::int};
+ synthetic constructor •() → self::_Class2b&Class2a&Mixin1
+ : super self::Class2a::•()
+ ;
+ get property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ get property2() → core::int {
+ return 42;
+ }
+ method method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ method method2() → void {}
+ set property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ set property2(core::int value) → void {}
+}
+class Class2b extends self::_Class2b&Class2a&Mixin1 {
+ synthetic constructor •() → self::Class2b
+ : super self::_Class2b&Class2a&Mixin1::•()
+ ;
+}
+abstract class Class3a extends core::Object implements mai::Super1, mai::Super2 {
+ synthetic constructor •() → self::Class3a
+ : super core::Object::•()
+ ;
+}
+abstract class _Class3b&Class3a&Mixin1 extends self::Class3a implements self::Mixin1 /*isAnonymousMixin,isEliminatedMixin*/ {
+ late field core::int field1 = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int};
+ late field core::int field2 = (() → core::int {
+ return 88;
+ })(){() → core::int};
+ synthetic constructor •() → self::_Class3b&Class3a&Mixin1
+ : super self::Class3a::•()
+ ;
+ get property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ get property2() → core::int {
+ return 42;
+ }
+ method method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ method method2() → void {}
+ set property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ set property2(core::int value) → void {}
+}
+class Class3b extends self::_Class3b&Class3a&Mixin1 {
+ synthetic constructor •() → self::Class3b
+ : super self::_Class3b&Class3a&Mixin1::•()
+ ;
+}
+abstract class Class4a extends mai::Super1 implements mai::Super2 {
+ synthetic constructor •() → self::Class4a
+ : super mai::Super1::•()
+ ;
+}
+abstract class _Class4b&Class4a&Mixin2 extends self::Class4a implements mai::Mixin2 /*isAnonymousMixin,isEliminatedMixin*/ {
+ late field core::int field1 = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int}/* from org-dartlang-testcase:///main_lib.dart */;
+ late field core::int field2 = (() → core::int {
+ return 88;
+ })(){() → core::int}/* from org-dartlang-testcase:///main_lib.dart */;
+ synthetic constructor •() → self::_Class4b&Class4a&Mixin2
+ : super self::Class4a::•()
+ ;
+ get /* from org-dartlang-testcase:///main_lib.dart */ property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ get /* from org-dartlang-testcase:///main_lib.dart */ property2() → core::int {
+ return 42;
+ }
+ method /* from org-dartlang-testcase:///main_lib.dart */ method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ method /* from org-dartlang-testcase:///main_lib.dart */ method2() → void {}
+ set /* from org-dartlang-testcase:///main_lib.dart */ property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ set /* from org-dartlang-testcase:///main_lib.dart */ property2(core::int value) → void {}
+}
+class Class4b extends self::_Class4b&Class4a&Mixin2 {
+ synthetic constructor •() → self::Class4b
+ : super self::_Class4b&Class4a&Mixin2::•()
+ ;
+}
+abstract class Class5a extends mai::Super2 implements mai::Super1 {
+ synthetic constructor •() → self::Class5a
+ : super mai::Super2::•()
+ ;
+}
+abstract class _Class5b&Class5a&Mixin2 extends self::Class5a implements mai::Mixin2 /*isAnonymousMixin,isEliminatedMixin*/ {
+ late field core::int field1 = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int}/* from org-dartlang-testcase:///main_lib.dart */;
+ late field core::int field2 = (() → core::int {
+ return 88;
+ })(){() → core::int}/* from org-dartlang-testcase:///main_lib.dart */;
+ synthetic constructor •() → self::_Class5b&Class5a&Mixin2
+ : super self::Class5a::•()
+ ;
+ get /* from org-dartlang-testcase:///main_lib.dart */ property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ get /* from org-dartlang-testcase:///main_lib.dart */ property2() → core::int {
+ return 42;
+ }
+ method /* from org-dartlang-testcase:///main_lib.dart */ method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ method /* from org-dartlang-testcase:///main_lib.dart */ method2() → void {}
+ set /* from org-dartlang-testcase:///main_lib.dart */ property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ set /* from org-dartlang-testcase:///main_lib.dart */ property2(core::int value) → void {}
+}
+class Class5b extends self::_Class5b&Class5a&Mixin2 {
+ synthetic constructor •() → self::Class5b
+ : super self::_Class5b&Class5a&Mixin2::•()
+ ;
+}
+abstract class Class6a extends core::Object implements mai::Super1, mai::Super2 {
+ synthetic constructor •() → self::Class6a
+ : super core::Object::•()
+ ;
+}
+abstract class _Class6b&Class6a&Mixin2 extends self::Class6a implements mai::Mixin2 /*isAnonymousMixin,isEliminatedMixin*/ {
+ late field core::int field1 = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int}/* from org-dartlang-testcase:///main_lib.dart */;
+ late field core::int field2 = (() → core::int {
+ return 88;
+ })(){() → core::int}/* from org-dartlang-testcase:///main_lib.dart */;
+ synthetic constructor •() → self::_Class6b&Class6a&Mixin2
+ : super self::Class6a::•()
+ ;
+ get /* from org-dartlang-testcase:///main_lib.dart */ property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ get /* from org-dartlang-testcase:///main_lib.dart */ property2() → core::int {
+ return 42;
+ }
+ method /* from org-dartlang-testcase:///main_lib.dart */ method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ method /* from org-dartlang-testcase:///main_lib.dart */ method2() → void {}
+ set /* from org-dartlang-testcase:///main_lib.dart */ property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ set /* from org-dartlang-testcase:///main_lib.dart */ property2(core::int value) → void {}
+}
+class Class6b extends self::_Class6b&Class6a&Mixin2 {
+ synthetic constructor •() → self::Class6b
+ : super self::_Class6b&Class6a&Mixin2::•()
+ ;
+}
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+
+class Super1 extends core::Object {
+ field core::int field1 = 42;
+ field core::int property1 = 42;
+ synthetic constructor •() → mai::Super1
+ : super core::Object::•()
+ ;
+ method method1() → void {}
+}
+class Super2 extends core::Object {
+ field core::int field2 = 87;
+ field core::int property2 = 87;
+ synthetic constructor •() → mai::Super2
+ : super core::Object::•()
+ ;
+ method method2() → void {}
+}
+abstract class _Mixin2&Super1&Super2 extends core::Object implements mai::Super1, mai::Super2 /*isAnonymousMixin*/ {
+ synthetic constructor •() → mai::_Mixin2&Super1&Super2
+ : super core::Object::•()
+ ;
+}
+abstract class Mixin2 extends mai::_Mixin2&Super1&Super2 /*isMixinDeclaration*/ {
+ late field core::int field1 = (() → core::int {
+ return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
+ })(){() → core::int};
+ late field core::int field2 = (() → core::int {
+ return 88;
+ })(){() → core::int};
+ method method1() → void {
+ super.{mai::Super1::method1}();
+ }
+ method method2() → void {}
+ get property1() → core::int {
+ return super.{mai::Super1::property1};
+ }
+ set property1(core::int value) → void {
+ super.{mai::Super1::property1} = value;
+ }
+ get property2() → core::int {
+ return 42;
+ }
+ set property2(core::int value) → void {}
+}
diff --git a/pkg/front_end/testcases/general/mixin_super/main_lib.dart b/pkg/front_end/testcases/general/mixin_super/main_lib.dart
new file mode 100644
index 0000000..2d5e63b
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_super/main_lib.dart
@@ -0,0 +1,45 @@
+// 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.
+
+class Super1 {
+ void method1() {}
+ int field1 = 42;
+ int property1 = 42;
+}
+
+class Super2 {
+ void method2() {}
+ int field2 = 87;
+ int property2 = 87;
+}
+
+mixin Mixin2 on Super1, Super2 {
+ late int field1 = () {
+ return super.field1 = super.field1 + 1;
+ }();
+
+ late int field2 = () {
+ return 88;
+ }();
+
+ void method1() {
+ super.method1();
+ }
+
+ void method2() {}
+
+ int get property1 {
+ return super.property1;
+ }
+
+ void set property1(int value) {
+ super.property1 = value;
+ }
+
+ int get property2 {
+ return 42;
+ }
+
+ void set property2(int value) {}
+}
diff --git a/pkg/front_end/testcases/general/mixin_super/test.options b/pkg/front_end/testcases/general/mixin_super/test.options
new file mode 100644
index 0000000..bfe6dc8
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_super/test.options
@@ -0,0 +1 @@
+main_lib.dart
\ No newline at end of file
diff --git a/pkg/front_end/testcases/incremental.status b/pkg/front_end/testcases/incremental.status
index 9638f1b..aa3f9c4 100644
--- a/pkg/front_end/testcases/incremental.status
+++ b/pkg/front_end/testcases/incremental.status
@@ -11,7 +11,6 @@
late_lowering: EquivalenceError
constant_fileoffset_and_typedef: EquivalenceError
no_such_method_forwarder: EquivalenceError
-no_change_but_changed_type_02: EquivalenceError
changing_nullability_on_recompile: EquivalenceError
initializer_not_copied: EquivalenceError
changed_error: EquivalenceError
diff --git a/pkg/front_end/testcases/incremental/no_change_but_changed_type_02.yaml.world.1.expect b/pkg/front_end/testcases/incremental/no_change_but_changed_type_02.yaml.world.1.expect
index 586c7b0..2ac1aeb 100644
--- a/pkg/front_end/testcases/incremental/no_change_but_changed_type_02.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/no_change_but_changed_type_02.yaml.world.1.expect
@@ -24,11 +24,11 @@
synthetic constructor •() → main::B
: super dart.core::Object::•()
;
- no-such-method-forwarder get /* from org-dartlang-test:///lib.dart */ _#A#x#isSet() → dynamic
- return this.{dart.core::Object::noSuchMethod}(new dart.core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, dart.core::Map::unmodifiable<dart.core::Symbol*, dynamic>(#C4))){(dart.core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} dynamic;
+ no-such-method-forwarder get /* from org-dartlang-test:///lib.dart */ _#A#x#isSet() → dart.core::bool
+ return this.{dart.core::Object::noSuchMethod}(new dart.core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, dart.core::Map::unmodifiable<dart.core::Symbol*, dynamic>(#C4))){(dart.core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} dart.core::bool;
no-such-method-forwarder get /* from org-dartlang-test:///lib.dart */ _#A#x() → dart.core::int?
return this.{dart.core::Object::noSuchMethod}(new dart.core::_InvocationMirror::_withType(#C5, 1, #C2, #C3, dart.core::Map::unmodifiable<dart.core::Symbol*, dynamic>(#C4))){(dart.core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} dart.core::int?;
- no-such-method-forwarder set /* from org-dartlang-test:///lib.dart */ _#A#x#isSet(dynamic value) → void
+ no-such-method-forwarder set /* from org-dartlang-test:///lib.dart */ _#A#x#isSet(dart.core::bool value) → void
return this.{dart.core::Object::noSuchMethod}(new dart.core::_InvocationMirror::_withType(#C6, 2, #C2, dart.core::List::unmodifiable<dynamic>(dart.core::_GrowableList::_literal1<dynamic>(value)), dart.core::Map::unmodifiable<dart.core::Symbol*, dynamic>(#C4))){(dart.core::Invocation) → dynamic};
no-such-method-forwarder set /* from org-dartlang-test:///lib.dart */ _#A#x(dart.core::int? value) → void
return this.{dart.core::Object::noSuchMethod}(new dart.core::_InvocationMirror::_withType(#C7, 2, #C2, dart.core::List::unmodifiable<dynamic>(dart.core::_GrowableList::_literal1<dynamic>(value)), dart.core::Map::unmodifiable<dart.core::Symbol*, dynamic>(#C4))){(dart.core::Invocation) → dynamic};
diff --git a/pkg/front_end/testcases/nnbd/issue42546.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue42546.dart.weak.outline.expect
index ec6a7f6..e218902 100644
--- a/pkg/front_end/testcases/nnbd/issue42546.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue42546.dart.weak.outline.expect
@@ -28,19 +28,19 @@
Extra constant evaluation status:
-Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:814:13 -> SymbolConstant(#catchError)
-Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:814:13 -> ListConstant(const <Type*>[])
-Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:814:13 -> SymbolConstant(#test)
-Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:865:13 -> SymbolConstant(#whenComplete)
-Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:865:13 -> ListConstant(const <Type*>[])
-Evaluated: MapLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:865:13 -> MapConstant(const <Symbol*, dynamic>{})
-Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:909:13 -> SymbolConstant(#timeout)
-Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:909:13 -> ListConstant(const <Type*>[])
-Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:909:13 -> SymbolConstant(#onTimeout)
-Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:763:13 -> SymbolConstant(#then)
-Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:763:13 -> SymbolConstant(#onError)
-Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:874:13 -> SymbolConstant(#asStream)
-Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:874:13 -> ListConstant(const <Type*>[])
-Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:874:13 -> ListConstant(const <dynamic>[])
-Evaluated: MapLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:874:13 -> MapConstant(const <Symbol*, dynamic>{})
+Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:821:13 -> SymbolConstant(#catchError)
+Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:821:13 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:821:13 -> SymbolConstant(#test)
+Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:872:13 -> SymbolConstant(#whenComplete)
+Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:872:13 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:872:13 -> MapConstant(const <Symbol*, dynamic>{})
+Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:916:13 -> SymbolConstant(#timeout)
+Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:916:13 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:916:13 -> SymbolConstant(#onTimeout)
+Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:770:13 -> SymbolConstant(#then)
+Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:770:13 -> SymbolConstant(#onError)
+Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:881:13 -> SymbolConstant(#asStream)
+Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:881:13 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:881:13 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:881:13 -> MapConstant(const <Symbol*, dynamic>{})
Extra constant evaluation: evaluated: 61, effectively constant: 15
diff --git a/pkg/front_end/tool/ast_model.dart b/pkg/front_end/tool/ast_model.dart
index 4ae1aee..005b7fa 100644
--- a/pkg/front_end/tool/ast_model.dart
+++ b/pkg/front_end/tool/ast_model.dart
@@ -108,6 +108,7 @@
'_proceduresInternal': FieldRule(name: 'procedures'),
'_redirectingFactoriesView': null,
'_redirectingFactoriesInternal': FieldRule(name: 'redirectingFactories'),
+ '_onClause': null,
'lazyBuilder': null,
'dirty': null,
},
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 37c8e79..93f8ea9 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -1072,7 +1072,11 @@
: (flags & ~FlagHasConstConstructor);
}
- List<Supertype> superclassConstraints() {
+ /// If this class is a mixin declaration, this list contains the types from
+ /// the `on` clause. Otherwise the list is empty.
+ List<Supertype> get onClause => _onClause ??= _computeOnClause();
+
+ List<Supertype> _computeOnClause() {
List<Supertype> constraints = <Supertype>[];
// Not a mixin declaration.
@@ -1109,6 +1113,8 @@
/// The types from the `implements` clause.
List<Supertype> implementedTypes;
+ List<Supertype>? _onClause;
+
/// Internal. Should *ONLY* be used from within kernel.
///
/// If non-null, the function that will have to be called to fill-out the
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index e0a072b..f0f2c06 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -24,6 +24,7 @@
dart/minimal_kernel_test: Pass, Slow # Spawns several subprocesses
dart/null_safety_autodetection_in_kernel_compiler_test: Pass, Slow # Spawns several subprocesses
dart/print_object_layout_test: Pass, Slow # Spawns several subprocesses
+dart/regress32619_test: Pass, Slow
dart/slow_path_shared_stub_test: Pass, Slow # Uses --shared-slow-path-triggers-gc flag.
dart/snapshot_version_test: Skip # This test is a Dart1 test (script snapshot)
dart/stack_overflow_shared_test: Pass, Slow # Uses --shared-slow-path-triggers-gc flag.
@@ -41,6 +42,7 @@
dart_2/minimal_kernel_test: Pass, Slow # Spawns several subprocesses
dart_2/null_safety_autodetection_in_kernel_compiler_test: Pass, Slow # Spawns several subprocesses
dart_2/print_object_layout_test: Pass, Slow # Spawns several subprocesses
+dart_2/regress32619_test: Pass, Slow
dart_2/slow_path_shared_stub_test: Pass, Slow # Uses --shared-slow-path-triggers-gc flag.
dart_2/snapshot_version_test: Skip # This test is a Dart1 test (script snapshot)
dart_2/stack_overflow_shared_test: Pass, Slow # Uses --shared-slow-path-triggers-gc flag.
diff --git a/sdk/lib/async/async.dart b/sdk/lib/async/async.dart
index f4da9ca..ca05fc6 100644
--- a/sdk/lib/async/async.dart
+++ b/sdk/lib/async/async.dart
@@ -109,7 +109,6 @@
CastStreamTransformer,
checkNotNullable,
EmptyIterator,
- isNullFuture,
IterableElementError,
nullFuture,
printToZone,
diff --git a/sdk/lib/async/future.dart b/sdk/lib/async/future.dart
index 908e5e1..f83386d 100644
--- a/sdk/lib/async/future.dart
+++ b/sdk/lib/async/future.dart
@@ -223,6 +223,13 @@
/// it's very clearly documented.
@pragma("wasm:entry-point")
abstract class Future<T> {
+ /// A `Future<Null>` completed with `null`.
+ ///
+ /// Currently shared with `dart:internal`.
+ /// If that future can be removed, then change this back to
+ /// `_Future<Null>.zoneValue(null, _rootZone);`
+ static final _Future<Null> _nullFuture = nullFuture as _Future<Null>;
+
/// A `Future<bool>` completed with `false`.
static final _Future<bool> _falseFuture =
new _Future<bool>.zoneValue(false, _rootZone);
diff --git a/sdk/lib/async/stream.dart b/sdk/lib/async/stream.dart
index bb942d9..038c3bb 100644
--- a/sdk/lib/async/stream.dart
+++ b/sdk/lib/async/stream.dart
@@ -515,7 +515,7 @@
controller
..onCancel = () {
timer.cancel();
- return nullFuture;
+ return Future._nullFuture;
}
..onPause = () {
watch.stop();
diff --git a/sdk/lib/async/stream_controller.dart b/sdk/lib/async/stream_controller.dart
index 2d381c5..2baf008 100644
--- a/sdk/lib/async/stream_controller.dart
+++ b/sdk/lib/async/stream_controller.dart
@@ -588,10 +588,7 @@
Future<void> get done => _ensureDoneFuture();
Future<void> _ensureDoneFuture() =>
- _doneFuture ??
- (_isCanceled
- ? nullFuture as Future<void>
- : _doneFuture = _Future<void>());
+ _doneFuture ??= _isCanceled ? Future._nullFuture : _Future<void>();
/// Send or enqueue a data event.
void add(T value) {
@@ -922,7 +919,7 @@
var cancel = addSubscription.cancel();
if (cancel == null) {
addStreamFuture._asyncComplete(null);
- return nullFuture;
+ return Future._nullFuture;
}
return cancel.whenComplete(() {
addStreamFuture._asyncComplete(null);
diff --git a/sdk/lib/async/stream_impl.dart b/sdk/lib/async/stream_impl.dart
index 9065c46..b4fb5d8 100644
--- a/sdk/lib/async/stream_impl.dart
+++ b/sdk/lib/async/stream_impl.dart
@@ -197,7 +197,7 @@
if (!_isCanceled) {
_cancel();
}
- return _cancelFuture ?? nullFuture;
+ return _cancelFuture ?? Future._nullFuture;
}
Future<E> asFuture<E>([E? futureValue]) {
@@ -217,7 +217,7 @@
};
_onError = (Object error, StackTrace stackTrace) {
Future cancelFuture = cancel();
- if (!isNullFuture(Zone._current, cancelFuture)) {
+ if (!identical(cancelFuture, Future._nullFuture)) {
cancelFuture.whenComplete(() {
result._completeError(error, stackTrace);
});
@@ -297,7 +297,7 @@
// Hooks called when the input is paused, unpaused or canceled.
// These must not throw. If overwritten to call user code, include suitable
// try/catch wrapping and send any errors to
- // [Zone._current.handleUncaughtError].
+ // [_Zone.current.handleUncaughtError].
void _onPause() {
assert(_isInputPaused);
}
@@ -352,6 +352,7 @@
// future to finish we must not report the error.
if (_isCanceled && !_waitsForCancel) return;
_state |= _STATE_IN_CALLBACK;
+ // TODO(floitsch): this dynamic should be 'void'.
var onError = _onError;
if (onError is void Function(Object, StackTrace)) {
_zone.runBinaryGuarded<Object, StackTrace>(onError, error, stackTrace);
@@ -365,7 +366,8 @@
_state |= _STATE_WAIT_FOR_CANCEL;
_cancel();
var cancelFuture = _cancelFuture;
- if (cancelFuture != null && !isNullFuture(Zone._current, cancelFuture)) {
+ if (cancelFuture != null &&
+ !identical(cancelFuture, Future._nullFuture)) {
cancelFuture.whenComplete(sendError);
} else {
sendError();
@@ -394,7 +396,7 @@
_cancel();
_state |= _STATE_WAIT_FOR_CANCEL;
var cancelFuture = _cancelFuture;
- if (cancelFuture != null && !isNullFuture(Zone._current, cancelFuture)) {
+ if (cancelFuture != null && !identical(cancelFuture, Future._nullFuture)) {
cancelFuture.whenComplete(sendDone);
} else {
sendDone();
@@ -670,7 +672,7 @@
}
}
- Future cancel() => nullFuture;
+ Future cancel() => Future._nullFuture;
Future<E> asFuture<E>([E? futureValue]) {
E resultValue;
@@ -817,7 +819,7 @@
Future cancel() {
_stream._cancelSubscription();
- return nullFuture;
+ return Future._nullFuture;
}
bool get isPaused {
@@ -961,7 +963,7 @@
}
return subscription.cancel();
}
- return nullFuture;
+ return Future._nullFuture;
}
void _onData(T data) {
diff --git a/sdk/lib/async/stream_pipe.dart b/sdk/lib/async/stream_pipe.dart
index 78ad675..cd707be 100644
--- a/sdk/lib/async/stream_pipe.dart
+++ b/sdk/lib/async/stream_pipe.dart
@@ -26,7 +26,7 @@
void _cancelAndError(StreamSubscription subscription, _Future future,
Object error, StackTrace stackTrace) {
var cancelFuture = subscription.cancel();
- if (cancelFuture != null && !isNullFuture(Zone._current, cancelFuture)) {
+ if (cancelFuture != null && !identical(cancelFuture, Future._nullFuture)) {
cancelFuture.whenComplete(() => future._completeError(error, stackTrace));
} else {
future._completeError(error, stackTrace);
@@ -55,7 +55,7 @@
before completing with a value. */
void _cancelAndValue(StreamSubscription subscription, _Future future, value) {
var cancelFuture = subscription.cancel();
- if (cancelFuture != null && !isNullFuture(Zone._current, cancelFuture)) {
+ if (cancelFuture != null && !identical(cancelFuture, Future._nullFuture)) {
cancelFuture.whenComplete(() => future._complete(value));
} else {
future._complete(value);
diff --git a/sdk/lib/core/iterable.dart b/sdk/lib/core/iterable.dart
index 41d7e23..e710e73 100644
--- a/sdk/lib/core/iterable.dart
+++ b/sdk/lib/core/iterable.dart
@@ -823,6 +823,15 @@
}
/// An [Iterator] that allows moving backwards as well as forwards.
+///
+/// Deprecation note: This interface has turned out to not be
+/// valuable as a general reusable interface. There is still only
+/// one class implementing it, [RuneIterator], and at least one other
+/// bidirectional iterator preferred a different name than `movePrevious`
+/// for the other direction.
+/// As such, this interface does not carry its own weight, and will be
+/// removed in a later release.
+@Deprecated("Use the implementing class directly")
abstract class BidirectionalIterator<E> implements Iterator<E> {
/// Move back to the previous element.
///
diff --git a/sdk/lib/internal/internal.dart b/sdk/lib/internal/internal.dart
index 92f7a34..ff3d890 100644
--- a/sdk/lib/internal/internal.dart
+++ b/sdk/lib/internal/internal.dart
@@ -136,7 +136,7 @@
return digit1 * 16 + digit2 - (digit2 & 256);
}
-/// A reusable `null`-valued future per zone used by `dart:async`.
+/// A reusable `null`-valued future used by `dart:async`.
///
/// **DO NOT USE.**
///
@@ -156,14 +156,7 @@
/// This future will be removed again if we can ever do so.
/// Do not use it for anything other than preserving timing
/// during the null safety migration.
-Future<Null> get nullFuture =>
- _nullFutures[Zone.current] ??= Future<Null>.value(null);
-
-/// Whether [future] is the null future of the current zone.
-bool isNullFuture(Zone zone, Future future) =>
- identical(_nullFutures[zone], future);
-
-final Expando<Future<Null>> _nullFutures = Expando<Future<Null>>();
+final Future<Null> nullFuture = Zone.root.run(() => Future<Null>.value(null));
/// A default hash function used by the platform in various places.
///
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index 413ef72..20ff4d8 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -3,6 +3,7 @@
# BSD-style license that can be found in the LICENSE file.
bigint_parse_radix_test/3: Slow # Issue http://dartbug.com/47050
+bigint_test: Pass, Slow
[ $compiler == dartdevk ]
regexp/lookbehind_test/01: Skip # Flaky in uncatchable way. Issue 36280
diff --git a/tests/corelib_2/corelib_2.status b/tests/corelib_2/corelib_2.status
index 87e8d4a..1c832d5 100644
--- a/tests/corelib_2/corelib_2.status
+++ b/tests/corelib_2/corelib_2.status
@@ -3,6 +3,7 @@
# BSD-style license that can be found in the LICENSE file.
bigint_parse_radix_test/3: Slow # Issue http://dartbug.com/47050
+bigint_test: Pass, Slow
[ $compiler == dartdevk ]
regexp/lookbehind_test/01: Skip # Flaky in uncatchable way. Issue 36280
diff --git a/tests/lib/async/null_future_zone_test.dart b/tests/lib/async/null_future_zone_test.dart
index c74554b..9a266be 100644
--- a/tests/lib/async/null_future_zone_test.dart
+++ b/tests/lib/async/null_future_zone_test.dart
@@ -13,33 +13,21 @@
Expect.isFalse(await it.moveNext());
late Future nullFuture;
-
- bool nullFutureZoneUsed = false;
- runZoned(() {
- // Known code that exposes the special "nullFuture".
- nullFuture = (new StreamController()..stream.listen(null).cancel()).done;
- }, zoneSpecification: new ZoneSpecification(scheduleMicrotask:
- (Zone self, ZoneDelegate parent, Zone zone, void f()) {
- Expect.identical(zone, self);
- nullFutureZoneUsed = true;
- parent.scheduleMicrotask(zone, f);
- }));
-
- nullFuture.then((value) {
- Expect.isNull(value);
- Expect.isTrue(nullFutureZoneUsed);
- asyncEnd();
- });
-
late Future falseFuture;
runZoned(() {
+ nullFuture = (new StreamController()..stream.listen(null).cancel()).done;
falseFuture = it.moveNext();
}, zoneSpecification: new ZoneSpecification(scheduleMicrotask:
(Zone self, ZoneDelegate parent, Zone zone, void f()) {
Expect.fail("Should not be called");
}));
+ nullFuture.then((value) {
+ Expect.isNull(value);
+ asyncEnd();
+ });
+
falseFuture.then((value) {
Expect.isFalse(value);
asyncEnd();
diff --git a/tests/lib_2/async/null_future_zone_test.dart b/tests/lib_2/async/null_future_zone_test.dart
index 77cb1b7..3322916 100644
--- a/tests/lib_2/async/null_future_zone_test.dart
+++ b/tests/lib_2/async/null_future_zone_test.dart
@@ -15,32 +15,21 @@
Expect.isFalse(await it.moveNext());
Future nullFuture;
-
- bool nullFutureZoneUsed = false;
- runZoned(() {
- nullFuture = (new StreamController()..stream.listen(null).cancel()).done;
- }, zoneSpecification: new ZoneSpecification(scheduleMicrotask:
- (Zone self, ZoneDelegate parent, Zone zone, void f()) {
- Expect.identical(zone, self);
- nullFutureZoneUsed = true;
- parent.scheduleMicrotask(zone, f);
- }));
-
- nullFuture.then((value) {
- Expect.isNull(value);
- Expect.isTrue(nullFutureZoneUsed);
- asyncEnd();
- });
-
Future falseFuture;
runZoned(() {
+ nullFuture = (new StreamController()..stream.listen(null).cancel()).done;
falseFuture = it.moveNext();
}, zoneSpecification: new ZoneSpecification(scheduleMicrotask:
(Zone self, ZoneDelegate parent, Zone zone, void f()) {
Expect.fail("Should not be called");
}));
+ nullFuture.then((value) {
+ Expect.isNull(value);
+ asyncEnd();
+ });
+
falseFuture.then((value) {
Expect.isFalse(value);
asyncEnd();
diff --git a/tools/VERSION b/tools/VERSION
index 5671960..67be777 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 18
PATCH 0
-PRERELEASE 225
+PRERELEASE 226
PRERELEASE_PATCH 0
\ No newline at end of file