From e18977ed9c393c926ce18f0190812445d67676b2 Mon Sep 17 00:00:00 2001 From: Johnni Winther Date: Fri, 24 Jun 2022 14:04:49 +0000 Subject: [PATCH] [cfe] Report error for missing concrete super target In response to https://github.com/dart-lang/sdk/issues/47406 The error is currently not reported if the mixin declaration is from an outline dill. Change-Id: I94a61d6409d0c238614d9f377b5f324153360bc6 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/249184 Reviewed-by: Sigmund Cherem Reviewed-by: Jens Johansen Commit-Queue: Johnni Winther --- .../lib/src/messages/codes_generated.dart | 95 +++ .../lib/src/js_model/element_map_impl.dart | 2 +- .../lib/src/kernel/element_map_impl.dart | 2 +- .../clone_mixin_methods_with_super.dart | 12 +- .../kernel/transformations/late_lowering.dart | 3 + pkg/dev_compiler/lib/src/kernel/compiler.dart | 3 +- .../lib/src/fasta/kernel/benchmarker.dart | 1 + .../lib/src/fasta/kernel/kernel_target.dart | 3 + .../lib/src/fasta/kernel/verifier.dart | 4 +- .../fasta/source/source_class_builder.dart | 2 +- .../fasta/source/source_field_builder.dart | 25 +- .../fasta/source/source_library_builder.dart | 40 +- .../lib/src/fasta/source/source_loader.dart | 178 +++++- pkg/front_end/messages.yaml | 49 ++ .../testcases/dart2js/mixin_super/main.dart | 59 ++ .../mixin_super/main.dart.strong.expect | 492 +++++++++++++++ .../main.dart.strong.transformed.expect | 563 +++++++++++++++++ .../main.dart.textual_outline.expect | 40 ++ .../main.dart.textual_outline_modelled.expect | 40 ++ .../dart2js/mixin_super/main.dart.weak.expect | 492 +++++++++++++++ .../mixin_super/main.dart.weak.modular.expect | 353 +++++++++++ .../mixin_super/main.dart.weak.outline.expect | 316 ++++++++++ .../main.dart.weak.transformed.expect | 563 +++++++++++++++++ .../dart2js/mixin_super/main_lib.dart | 45 ++ .../dart2js/mixin_super/test.options | 1 + .../testcases/dartdevc/mixin_super/main.dart | 59 ++ .../mixin_super/main.dart.strong.expect | 515 +++++++++++++++ .../main.dart.strong.transformed.expect | 515 +++++++++++++++ .../main.dart.textual_outline.expect | 40 ++ .../main.dart.textual_outline_modelled.expect | 40 ++ .../mixin_super/main.dart.weak.expect | 595 ++++++++++++++++++ .../mixin_super/main.dart.weak.modular.expect | 449 +++++++++++++ .../mixin_super/main.dart.weak.outline.expect | 390 ++++++++++++ .../main.dart.weak.transformed.expect | 595 ++++++++++++++++++ .../dartdevc/mixin_super/main_lib.dart | 45 ++ .../dartdevc/mixin_super/test.options | 1 + ...bstract_super_application.dart.weak.expect | 21 + ...super_application.dart.weak.modular.expect | 21 + ...r_application.dart.weak.transformed.expect | 21 + .../testcases/general/mixin_super/main.dart | 59 ++ .../main.dart.textual_outline.expect | 40 ++ .../main.dart.textual_outline_modelled.expect | 40 ++ .../general/mixin_super/main.dart.weak.expect | 435 +++++++++++++ .../mixin_super/main.dart.weak.modular.expect | 317 ++++++++++ .../mixin_super/main.dart.weak.outline.expect | 266 ++++++++ .../main.dart.weak.transformed.expect | 435 +++++++++++++ .../general/mixin_super/main_lib.dart | 45 ++ .../general/mixin_super/test.options | 1 + pkg/front_end/testcases/incremental.status | 1 - ...ge_but_changed_type_02.yaml.world.1.expect | 6 +- pkg/front_end/tool/ast_model.dart | 1 + pkg/kernel/lib/ast.dart | 8 +- 52 files changed, 8303 insertions(+), 41 deletions(-) create mode 100644 pkg/front_end/testcases/dart2js/mixin_super/main.dart create mode 100644 pkg/front_end/testcases/dart2js/mixin_super/main.dart.strong.expect create mode 100644 pkg/front_end/testcases/dart2js/mixin_super/main.dart.strong.transformed.expect create mode 100644 pkg/front_end/testcases/dart2js/mixin_super/main.dart.textual_outline.expect create mode 100644 pkg/front_end/testcases/dart2js/mixin_super/main.dart.textual_outline_modelled.expect create mode 100644 pkg/front_end/testcases/dart2js/mixin_super/main.dart.weak.expect create mode 100644 pkg/front_end/testcases/dart2js/mixin_super/main.dart.weak.modular.expect create mode 100644 pkg/front_end/testcases/dart2js/mixin_super/main.dart.weak.outline.expect create mode 100644 pkg/front_end/testcases/dart2js/mixin_super/main.dart.weak.transformed.expect create mode 100644 pkg/front_end/testcases/dart2js/mixin_super/main_lib.dart create mode 100644 pkg/front_end/testcases/dart2js/mixin_super/test.options create mode 100644 pkg/front_end/testcases/dartdevc/mixin_super/main.dart create mode 100644 pkg/front_end/testcases/dartdevc/mixin_super/main.dart.strong.expect create mode 100644 pkg/front_end/testcases/dartdevc/mixin_super/main.dart.strong.transformed.expect create mode 100644 pkg/front_end/testcases/dartdevc/mixin_super/main.dart.textual_outline.expect create mode 100644 pkg/front_end/testcases/dartdevc/mixin_super/main.dart.textual_outline_modelled.expect create mode 100644 pkg/front_end/testcases/dartdevc/mixin_super/main.dart.weak.expect create mode 100644 pkg/front_end/testcases/dartdevc/mixin_super/main.dart.weak.modular.expect create mode 100644 pkg/front_end/testcases/dartdevc/mixin_super/main.dart.weak.outline.expect create mode 100644 pkg/front_end/testcases/dartdevc/mixin_super/main.dart.weak.transformed.expect create mode 100644 pkg/front_end/testcases/dartdevc/mixin_super/main_lib.dart create mode 100644 pkg/front_end/testcases/dartdevc/mixin_super/test.options create mode 100644 pkg/front_end/testcases/general/mixin_super/main.dart create mode 100644 pkg/front_end/testcases/general/mixin_super/main.dart.textual_outline.expect create mode 100644 pkg/front_end/testcases/general/mixin_super/main.dart.textual_outline_modelled.expect create mode 100644 pkg/front_end/testcases/general/mixin_super/main.dart.weak.expect create mode 100644 pkg/front_end/testcases/general/mixin_super/main.dart.weak.modular.expect create mode 100644 pkg/front_end/testcases/general/mixin_super/main.dart.weak.outline.expect create mode 100644 pkg/front_end/testcases/general/mixin_super/main.dart.weak.transformed.expect create mode 100644 pkg/front_end/testcases/general/mixin_super/main_lib.dart create mode 100644 pkg/front_end/testcases/general/mixin_super/test.options 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 42e8fa8a01e1..e6fcee3ce8b5 100644 --- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart +++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart @@ -7820,6 +7820,101 @@ const MessageCode messageMissingTypedefParameters = const MessageCode( problemMessage: r"""A typedef needs an explicit list of parameters.""", 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 codeMixinApplicationNoConcreteGetter = + const Code( + "MixinApplicationNoConcreteGetter", + analyzerCodes: [ + "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 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 codeMixinApplicationNoConcreteMethod = + const Code( + "MixinApplicationNoConcreteMethod", + analyzerCodes: [ + "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 codeMixinApplicationNoConcreteSetter = + const Code( + "MixinApplicationNoConcreteSetter", + analyzerCodes: [ + "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 codeMixinDeclaresConstructor = messageMixinDeclaresConstructor; 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 aa4e6c3020fb..a1a18b5ebf3a 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 @@ class JsKernelToElementMap implements JsToElementMap, IrToElementMap { // // 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 46cbef368b5a..0fb9528ef33b 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 @@ class KernelToElementMap implements IrToElementMap { // // 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 abefe2dea569..c5e1d6a0e085 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 @@ class _CloneMixinMethodsWithSuper { 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 @@ class _CloneMixinMethodsWithSuper { 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 1cc5b85735ec..11cfe130e1e6 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 @@ class LateLowering { 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/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart index a90af23a8bf2..3bc73391739a 100644 --- a/pkg/dev_compiler/lib/src/kernel/compiler.dart +++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart @@ -1397,8 +1397,7 @@ class ProgramCompiler extends ComputeOnceConstantVisitor 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 b56767713127..87743e7ea866 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 @@ enum BenchmarkPhases { 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 a489884086c2..101ed7fe26c4 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 @@ class KernelTarget extends TargetImplementation { 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 acdf960b37c7..40f67fab7001 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:_fe_analyzer_shared/src/messages/severity.dart' show Severity; 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 @@ class FastaVerifyingVisitor extends VerifyingVisitor { 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 3e629a1348f4..d5bf381c3427 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 @@ class SourceClassBuilder extends ClassBuilderImpl // 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 2460d6f4b093..00682eb736fe 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 @@ class SourceFieldBuilder extends SourceMemberBuilderImpl ClassHierarchy classHierarchy, List delayedActionPerformers, List delayedDefaultValueCloners) { - _fieldEncoding.completeSignature(classHierarchy.coreTypes); - for (Annotatable annotatable in _fieldEncoding.annotatables) { MetadataBuilder.buildAnnotations( annotatable, @@ -593,10 +591,6 @@ abstract class FieldEncoding { /// Returns a list of the setters created by this field encoding. List 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; } @@ -657,9 +651,6 @@ class RegularFieldEncoding implements FieldEncoding { _field.type = value; } - @override - void completeSignature(CoreTypes coreTypes) {} - @override void createBodies(CoreTypes coreTypes, Expression? initializer) { if (initializer != null) { @@ -899,11 +890,6 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding { late_lowering.computeIsSetEncoding(_type!, _isSetStrategy); } - @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."); @@ -924,6 +910,10 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding { } _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 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding { _lateIsSetField! ..isStatic = !isInstanceMember ..isStatic = _field.isStatic - ..isExtensionMember = isExtensionMember; + ..isExtensionMember = isExtensionMember + ..type = libraryBuilder.loader + .createCoreType('bool', Nullability.nonNullable); updatePrivateMemberName(_lateIsSetField!, libraryBuilder); } _lateGetter @@ -1721,9 +1713,6 @@ class AbstractOrExternalFieldEncoding implements FieldEncoding { } } - @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 f7c0b5c20e9d..934983c32607 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 @@ class SourceLibraryBuilder extends LibraryBuilderImpl { .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 @@ class SourceLibraryBuilder extends LibraryBuilderImpl { 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 @@ class SourceLibraryBuilder extends LibraryBuilderImpl { getterReference: referenceFrom?.reference); } - TypeBuilder? applyMixins( + TypeBuilder? _applyMixins( TypeBuilder? supertype, MixinApplicationBuilder? mixinApplications, int startCharOffset, @@ -2397,6 +2398,7 @@ class SourceLibraryBuilder extends LibraryBuilderImpl { applicationTypeArguments, charOffset, instanceTypeVariableAccess: InstanceTypeVariableAccessState.Allowed); + registerMixinApplication(application, mixin); } return supertype; } else { @@ -2404,6 +2406,34 @@ class SourceLibraryBuilder extends LibraryBuilderImpl { } } + Map? _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 mixinApplications) { + assert(_mixinApplications != null, + "Mixin applications have already been processed."); + mixinApplications.addAll(_mixinApplications!); + _mixinApplications = null; + Iterable? patchLibraries = this.patchLibraries; + if (patchLibraries != null) { + for (SourceLibraryBuilder patchLibrary in patchLibraries) { + patchLibrary.takeMixinApplications(mixinApplications); + } + } + } + void addNamedMixinApplication( List? metadata, String name, @@ -2420,7 +2450,7 @@ class SourceLibraryBuilder extends LibraryBuilderImpl { // 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 @@ class SourceLibraryBuilder extends LibraryBuilderImpl { 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 9f3e6da60ece..d3b47dea78eb 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/body_builder.dart' show BodyBuilder; 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 @@ severity: $severity 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? 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 @@ severity: $severity void checkMixins(List 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 @@ severity: $severity 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 mixinApplications = {}; + libraryBuilder.takeMixinApplications(mixinApplications); + for (MapEntry 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 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 delayedDefaultValueCloners) { List delayedActionPerformers = @@ -2849,3 +2910,118 @@ class _SourceClassGraph implements Graph { 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 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> _getterMaps = {}; + Map> _setterMaps = {}; + + Map _computeGetters(Class cls) { + Map 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 _computeSetters(Class cls) { + Map 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 _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 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 5c0668ef043a..5b1af01a4347 100644 --- a/pkg/front_end/messages.yaml +++ b/pkg/front_end/messages.yaml @@ -5612,3 +5612,52 @@ MixinInheritsFromNotObject: 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 000000000000..1c32e506b699 --- /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 000000000000..1fb218a87b95 --- /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(); + field core::int _#Mixin2#field2#AI = _in::createSentinel(); + 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 000000000000..9f8984c8242e --- /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(); + field core::int _#Mixin1#field2#AI = _in::createSentinel(); + 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(); + field core::int _#Mixin2#field2#AI = _in::createSentinel(); + 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 000000000000..105f96215e02 --- /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 000000000000..d1d920cfad13 --- /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 000000000000..1fb218a87b95 --- /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(); + field core::int _#Mixin2#field2#AI = _in::createSentinel(); + 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 000000000000..808a5991ffa4 --- /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 000000000000..34aaadadc17d --- /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(); + field core::int _#Mixin2#field2#A = _in::createSentinel(); + 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(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(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 000000000000..9f8984c8242e --- /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(); + field core::int _#Mixin1#field2#AI = _in::createSentinel(); + 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(); + field core::int _#Mixin2#field2#AI = _in::createSentinel(); + 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 000000000000..2d5e63b2a9a0 --- /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 000000000000..bfe6dc8532c2 --- /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 000000000000..1c32e506b699 --- /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 000000000000..82b551538dd9 --- /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 000000000000..82b551538dd9 --- /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 000000000000..105f96215e02 --- /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 000000000000..d1d920cfad13 --- /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 000000000000..8b5e70c4b3d0 --- /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 000000000000..44eb12685dc9 --- /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 000000000000..e7dd81051d2e --- /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 000000000000..8b5e70c4b3d0 --- /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 000000000000..2d5e63b2a9a0 --- /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 000000000000..bfe6dc8532c2 --- /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 c9780cd8e0aa..3c410b4533de 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 @@ library /*isNonNullableByDefault*/; // 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 c9780cd8e0aa..3c410b4533de 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 @@ library /*isNonNullableByDefault*/; // 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 54180535cb9b..3ab956f034bd 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 @@ library /*isNonNullableByDefault*/; // 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 000000000000..1c32e506b699 --- /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 000000000000..105f96215e02 --- /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 000000000000..d1d920cfad13 --- /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 000000000000..48e7699ecb1e --- /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 000000000000..8eb525c94e70 --- /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 000000000000..73ee8096c310 --- /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 000000000000..e220725d8d61 --- /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 000000000000..2d5e63b2a9a0 --- /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 000000000000..bfe6dc8532c2 --- /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 9638f1b5ac90..aa3f9c4d068c 100644 --- a/pkg/front_end/testcases/incremental.status +++ b/pkg/front_end/testcases/incremental.status @@ -11,7 +11,6 @@ changing_modules_16: Crash 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 586c7b080cc1..2ac1aeb34d91 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 @@ library from "org-dartlang-test:///main.dart" as main { 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(#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(#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(#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(dart.core::_GrowableList::_literal1(value)), dart.core::Map::unmodifiable(#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(dart.core::_GrowableList::_literal1(value)), dart.core::Map::unmodifiable(#C4))){(dart.core::Invocation) → dynamic}; diff --git a/pkg/front_end/tool/ast_model.dart b/pkg/front_end/tool/ast_model.dart index 4ae1aee8df1a..005b7fa41792 100644 --- a/pkg/front_end/tool/ast_model.dart +++ b/pkg/front_end/tool/ast_model.dart @@ -108,6 +108,7 @@ const Map> _fieldRuleMap = { '_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 37c8e79d9e38..93f8ea9b3813 100644 --- a/pkg/kernel/lib/ast.dart +++ b/pkg/kernel/lib/ast.dart @@ -1072,7 +1072,11 @@ class Class extends NamedNode implements Annotatable, FileUriNode { : (flags & ~FlagHasConstConstructor); } - List superclassConstraints() { + /// If this class is a mixin declaration, this list contains the types from + /// the `on` clause. Otherwise the list is empty. + List get onClause => _onClause ??= _computeOnClause(); + + List _computeOnClause() { List constraints = []; // Not a mixin declaration. @@ -1109,6 +1113,8 @@ class Class extends NamedNode implements Annotatable, FileUriNode { /// The types from the `implements` clause. List implementedTypes; + List? _onClause; + /// Internal. Should *ONLY* be used from within kernel. /// /// If non-null, the function that will have to be called to fill-out the