[cfe] Remove support for old super-mixins feature

This CL remove the support for mixing in classes that don't extend
Object. An error has been report by the analyzer for some time and
now also by the CFE.

This puts the breaking change https://github.com/dart-lang/sdk/issues/48167 into effect.

TEST=pkg/front_end/testcases/general/issue48167.dart

Change-Id: Ia7715a27dc1aa18a7c85b24ed86d19a91b6924d5
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/247551
Reviewed-by: Chloe Stefantsova <cstefantsova@google.com>
Reviewed-by: Slava Egorov <vegorov@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
This commit is contained in:
Johnni Winther 2022-06-13 15:30:57 +00:00 committed by Commit Bot
parent d876b2b48d
commit 7900e9071a
106 changed files with 855 additions and 275 deletions

View file

@ -1,3 +1,23 @@
## 2.19.0
### Language
- **Breaking Change** [#48167](https://github.com/dart-lang/sdk/issues/48167):
Mixin of classes that don't extend `Object` is no longer supported:
```dart
class Base {}
class Mixin extends Base {}
class C extends Base with Mixin {}
```
This should instead be written using a mixin declaration of `Mixin`:
```dart
class Base {}
mixin Mixin on Base {}
class C extends Base with Mixin {}
```
This feature has not been supported in most compilation targets for some
time but is now completely removed.
## 2.18.0
### Language

View file

@ -7838,6 +7838,31 @@ const MessageCode messageMixinFunction = const MessageCode("MixinFunction",
problemMessage: r"""Mixing in 'Function' is deprecated.""",
correctionMessage: r"""Try removing 'Function' from the 'with' clause.""");
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<
Message Function(
String
name)> templateMixinInheritsFromNotObject = const Template<
Message Function(String name)>(
problemMessageTemplate:
r"""The class '#name' can't be used as a mixin because it extends a class other than 'Object'.""",
withArguments: _withArgumentsMixinInheritsFromNotObject);
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Code<Message Function(String name)> codeMixinInheritsFromNotObject =
const Code<Message Function(String name)>("MixinInheritsFromNotObject",
analyzerCodes: <String>["MIXIN_INHERITS_FROM_NOT_OBJECT"]);
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
Message _withArgumentsMixinInheritsFromNotObject(String name) {
if (name.isEmpty) throw 'No name provided';
name = demangleMixinApplicationName(name);
return new Message(codeMixinInheritsFromNotObject,
problemMessage:
"""The class '${name}' can't be used as a mixin because it extends a class other than 'Object'.""",
arguments: {'name': name});
}
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<
Message Function(

View file

@ -23,7 +23,7 @@ class SuperB extends SuperA {
method1(a) => 'B$a';
}
class Mixin extends SuperA {
mixin Mixin on SuperA {
method1(a) => super.method1('M$a');
method2(a) => 'M$a';
}
@ -55,8 +55,10 @@ main() {
Expect.isTrue(elementEnvironment.isMixinApplicationWithMembers(superClass));
Expect.equals(mixin, elementEnvironment.getEffectiveMixinClass(superClass));
Expect.equals(superA, elementEnvironment.getSuperClass(mixin));
Expect.equals(superB, elementEnvironment.getSuperClass(superClass));
Expect.equals(superA, elementEnvironment.getSuperClass(superB));
Expect.equals(elementEnvironment.getSuperClass(superA),
elementEnvironment.getSuperClass(mixin));
MemberEntity method1 = lookupMember(elementEnvironment, 'Class.method1');
Expect.equals(superClass, method1.enclosingClass);

View file

@ -417,9 +417,7 @@ abstract class ClassBuilderImpl extends DeclarationBuilderImpl
? hierarchy.getDispatchTarget(instanceClass, name, setter: isSetter)
: hierarchy.getInterfaceMember(instanceClass, name, setter: isSetter);
if (isSuper && target == null) {
if (cls.isMixinDeclaration ||
(libraryBuilder.loader.target.backendTarget.enableSuperMixins &&
this.isAbstract)) {
if (cls.isMixinDeclaration) {
target =
hierarchy.getInterfaceMember(instanceClass, name, setter: isSetter);
}

View file

@ -487,8 +487,8 @@ class KernelTarget extends TargetImplementation {
loader.buildClassHierarchy(sortedSourceClassBuilders, objectClassBuilder);
benchmarker?.enterPhase(BenchmarkPhases.outline_checkSupertypes);
loader.checkSupertypes(
sortedSourceClassBuilders, enumClass, underscoreEnumClass);
loader.checkSupertypes(sortedSourceClassBuilders, objectClass, enumClass,
underscoreEnumClass);
if (macroApplications != null) {
benchmarker?.enterPhase(BenchmarkPhases.outline_applyDeclarationMacros);

View file

@ -41,6 +41,7 @@ import '../dill/dill_member_builder.dart';
import '../fasta_codes.dart';
import '../kernel/combined_member_signature.dart';
import '../kernel/hierarchy/hierarchy_builder.dart';
import '../kernel/hierarchy/hierarchy_node.dart';
import '../kernel/kernel_helper.dart';
import '../kernel/kernel_target.dart' show KernelTarget;
import '../kernel/redirecting_factory_body.dart'
@ -729,6 +730,7 @@ class SourceClassBuilder extends ClassBuilderImpl
void checkSupertypes(
CoreTypes coreTypes,
ClassHierarchyBuilder hierarchyBuilder,
Class objectClass,
Class enumClass,
Class underscoreEnumClass,
Class? macroClass) {
@ -738,16 +740,17 @@ class SourceClassBuilder extends ClassBuilderImpl
// Moreover, it checks that `FutureOr` and `void` are not among the
// supertypes and that `Enum` is not implemented by non-abstract classes.
ClassHierarchyNode classHierarchyNode =
hierarchyBuilder.getNodeFromClass(cls);
if (libraryBuilder.libraryFeatures.enhancedEnums.isEnabled && !isEnum) {
bool hasEnumSuperinterface = false;
List<Supertype> interfaces =
hierarchyBuilder.getNodeFromClass(cls).superclasses;
List<Supertype> interfaces = classHierarchyNode.superclasses;
for (int i = 0; !hasEnumSuperinterface && i < interfaces.length; i++) {
if (interfaces[i].classNode == enumClass) {
hasEnumSuperinterface = true;
}
}
interfaces = hierarchyBuilder.getNodeFromClass(cls).interfaces;
interfaces = classHierarchyNode.interfaces;
for (int i = 0; !hasEnumSuperinterface && i < interfaces.length; i++) {
if (interfaces[i].classNode == enumClass) {
hasEnumSuperinterface = true;
@ -810,14 +813,13 @@ class SourceClassBuilder extends ClassBuilderImpl
if (macroClass != null && !cls.isMacro && !cls.isAbstract) {
// TODO(johnniwinther): Merge this check with the loop above.
bool isMacroFound = false;
List<Supertype> interfaces =
hierarchyBuilder.getNodeFromClass(cls).superclasses;
List<Supertype> interfaces = classHierarchyNode.superclasses;
for (int i = 0; !isMacroFound && i < interfaces.length; i++) {
if (interfaces[i].classNode == macroClass) {
isMacroFound = true;
}
}
interfaces = hierarchyBuilder.getNodeFromClass(cls).interfaces;
interfaces = classHierarchyNode.interfaces;
for (int i = 0; !isMacroFound && i < interfaces.length; i++) {
if (interfaces[i].classNode == macroClass) {
isMacroFound = true;
@ -866,6 +868,23 @@ class SourceClassBuilder extends ClassBuilderImpl
superClass = decl;
}
}
if (classHierarchyNode.isMixinApplication) {
assert(mixedInTypeBuilder != null,
"No mixed in type builder for mixin application $this.");
ClassHierarchyNode mixedInNode = classHierarchyNode.mixedInNode!;
ClassHierarchyNode? mixinSuperClassNode =
mixedInNode.directSuperClassNode;
if (mixinSuperClassNode != null &&
mixinSuperClassNode.classBuilder.cls != objectClass &&
!mixedInNode.classBuilder.cls.isMixinDeclaration) {
addProblem(
templateMixinInheritsFromNotObject
.withArguments(mixedInNode.classBuilder.name),
mixedInTypeBuilder!.charOffset ?? TreeNode.noOffset,
noLength);
}
}
if (interfaceBuilders == null) return;
// Validate interfaces.

View file

@ -2117,12 +2117,12 @@ severity: $severity
ticker.logMs("Computed core types");
}
void checkSupertypes(List<SourceClassBuilder> sourceClasses, Class enumClass,
Class underscoreEnumClass) {
void checkSupertypes(List<SourceClassBuilder> sourceClasses,
Class objectClass, Class enumClass, Class underscoreEnumClass) {
for (SourceClassBuilder builder in sourceClasses) {
if (builder.libraryBuilder.loader == this && !builder.isPatch) {
builder.checkSupertypes(coreTypes, hierarchyBuilder, enumClass,
underscoreEnumClass, _macroClassBuilder?.cls);
builder.checkSupertypes(coreTypes, hierarchyBuilder, objectClass,
enumClass, underscoreEnumClass, _macroClassBuilder?.cls);
}
}
ticker.logMs("Checked supertypes");

View file

@ -5604,3 +5604,11 @@ EnumImplementerContainsRestrictedInstanceDeclaration:
EnumAbstractMember:
problemMessage: "Enums can't declare abstract members."
MixinInheritsFromNotObject:
problemMessage: "The class '#name' can't be used as a mixin because it extends a class other than 'Object'."
analyzerCode: MIXIN_INHERITS_FROM_NOT_OBJECT
script: |
class Base {}
class Mixin extends Base {}
class C extends Base with Mixin {}

View file

@ -108,7 +108,7 @@ Future<void> testEnabledSuperMixins() async {
..target = new NoneTargetWithSuperMixins(new TargetFlags());
await compileScript(testSource, options: options);
Expect.setEquals(
const <String>['baz', 'foo', 'quux'], missingSuperMethodNames);
const <String>['bar', 'baz', 'foo', 'quux'], missingSuperMethodNames);
}
void main() {

View file

@ -166,7 +166,6 @@ augment class Class6a {
*/
class Class6a {}
@SequenceMacro(0)
/*class: Class7d:
declarations:
@ -174,7 +173,8 @@ augment class Class7d {
method2() {}
}
*/
class Class7d with Class7b, Class7c {}
@SequenceMacro(0)
class Class7d extends Class7b with Class7c {}
@SequenceMacro(0)
/*class: Class7c:

View file

@ -95,24 +95,17 @@ class Class6a extends core::Object {
;
method /* from org-dartlang-augmentation:/a/b/c/main.dart-11 */ method() → dynamic {}
}
abstract class _Class7d&Object&Class7b = core::Object with self::Class7b /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_Class7d&Object&Class7b
: super core::Object::•()
;
mixin-super-stub method method1() → dynamic
return super.{self::Class7b::method1}();
}
abstract class _Class7d&Object&Class7b&Class7c = self::_Class7d&Object&Class7b with self::Class7c /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_Class7d&Object&Class7b&Class7c
: super self::_Class7d&Object&Class7b::•()
abstract class _Class7d&Class7b&Class7c = self::Class7b with self::Class7c /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Class7d&Class7b&Class7c
: super self::Class7b::•()
;
mixin-super-stub method method() → dynamic
return super.{self::Class7c::method}();
}
@#C2
class Class7d extends self::_Class7d&Object&Class7b&Class7c {
class Class7d extends self::_Class7d&Class7b&Class7c {
synthetic constructor •() → self::Class7d
: super self::_Class7d&Object&Class7b&Class7c::•()
: super self::_Class7d&Class7b&Class7c::•()
;
method /* from org-dartlang-augmentation:/a/b/c/main.dart-17 */ method2() → dynamic {}
}

View file

@ -6,7 +6,7 @@ abstract class A extends Enum { // Ok.
int get foo => index;
}
enum EA with A { element }
enum EA with A { element } // Error.
abstract class B implements Enum { // Ok.
int get foo => index;

View file

@ -1,4 +1,11 @@
library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/enhanced_enums/enum_as_supertype.dart:9:14: Error: The class 'A' can't be used as a mixin because it extends a class other than 'Object'.
// enum EA with A { element } // Error.
// ^
//
import self as self;
import "dart:core" as core;

View file

@ -1,4 +1,11 @@
library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/enhanced_enums/enum_as_supertype.dart:9:14: Error: The class 'A' can't be used as a mixin because it extends a class other than 'Object'.
// enum EA with A { element } // Error.
// ^
//
import self as self;
import "dart:core" as core;

View file

@ -1,4 +1,11 @@
library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/enhanced_enums/enum_as_supertype.dart:9:14: Error: The class 'A' can't be used as a mixin because it extends a class other than 'Object'.
// enum EA with A { element } // Error.
// ^
//
import self as self;
import "dart:core" as core;

View file

@ -1,4 +1,11 @@
library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/enhanced_enums/enum_as_supertype.dart:9:14: Error: The class 'A' can't be used as a mixin because it extends a class other than 'Object'.
// enum EA with A { element } // Error.
// ^
//
import self as self;
import "dart:core" as core;

View file

@ -1,4 +1,11 @@
library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/enhanced_enums/enum_as_supertype.dart:9:14: Error: The class 'A' can't be used as a mixin because it extends a class other than 'Object'.
// enum EA with A { element } // Error.
// ^
//
import self as self;
import "dart:core" as core;

View file

@ -1,4 +1,11 @@
library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/enhanced_enums/enum_as_supertype.dart:9:14: Error: The class 'A' can't be used as a mixin because it extends a class other than 'Object'.
// enum EA with A { element } // Error.
// ^
//
import self as self;
import "dart:core" as core;

View file

@ -0,0 +1,21 @@
// 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 Base {}
class Mixin1a extends Base {}
class Mixin1b extends Mixin1a {}
class C1a extends Base with Mixin1a {}
class C1b extends Base with Mixin1b {}
mixin Mixin2a on Base {}
mixin Mixin2b on Base, Mixin2a {}
class C2a extends Base with Mixin2a {}
class C2b extends Base with Mixin2a, Mixin2b {}

View file

@ -0,0 +1,16 @@
class Base {}
class Mixin1a extends Base {}
class Mixin1b extends Mixin1a {}
class C1a extends Base with Mixin1a {}
class C1b extends Base with Mixin1b {}
mixin Mixin2a on Base {}
mixin Mixin2b on Base, Mixin2a {}
class C2a extends Base with Mixin2a {}
class C2b extends Base with Mixin2a, Mixin2b {}

View file

@ -0,0 +1,16 @@
class Base {}
class C1a extends Base with Mixin1a {}
class C1b extends Base with Mixin1b {}
class C2a extends Base with Mixin2a {}
class C2b extends Base with Mixin2a, Mixin2b {}
class Mixin1a extends Base {}
class Mixin1b extends Mixin1a {}
mixin Mixin2a on Base {}
mixin Mixin2b on Base, Mixin2a {}

View file

@ -0,0 +1,84 @@
library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/general/issue48167.dart:11:29: Error: The class 'Mixin1a' can't be used as a mixin because it extends a class other than 'Object'.
// class C1a extends Base with Mixin1a {}
// ^
//
// pkg/front_end/testcases/general/issue48167.dart:13:29: Error: The class 'Mixin1b' can't be used as a mixin because it extends a class other than 'Object'.
// class C1b extends Base with Mixin1b {}
// ^
//
import self as self;
import "dart:core" as core;
class Base extends core::Object {
synthetic constructor •() → self::Base
: super core::Object::•()
;
}
class Mixin1a extends self::Base {
synthetic constructor •() → self::Mixin1a
: super self::Base::•()
;
}
class Mixin1b extends self::Mixin1a {
synthetic constructor •() → self::Mixin1b
: super self::Mixin1a::•()
;
}
abstract class _C1a&Base&Mixin1a = self::Base with self::Mixin1a /*isAnonymousMixin*/ {
synthetic constructor •() → self::_C1a&Base&Mixin1a
: super self::Base::•()
;
}
class C1a extends self::_C1a&Base&Mixin1a {
synthetic constructor •() → self::C1a
: super self::_C1a&Base&Mixin1a::•()
;
}
abstract class _C1b&Base&Mixin1b = self::Base with self::Mixin1b /*isAnonymousMixin*/ {
synthetic constructor •() → self::_C1b&Base&Mixin1b
: super self::Base::•()
;
}
class C1b extends self::_C1b&Base&Mixin1b {
synthetic constructor •() → self::C1b
: super self::_C1b&Base&Mixin1b::•()
;
}
abstract class Mixin2a extends self::Base /*isMixinDeclaration*/ {
}
abstract class _Mixin2b&Base&Mixin2a extends core::Object implements self::Base, self::Mixin2a /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Mixin2b&Base&Mixin2a
: super core::Object::•()
;
}
abstract class Mixin2b extends self::_Mixin2b&Base&Mixin2a /*isMixinDeclaration*/ {
}
abstract class _C2a&Base&Mixin2a = self::Base with self::Mixin2a /*isAnonymousMixin*/ {
synthetic constructor •() → self::_C2a&Base&Mixin2a
: super self::Base::•()
;
}
class C2a extends self::_C2a&Base&Mixin2a {
synthetic constructor •() → self::C2a
: super self::_C2a&Base&Mixin2a::•()
;
}
abstract class _C2b&Base&Mixin2a = self::Base with self::Mixin2a /*isAnonymousMixin*/ {
synthetic constructor •() → self::_C2b&Base&Mixin2a
: super self::Base::•()
;
}
abstract class _C2b&Base&Mixin2a&Mixin2b = self::_C2b&Base&Mixin2a with self::Mixin2b /*isAnonymousMixin*/ {
synthetic constructor •() → self::_C2b&Base&Mixin2a&Mixin2b
: super self::_C2b&Base&Mixin2a::•()
;
}
class C2b extends self::_C2b&Base&Mixin2a&Mixin2b {
synthetic constructor •() → self::C2b
: super self::_C2b&Base&Mixin2a&Mixin2b::•()
;
}

View file

@ -0,0 +1,84 @@
library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/general/issue48167.dart:11:29: Error: The class 'Mixin1a' can't be used as a mixin because it extends a class other than 'Object'.
// class C1a extends Base with Mixin1a {}
// ^
//
// pkg/front_end/testcases/general/issue48167.dart:13:29: Error: The class 'Mixin1b' can't be used as a mixin because it extends a class other than 'Object'.
// class C1b extends Base with Mixin1b {}
// ^
//
import self as self;
import "dart:core" as core;
class Base extends core::Object {
synthetic constructor •() → self::Base
: super core::Object::•()
;
}
class Mixin1a extends self::Base {
synthetic constructor •() → self::Mixin1a
: super self::Base::•()
;
}
class Mixin1b extends self::Mixin1a {
synthetic constructor •() → self::Mixin1b
: super self::Mixin1a::•()
;
}
abstract class _C1a&Base&Mixin1a = self::Base with self::Mixin1a /*isAnonymousMixin*/ {
synthetic constructor •() → self::_C1a&Base&Mixin1a
: super self::Base::•()
;
}
class C1a extends self::_C1a&Base&Mixin1a {
synthetic constructor •() → self::C1a
: super self::_C1a&Base&Mixin1a::•()
;
}
abstract class _C1b&Base&Mixin1b = self::Base with self::Mixin1b /*isAnonymousMixin*/ {
synthetic constructor •() → self::_C1b&Base&Mixin1b
: super self::Base::•()
;
}
class C1b extends self::_C1b&Base&Mixin1b {
synthetic constructor •() → self::C1b
: super self::_C1b&Base&Mixin1b::•()
;
}
abstract class Mixin2a extends self::Base /*isMixinDeclaration*/ {
}
abstract class _Mixin2b&Base&Mixin2a extends core::Object implements self::Base, self::Mixin2a /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Mixin2b&Base&Mixin2a
: super core::Object::•()
;
}
abstract class Mixin2b extends self::_Mixin2b&Base&Mixin2a /*isMixinDeclaration*/ {
}
abstract class _C2a&Base&Mixin2a = self::Base with self::Mixin2a /*isAnonymousMixin*/ {
synthetic constructor •() → self::_C2a&Base&Mixin2a
: super self::Base::•()
;
}
class C2a extends self::_C2a&Base&Mixin2a {
synthetic constructor •() → self::C2a
: super self::_C2a&Base&Mixin2a::•()
;
}
abstract class _C2b&Base&Mixin2a = self::Base with self::Mixin2a /*isAnonymousMixin*/ {
synthetic constructor •() → self::_C2b&Base&Mixin2a
: super self::Base::•()
;
}
abstract class _C2b&Base&Mixin2a&Mixin2b = self::_C2b&Base&Mixin2a with self::Mixin2b /*isAnonymousMixin*/ {
synthetic constructor •() → self::_C2b&Base&Mixin2a&Mixin2b
: super self::_C2b&Base&Mixin2a::•()
;
}
class C2b extends self::_C2b&Base&Mixin2a&Mixin2b {
synthetic constructor •() → self::C2b
: super self::_C2b&Base&Mixin2a&Mixin2b::•()
;
}

View file

@ -0,0 +1,76 @@
library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/general/issue48167.dart:11:29: Error: The class 'Mixin1a' can't be used as a mixin because it extends a class other than 'Object'.
// class C1a extends Base with Mixin1a {}
// ^
//
// pkg/front_end/testcases/general/issue48167.dart:13:29: Error: The class 'Mixin1b' can't be used as a mixin because it extends a class other than 'Object'.
// class C1b extends Base with Mixin1b {}
// ^
//
import self as self;
import "dart:core" as core;
class Base extends core::Object {
synthetic constructor •() → self::Base
;
}
class Mixin1a extends self::Base {
synthetic constructor •() → self::Mixin1a
;
}
class Mixin1b extends self::Mixin1a {
synthetic constructor •() → self::Mixin1b
;
}
abstract class _C1a&Base&Mixin1a = self::Base with self::Mixin1a /*isAnonymousMixin*/ {
synthetic constructor •() → self::_C1a&Base&Mixin1a
: super self::Base::•()
;
}
class C1a extends self::_C1a&Base&Mixin1a {
synthetic constructor •() → self::C1a
;
}
abstract class _C1b&Base&Mixin1b = self::Base with self::Mixin1b /*isAnonymousMixin*/ {
synthetic constructor •() → self::_C1b&Base&Mixin1b
: super self::Base::•()
;
}
class C1b extends self::_C1b&Base&Mixin1b {
synthetic constructor •() → self::C1b
;
}
abstract class Mixin2a extends self::Base /*isMixinDeclaration*/ {
}
abstract class _Mixin2b&Base&Mixin2a extends core::Object implements self::Base, self::Mixin2a /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Mixin2b&Base&Mixin2a
;
}
abstract class Mixin2b extends self::_Mixin2b&Base&Mixin2a /*isMixinDeclaration*/ {
}
abstract class _C2a&Base&Mixin2a = self::Base with self::Mixin2a /*isAnonymousMixin*/ {
synthetic constructor •() → self::_C2a&Base&Mixin2a
: super self::Base::•()
;
}
class C2a extends self::_C2a&Base&Mixin2a {
synthetic constructor •() → self::C2a
;
}
abstract class _C2b&Base&Mixin2a = self::Base with self::Mixin2a /*isAnonymousMixin*/ {
synthetic constructor •() → self::_C2b&Base&Mixin2a
: super self::Base::•()
;
}
abstract class _C2b&Base&Mixin2a&Mixin2b = self::_C2b&Base&Mixin2a with self::Mixin2b /*isAnonymousMixin*/ {
synthetic constructor •() → self::_C2b&Base&Mixin2a&Mixin2b
: super self::_C2b&Base&Mixin2a::•()
;
}
class C2b extends self::_C2b&Base&Mixin2a&Mixin2b {
synthetic constructor •() → self::C2b
;
}

View file

@ -0,0 +1,84 @@
library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/general/issue48167.dart:11:29: Error: The class 'Mixin1a' can't be used as a mixin because it extends a class other than 'Object'.
// class C1a extends Base with Mixin1a {}
// ^
//
// pkg/front_end/testcases/general/issue48167.dart:13:29: Error: The class 'Mixin1b' can't be used as a mixin because it extends a class other than 'Object'.
// class C1b extends Base with Mixin1b {}
// ^
//
import self as self;
import "dart:core" as core;
class Base extends core::Object {
synthetic constructor •() → self::Base
: super core::Object::•()
;
}
class Mixin1a extends self::Base {
synthetic constructor •() → self::Mixin1a
: super self::Base::•()
;
}
class Mixin1b extends self::Mixin1a {
synthetic constructor •() → self::Mixin1b
: super self::Mixin1a::•()
;
}
abstract class _C1a&Base&Mixin1a extends self::Base implements self::Mixin1a /*isAnonymousMixin,isEliminatedMixin*/ {
synthetic constructor •() → self::_C1a&Base&Mixin1a
: super self::Base::•()
;
}
class C1a extends self::_C1a&Base&Mixin1a {
synthetic constructor •() → self::C1a
: super self::_C1a&Base&Mixin1a::•()
;
}
abstract class _C1b&Base&Mixin1b extends self::Base implements self::Mixin1b /*isAnonymousMixin,isEliminatedMixin*/ {
synthetic constructor •() → self::_C1b&Base&Mixin1b
: super self::Base::•()
;
}
class C1b extends self::_C1b&Base&Mixin1b {
synthetic constructor •() → self::C1b
: super self::_C1b&Base&Mixin1b::•()
;
}
abstract class Mixin2a extends self::Base /*isMixinDeclaration*/ {
}
abstract class _Mixin2b&Base&Mixin2a extends core::Object implements self::Base, self::Mixin2a /*isAnonymousMixin*/ {
synthetic constructor •() → self::_Mixin2b&Base&Mixin2a
: super core::Object::•()
;
}
abstract class Mixin2b extends self::_Mixin2b&Base&Mixin2a /*isMixinDeclaration*/ {
}
abstract class _C2a&Base&Mixin2a extends self::Base implements self::Mixin2a /*isAnonymousMixin,isEliminatedMixin*/ {
synthetic constructor •() → self::_C2a&Base&Mixin2a
: super self::Base::•()
;
}
class C2a extends self::_C2a&Base&Mixin2a {
synthetic constructor •() → self::C2a
: super self::_C2a&Base&Mixin2a::•()
;
}
abstract class _C2b&Base&Mixin2a extends self::Base implements self::Mixin2a /*isAnonymousMixin,isEliminatedMixin*/ {
synthetic constructor •() → self::_C2b&Base&Mixin2a
: super self::Base::•()
;
}
abstract class _C2b&Base&Mixin2a&Mixin2b extends self::_C2b&Base&Mixin2a implements self::Mixin2b /*isAnonymousMixin,isEliminatedMixin*/ {
synthetic constructor •() → self::_C2b&Base&Mixin2a&Mixin2b
: super self::_C2b&Base&Mixin2a::•()
;
}
class C2b extends self::_C2b&Base&Mixin2a&Mixin2b {
synthetic constructor •() → self::C2b
: super self::_C2b&Base&Mixin2a&Mixin2b::•()
;
}

View file

@ -6,7 +6,7 @@ abstract class M {
var m;
}
abstract class N extends M {
mixin N on M {
void set superM(value) {
super.m = value;
}

View file

@ -2,7 +2,7 @@ abstract class M {
var m;
}
abstract class N extends M {
mixin N on M {
void set superM(value) {}
get superM => super.m;
}

View file

@ -2,13 +2,12 @@ abstract class M {
var m;
}
abstract class N extends M {
get superM => super.m;
void set superM(value) {}
}
class Named = S with M, N, M;
class S {}
main() {}
mixin N on M {
get superM => super.m;
void set superM(value) {}
}

View file

@ -8,10 +8,7 @@ abstract class M extends core::Object {
: super core::Object::•()
;
}
abstract class N extends self::M {
synthetic constructor •() → self::N
: super self::M::•()
;
abstract class N extends self::M /*isMixinDeclaration*/ {
set superM(dynamic value) → void {
super.{self::M::m} = value;
}

View file

@ -8,10 +8,7 @@ abstract class M extends core::Object {
: super core::Object::•()
;
}
abstract class N extends self::M {
synthetic constructor •() → self::N
: super self::M::•()
;
abstract class N extends self::M /*isMixinDeclaration*/ {
set superM(dynamic value) → void {
super.{self::M::m} = value;
}

View file

@ -7,9 +7,7 @@ abstract class M extends core::Object {
synthetic constructor •() → self::M
;
}
abstract class N extends self::M {
synthetic constructor •() → self::N
;
abstract class N extends self::M /*isMixinDeclaration*/ {
set superM(dynamic value) → void
;
get superM() → dynamic

View file

@ -8,10 +8,7 @@ abstract class M extends core::Object {
: super core::Object::•()
;
}
abstract class N extends self::M {
synthetic constructor •() → self::N
: super self::M::•()
;
abstract class N extends self::M /*isMixinDeclaration*/ {
set superM(dynamic value) → void {
super.{self::M::m} = value;
}

View file

@ -17,5 +17,5 @@ sources:
class A extends Object with B<Object>, C {}
b.dart: |
// @dart=2.9
abstract class C<T extends Object> extends Object with B<T> {}
mixin C<T extends Object> on B<T> {}
abstract class B<ChildType extends Object> extends Object {}

View file

@ -4,7 +4,7 @@
// @dart=2.9
class I<X> {}
class M0<X, Y extends String> extends I<X> {}
mixin M0<X, Y extends String> on I<X> {}
class M1 implements I<int> {}

View file

@ -1,7 +1,7 @@
// @dart = 2.9
class I<X> {}
class M0<X, Y extends String> extends I<X> {}
mixin M0<X, Y extends String> on I<X> {}
class M1 implements I<int> {}

View file

@ -3,8 +3,7 @@ class A extends M1 with M0 {}
class I<X> {}
class M0<X, Y extends String> extends I<X> {}
class M1 implements I<int> {}
main() {}
mixin M0<X, Y extends String> on I<X> {}

View file

@ -17,10 +17,7 @@ class I<X extends core::Object* = dynamic> extends core::Object {
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class M0<X extends core::Object* = dynamic, Y extends core::String*> extends self::I<self::M0::X*> {
synthetic constructor •() → self::M0<self::M0::X*, self::M0::Y*>*
: super self::I::•()
;
abstract class M0<X extends core::Object* = dynamic, Y extends core::String*> extends self::I<self::M0::X*> /*isMixinDeclaration*/ {
}
class M1 extends core::Object implements self::I<core::int*> {
synthetic constructor •() → self::M1*

View file

@ -17,10 +17,7 @@ class I<X extends core::Object* = dynamic> extends core::Object {
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class M0<X extends core::Object* = dynamic, Y extends core::String*> extends self::I<self::M0::X*> {
synthetic constructor •() → self::M0<self::M0::X*, self::M0::Y*>*
: super self::I::•()
;
abstract class M0<X extends core::Object* = dynamic, Y extends core::String*> extends self::I<self::M0::X*> /*isMixinDeclaration*/ {
}
class M1 extends core::Object implements self::I<core::int*> {
synthetic constructor •() → self::M1*

View file

@ -16,9 +16,7 @@ class I<X extends core::Object* = dynamic> extends core::Object {
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class M0<X extends core::Object* = dynamic, Y extends core::String*> extends self::I<self::M0::X*> {
synthetic constructor •() → self::M0<self::M0::X*, self::M0::Y*>*
;
abstract class M0<X extends core::Object* = dynamic, Y extends core::String*> extends self::I<self::M0::X*> /*isMixinDeclaration*/ {
}
class M1 extends core::Object implements self::I<core::int*> {
synthetic constructor •() → self::M1*

View file

@ -17,10 +17,7 @@ class I<X extends core::Object* = dynamic> extends core::Object {
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class M0<X extends core::Object* = dynamic, Y extends core::String*> extends self::I<self::M0::X*> {
synthetic constructor •() → self::M0<self::M0::X*, self::M0::Y*>*
: super self::I::•()
;
abstract class M0<X extends core::Object* = dynamic, Y extends core::String*> extends self::I<self::M0::X*> /*isMixinDeclaration*/ {
}
class M1 extends core::Object implements self::I<core::int*> {
synthetic constructor •() → self::M1*

View file

@ -4,7 +4,7 @@
// @dart=2.9
class I<X> {}
class M0<X, Y extends X> extends I<X> {}
mixin M0<X, Y extends X> on I<X> {}
class M1 implements I<int> {}

View file

@ -1,7 +1,7 @@
// @dart = 2.9
class I<X> {}
class M0<X, Y extends X> extends I<X> {}
mixin M0<X, Y extends X> on I<X> {}
class M1 implements I<int> {}

View file

@ -3,8 +3,7 @@ class A extends M1 with M0 {}
class I<X> {}
class M0<X, Y extends X> extends I<X> {}
class M1 implements I<int> {}
main() {}
mixin M0<X, Y extends X> on I<X> {}

View file

@ -17,10 +17,7 @@ class I<X extends core::Object* = dynamic> extends core::Object {
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class M0<X extends core::Object* = dynamic, Y extends self::M0::X* = dynamic> extends self::I<self::M0::X*> {
synthetic constructor •() → self::M0<self::M0::X*, self::M0::Y*>*
: super self::I::•()
;
abstract class M0<X extends core::Object* = dynamic, Y extends self::M0::X* = dynamic> extends self::I<self::M0::X*> /*isMixinDeclaration*/ {
}
class M1 extends core::Object implements self::I<core::int*> {
synthetic constructor •() → self::M1*

View file

@ -17,10 +17,7 @@ class I<X extends core::Object* = dynamic> extends core::Object {
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class M0<X extends core::Object* = dynamic, Y extends self::M0::X* = dynamic> extends self::I<self::M0::X*> {
synthetic constructor •() → self::M0<self::M0::X*, self::M0::Y*>*
: super self::I::•()
;
abstract class M0<X extends core::Object* = dynamic, Y extends self::M0::X* = dynamic> extends self::I<self::M0::X*> /*isMixinDeclaration*/ {
}
class M1 extends core::Object implements self::I<core::int*> {
synthetic constructor •() → self::M1*

View file

@ -16,9 +16,7 @@ class I<X extends core::Object* = dynamic> extends core::Object {
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class M0<X extends core::Object* = dynamic, Y extends self::M0::X* = dynamic> extends self::I<self::M0::X*> {
synthetic constructor •() → self::M0<self::M0::X*, self::M0::Y*>*
;
abstract class M0<X extends core::Object* = dynamic, Y extends self::M0::X* = dynamic> extends self::I<self::M0::X*> /*isMixinDeclaration*/ {
}
class M1 extends core::Object implements self::I<core::int*> {
synthetic constructor •() → self::M1*

View file

@ -17,10 +17,7 @@ class I<X extends core::Object* = dynamic> extends core::Object {
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class M0<X extends core::Object* = dynamic, Y extends self::M0::X* = dynamic> extends self::I<self::M0::X*> {
synthetic constructor •() → self::M0<self::M0::X*, self::M0::Y*>*
: super self::I::•()
;
abstract class M0<X extends core::Object* = dynamic, Y extends self::M0::X* = dynamic> extends self::I<self::M0::X*> /*isMixinDeclaration*/ {
}
class M1 extends core::Object implements self::I<core::int*> {
synthetic constructor •() → self::M1*

View file

@ -4,7 +4,7 @@
// @dart=2.9
class I<X> {}
class M0<X, Y extends Comparable<Y>> extends I<X> {}
mixin M0<X, Y extends Comparable<Y>> on I<X> {}
class M1 implements I<int> {}

View file

@ -1,7 +1,7 @@
// @dart = 2.9
class I<X> {}
class M0<X, Y extends Comparable<Y>> extends I<X> {}
mixin M0<X, Y extends Comparable<Y>> on I<X> {}
class M1 implements I<int> {}

View file

@ -3,8 +3,7 @@ class A extends M1 with M0 {}
class I<X> {}
class M0<X, Y extends Comparable<Y>> extends I<X> {}
class M1 implements I<int> {}
main() {}
mixin M0<X, Y extends Comparable<Y>> on I<X> {}

View file

@ -8,7 +8,7 @@ library;
// class A extends M1 with M0 {}
// ^
// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:7:13: Context: This is the type variable whose bound isn't conformed to.
// class M0<X, Y extends Comparable<Y>> extends I<X> {}
// mixin M0<X, Y extends Comparable<Y>> on I<X> {}
// ^
//
import self as self;
@ -29,10 +29,7 @@ class I<X extends core::Object* = dynamic> extends core::Object {
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class M0<X extends core::Object* = dynamic, Y extends core::Comparable<self::M0::Y*>* = core::Comparable<dynamic>*> extends self::I<self::M0::X*> {
synthetic constructor •() → self::M0<self::M0::X*, self::M0::Y*>*
: super self::I::•()
;
abstract class M0<X extends core::Object* = dynamic, Y extends core::Comparable<self::M0::Y*>* = core::Comparable<dynamic>*> extends self::I<self::M0::X*> /*isMixinDeclaration*/ {
}
class M1 extends core::Object implements self::I<core::int*> {
synthetic constructor •() → self::M1*

View file

@ -8,7 +8,7 @@ library;
// class A extends M1 with M0 {}
// ^
// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:7:13: Context: This is the type variable whose bound isn't conformed to.
// class M0<X, Y extends Comparable<Y>> extends I<X> {}
// mixin M0<X, Y extends Comparable<Y>> on I<X> {}
// ^
//
import self as self;
@ -29,10 +29,7 @@ class I<X extends core::Object* = dynamic> extends core::Object {
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class M0<X extends core::Object* = dynamic, Y extends core::Comparable<self::M0::Y*>* = core::Comparable<dynamic>*> extends self::I<self::M0::X*> {
synthetic constructor •() → self::M0<self::M0::X*, self::M0::Y*>*
: super self::I::•()
;
abstract class M0<X extends core::Object* = dynamic, Y extends core::Comparable<self::M0::Y*>* = core::Comparable<dynamic>*> extends self::I<self::M0::X*> /*isMixinDeclaration*/ {
}
class M1 extends core::Object implements self::I<core::int*> {
synthetic constructor •() → self::M1*

View file

@ -8,7 +8,7 @@ library;
// class A extends M1 with M0 {}
// ^
// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:7:13: Context: This is the type variable whose bound isn't conformed to.
// class M0<X, Y extends Comparable<Y>> extends I<X> {}
// mixin M0<X, Y extends Comparable<Y>> on I<X> {}
// ^
//
import self as self;
@ -28,9 +28,7 @@ class I<X extends core::Object* = dynamic> extends core::Object {
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class M0<X extends core::Object* = dynamic, Y extends core::Comparable<self::M0::Y*>* = core::Comparable<dynamic>*> extends self::I<self::M0::X*> {
synthetic constructor •() → self::M0<self::M0::X*, self::M0::Y*>*
;
abstract class M0<X extends core::Object* = dynamic, Y extends core::Comparable<self::M0::Y*>* = core::Comparable<dynamic>*> extends self::I<self::M0::X*> /*isMixinDeclaration*/ {
}
class M1 extends core::Object implements self::I<core::int*> {
synthetic constructor •() → self::M1*

View file

@ -8,7 +8,7 @@ library;
// class A extends M1 with M0 {}
// ^
// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:7:13: Context: This is the type variable whose bound isn't conformed to.
// class M0<X, Y extends Comparable<Y>> extends I<X> {}
// mixin M0<X, Y extends Comparable<Y>> on I<X> {}
// ^
//
import self as self;
@ -29,10 +29,7 @@ class I<X extends core::Object* = dynamic> extends core::Object {
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class M0<X extends core::Object* = dynamic, Y extends core::Comparable<self::M0::Y*>* = core::Comparable<dynamic>*> extends self::I<self::M0::X*> {
synthetic constructor •() → self::M0<self::M0::X*, self::M0::Y*>*
: super self::I::•()
;
abstract class M0<X extends core::Object* = dynamic, Y extends core::Comparable<self::M0::Y*>* = core::Comparable<dynamic>*> extends self::I<self::M0::X*> /*isMixinDeclaration*/ {
}
class M1 extends core::Object implements self::I<core::int*> {
synthetic constructor •() → self::M1*

View file

@ -4,7 +4,7 @@
// @dart=2.9
class I<X> {}
class M0<X, Y extends void Function({String name})> extends I<X> {}
mixin M0<X, Y extends void Function({String name})> on I<X> {}
class M1 implements I<int> {}

View file

@ -1,7 +1,7 @@
// @dart = 2.9
class I<X> {}
class M0<X, Y extends void Function({String name})> extends I<X> {}
mixin M0<X, Y extends void Function({String name})> on I<X> {}
class M1 implements I<int> {}

View file

@ -3,8 +3,7 @@ class A extends M1 with M0 {}
class I<X> {}
class M0<X, Y extends void Function({String name})> extends I<X> {}
class M1 implements I<int> {}
main() {}
mixin M0<X, Y extends void Function({String name})> on I<X> {}

View file

@ -17,10 +17,7 @@ class I<X extends core::Object* = dynamic> extends core::Object {
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class M0<X extends core::Object* = dynamic, Y extends ({name: core::String*}) →* void> extends self::I<self::M0::X*> {
synthetic constructor •() → self::M0<self::M0::X*, self::M0::Y*>*
: super self::I::•()
;
abstract class M0<X extends core::Object* = dynamic, Y extends ({name: core::String*}) →* void> extends self::I<self::M0::X*> /*isMixinDeclaration*/ {
}
class M1 extends core::Object implements self::I<core::int*> {
synthetic constructor •() → self::M1*

View file

@ -17,10 +17,7 @@ class I<X extends core::Object* = dynamic> extends core::Object {
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class M0<X extends core::Object* = dynamic, Y extends ({name: core::String*}) →* void> extends self::I<self::M0::X*> {
synthetic constructor •() → self::M0<self::M0::X*, self::M0::Y*>*
: super self::I::•()
;
abstract class M0<X extends core::Object* = dynamic, Y extends ({name: core::String*}) →* void> extends self::I<self::M0::X*> /*isMixinDeclaration*/ {
}
class M1 extends core::Object implements self::I<core::int*> {
synthetic constructor •() → self::M1*

View file

@ -16,9 +16,7 @@ class I<X extends core::Object* = dynamic> extends core::Object {
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class M0<X extends core::Object* = dynamic, Y extends ({name: core::String*}) →* void> extends self::I<self::M0::X*> {
synthetic constructor •() → self::M0<self::M0::X*, self::M0::Y*>*
;
abstract class M0<X extends core::Object* = dynamic, Y extends ({name: core::String*}) →* void> extends self::I<self::M0::X*> /*isMixinDeclaration*/ {
}
class M1 extends core::Object implements self::I<core::int*> {
synthetic constructor •() → self::M1*

View file

@ -17,10 +17,7 @@ class I<X extends core::Object* = dynamic> extends core::Object {
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class M0<X extends core::Object* = dynamic, Y extends ({name: core::String*}) →* void> extends self::I<self::M0::X*> {
synthetic constructor •() → self::M0<self::M0::X*, self::M0::Y*>*
: super self::I::•()
;
abstract class M0<X extends core::Object* = dynamic, Y extends ({name: core::String*}) →* void> extends self::I<self::M0::X*> /*isMixinDeclaration*/ {
}
class M1 extends core::Object implements self::I<core::int*> {
synthetic constructor •() → self::M1*

View file

@ -6,7 +6,7 @@ class I<X> {}
class J<X> {}
class M0<X, Y> extends I<X> with J<Y> {}
mixin M0<X, Y> on I<X>, J<Y> {}
class M1 implements I<int> {}

View file

@ -3,7 +3,7 @@ class I<X> {}
class J<X> {}
class M0<X, Y> extends I<X> with J<Y> {}
mixin M0<X, Y> on I<X>, J<Y> {}
class M1 implements I<int> {}

View file

@ -5,10 +5,9 @@ class I<X> {}
class J<X> {}
class M0<X, Y> extends I<X> with J<Y> {}
class M1 implements I<int> {}
class M2 extends M1 implements J<double> {}
main() {}
mixin M0<X, Y> on I<X>, J<Y> {}

View file

@ -32,15 +32,22 @@ class J<X extends core::Object* = dynamic> extends core::Object {
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
abstract class _M0&I&J<X extends core::Object* = dynamic, Y extends core::Object* = dynamic> = self::I<self::_M0&I&J::X*> with self::J<self::_M0&I&J::Y*> /*isAnonymousMixin*/ {
abstract class _M0&I&J<X extends core::Object* = dynamic, Y extends core::Object* = dynamic> extends core::Object implements self::I<self::_M0&I&J::X*>, self::J<self::_M0&I&J::Y*> /*isAnonymousMixin*/ {
synthetic constructor •() → self::_M0&I&J<self::_M0&I&J::X*, self::_M0&I&J::Y*>*
: super self::I::•()
: super core::Object::•()
;
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class M0<X extends core::Object* = dynamic, Y extends core::Object* = dynamic> extends self::_M0&I&J<self::M0::X*, self::M0::Y*> {
synthetic constructor •() → self::M0<self::M0::X*, self::M0::Y*>*
: super self::_M0&I&J::•()
;
abstract class M0<X extends core::Object* = dynamic, Y extends core::Object* = dynamic> extends self::_M0&I&J<self::M0::X*, self::M0::Y*> /*isMixinDeclaration*/ {
}
class M1 extends core::Object implements self::I<core::int*> {
synthetic constructor •() → self::M1*

View file

@ -32,15 +32,22 @@ class J<X extends core::Object* = dynamic> extends core::Object {
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
abstract class _M0&I&J<X extends core::Object* = dynamic, Y extends core::Object* = dynamic> = self::I<self::_M0&I&J::X*> with self::J<self::_M0&I&J::Y*> /*isAnonymousMixin*/ {
abstract class _M0&I&J<X extends core::Object* = dynamic, Y extends core::Object* = dynamic> extends core::Object implements self::I<self::_M0&I&J::X*>, self::J<self::_M0&I&J::Y*> /*isAnonymousMixin*/ {
synthetic constructor •() → self::_M0&I&J<self::_M0&I&J::X*, self::_M0&I&J::Y*>*
: super self::I::•()
: super core::Object::•()
;
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class M0<X extends core::Object* = dynamic, Y extends core::Object* = dynamic> extends self::_M0&I&J<self::M0::X*, self::M0::Y*> {
synthetic constructor •() → self::M0<self::M0::X*, self::M0::Y*>*
: super self::_M0&I&J::•()
;
abstract class M0<X extends core::Object* = dynamic, Y extends core::Object* = dynamic> extends self::_M0&I&J<self::M0::X*, self::M0::Y*> /*isMixinDeclaration*/ {
}
class M1 extends core::Object implements self::I<core::int*> {
synthetic constructor •() → self::M1*

View file

@ -30,14 +30,21 @@ class J<X extends core::Object* = dynamic> extends core::Object {
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
abstract class _M0&I&J<X extends core::Object* = dynamic, Y extends core::Object* = dynamic> = self::I<self::_M0&I&J::X*> with self::J<self::_M0&I&J::Y*> /*isAnonymousMixin*/ {
abstract class _M0&I&J<X extends core::Object* = dynamic, Y extends core::Object* = dynamic> extends core::Object implements self::I<self::_M0&I&J::X*>, self::J<self::_M0&I&J::Y*> /*isAnonymousMixin*/ {
synthetic constructor •() → self::_M0&I&J<self::_M0&I&J::X*, self::_M0&I&J::Y*>*
: super self::I::•()
;
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class M0<X extends core::Object* = dynamic, Y extends core::Object* = dynamic> extends self::_M0&I&J<self::M0::X*, self::M0::Y*> {
synthetic constructor •() → self::M0<self::M0::X*, self::M0::Y*>*
;
abstract class M0<X extends core::Object* = dynamic, Y extends core::Object* = dynamic> extends self::_M0&I&J<self::M0::X*, self::M0::Y*> /*isMixinDeclaration*/ {
}
class M1 extends core::Object implements self::I<core::int*> {
synthetic constructor •() → self::M1*

View file

@ -32,15 +32,22 @@ class J<X extends core::Object* = dynamic> extends core::Object {
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
abstract class _M0&I&J<X extends core::Object* = dynamic, Y extends core::Object* = dynamic> extends self::I<self::_M0&I&J::X*> implements self::J<self::_M0&I&J::Y*> /*isAnonymousMixin,isEliminatedMixin*/ {
abstract class _M0&I&J<X extends core::Object* = dynamic, Y extends core::Object* = dynamic> extends core::Object implements self::I<self::_M0&I&J::X*>, self::J<self::_M0&I&J::Y*> /*isAnonymousMixin*/ {
synthetic constructor •() → self::_M0&I&J<self::_M0&I&J::X*, self::_M0&I&J::Y*>*
: super self::I::•()
: super core::Object::•()
;
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
abstract member-signature method toString() → core::String*; -> core::Object::toString
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class M0<X extends core::Object* = dynamic, Y extends core::Object* = dynamic> extends self::_M0&I&J<self::M0::X*, self::M0::Y*> {
synthetic constructor •() → self::M0<self::M0::X*, self::M0::Y*>*
: super self::_M0&I&J::•()
;
abstract class M0<X extends core::Object* = dynamic, Y extends core::Object* = dynamic> extends self::_M0&I&J<self::M0::X*, self::M0::Y*> /*isMixinDeclaration*/ {
}
class M1 extends core::Object implements self::I<core::int*> {
synthetic constructor •() → self::M1*

View file

@ -1,4 +1,11 @@
library;
//
// Problems in library:
//
// pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart:14:30: Error: The class 'M0' can't be used as a mixin because it extends a class other than 'Object'.
// class A extends M2<int> with M0 {}
// ^
//
import self as self;
import "dart:core" as core;

View file

@ -1,4 +1,11 @@
library;
//
// Problems in library:
//
// pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart:14:30: Error: The class 'M0' can't be used as a mixin because it extends a class other than 'Object'.
// class A extends M2<int> with M0 {}
// ^
//
import self as self;
import "dart:core" as core;

View file

@ -1,4 +1,11 @@
library;
//
// Problems in library:
//
// pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart:14:30: Error: The class 'M0' can't be used as a mixin because it extends a class other than 'Object'.
// class A extends M2<int> with M0 {}
// ^
//
import self as self;
import "dart:core" as core;

View file

@ -1,4 +1,11 @@
library;
//
// Problems in library:
//
// pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart:14:30: Error: The class 'M0' can't be used as a mixin because it extends a class other than 'Object'.
// class A extends M2<int> with M0 {}
// ^
//
import self as self;
import "dart:core" as core;

View file

@ -6,7 +6,7 @@ class I<X> {}
class M0<T> extends I<T> {}
class M1<T> extends I<T> {}
mixin M1<T> on I<T> {}
// M1 is inferred as M1<int>
class A extends M0<int> with M1 {}

View file

@ -3,7 +3,7 @@ class I<X> {}
class M0<T> extends I<T> {}
class M1<T> extends I<T> {}
mixin M1<T> on I<T> {}
class A extends M0<int> with M1 {}

View file

@ -5,6 +5,5 @@ class I<X> {}
class M0<T> extends I<T> {}
class M1<T> extends I<T> {}
main() {}
mixin M1<T> on I<T> {}

View file

@ -22,10 +22,7 @@ class M0<T extends core::Object* = dynamic> extends self::I<self::M0::T*> {
: super self::I::•()
;
}
class M1<T extends core::Object* = dynamic> extends self::I<self::M1::T*> {
synthetic constructor •() → self::M1<self::M1::T*>*
: super self::I::•()
;
abstract class M1<T extends core::Object* = dynamic> extends self::I<self::M1::T*> /*isMixinDeclaration*/ {
}
abstract class _A&M0&M1 = self::M0<core::int*> with self::M1<core::int*> /*isAnonymousMixin*/ {
synthetic constructor •() → self::_A&M0&M1*

View file

@ -22,10 +22,7 @@ class M0<T extends core::Object* = dynamic> extends self::I<self::M0::T*> {
: super self::I::•()
;
}
class M1<T extends core::Object* = dynamic> extends self::I<self::M1::T*> {
synthetic constructor •() → self::M1<self::M1::T*>*
: super self::I::•()
;
abstract class M1<T extends core::Object* = dynamic> extends self::I<self::M1::T*> /*isMixinDeclaration*/ {
}
abstract class _A&M0&M1 = self::M0<core::int*> with self::M1<core::int*> /*isAnonymousMixin*/ {
synthetic constructor •() → self::_A&M0&M1*

View file

@ -20,9 +20,7 @@ class M0<T extends core::Object* = dynamic> extends self::I<self::M0::T*> {
synthetic constructor •() → self::M0<self::M0::T*>*
;
}
class M1<T extends core::Object* = dynamic> extends self::I<self::M1::T*> {
synthetic constructor •() → self::M1<self::M1::T*>*
;
abstract class M1<T extends core::Object* = dynamic> extends self::I<self::M1::T*> /*isMixinDeclaration*/ {
}
abstract class _A&M0&M1 = self::M0<core::int*> with self::M1<core::int*> /*isAnonymousMixin*/ {
synthetic constructor •() → self::_A&M0&M1*

View file

@ -22,10 +22,7 @@ class M0<T extends core::Object* = dynamic> extends self::I<self::M0::T*> {
: super self::I::•()
;
}
class M1<T extends core::Object* = dynamic> extends self::I<self::M1::T*> {
synthetic constructor •() → self::M1<self::M1::T*>*
: super self::I::•()
;
abstract class M1<T extends core::Object* = dynamic> extends self::I<self::M1::T*> /*isMixinDeclaration*/ {
}
abstract class _A&M0&M1 extends self::M0<core::int*> implements self::M1<core::int*> /*isAnonymousMixin,isEliminatedMixin*/ {
synthetic constructor •() → self::_A&M0&M1*

View file

@ -6,9 +6,9 @@ class I<X> {}
class M0<T> extends I<T> {}
class M1<T> extends I<T> {}
mixin M1<T> on I<T> {}
class M2<T> extends I<T> {}
mixin M2<T> on I<T> {}
// M1 is inferred as M1<int>
// M2 is inferred as M1<int>

View file

@ -3,9 +3,8 @@ class I<X> {}
class M0<T> extends I<T> {}
class M1<T> extends I<T> {}
class M2<T> extends I<T> {}
mixin M1<T> on I<T> {}
mixin M2<T> on I<T> {}
class A extends M0<int> with M1, M2 {}

View file

@ -5,8 +5,6 @@ class I<X> {}
class M0<T> extends I<T> {}
class M1<T> extends I<T> {}
class M2<T> extends I<T> {}
main() {}
mixin M1<T> on I<T> {}
mixin M2<T> on I<T> {}

View file

@ -22,15 +22,9 @@ class M0<T extends core::Object* = dynamic> extends self::I<self::M0::T*> {
: super self::I::•()
;
}
class M1<T extends core::Object* = dynamic> extends self::I<self::M1::T*> {
synthetic constructor •() → self::M1<self::M1::T*>*
: super self::I::•()
;
abstract class M1<T extends core::Object* = dynamic> extends self::I<self::M1::T*> /*isMixinDeclaration*/ {
}
class M2<T extends core::Object* = dynamic> extends self::I<self::M2::T*> {
synthetic constructor •() → self::M2<self::M2::T*>*
: super self::I::•()
;
abstract class M2<T extends core::Object* = dynamic> extends self::I<self::M2::T*> /*isMixinDeclaration*/ {
}
abstract class _A&M0&M1 = self::M0<core::int*> with self::M1<core::int*> /*isAnonymousMixin*/ {
synthetic constructor •() → self::_A&M0&M1*

View file

@ -22,15 +22,9 @@ class M0<T extends core::Object* = dynamic> extends self::I<self::M0::T*> {
: super self::I::•()
;
}
class M1<T extends core::Object* = dynamic> extends self::I<self::M1::T*> {
synthetic constructor •() → self::M1<self::M1::T*>*
: super self::I::•()
;
abstract class M1<T extends core::Object* = dynamic> extends self::I<self::M1::T*> /*isMixinDeclaration*/ {
}
class M2<T extends core::Object* = dynamic> extends self::I<self::M2::T*> {
synthetic constructor •() → self::M2<self::M2::T*>*
: super self::I::•()
;
abstract class M2<T extends core::Object* = dynamic> extends self::I<self::M2::T*> /*isMixinDeclaration*/ {
}
abstract class _A&M0&M1 = self::M0<core::int*> with self::M1<core::int*> /*isAnonymousMixin*/ {
synthetic constructor •() → self::_A&M0&M1*

View file

@ -20,13 +20,9 @@ class M0<T extends core::Object* = dynamic> extends self::I<self::M0::T*> {
synthetic constructor •() → self::M0<self::M0::T*>*
;
}
class M1<T extends core::Object* = dynamic> extends self::I<self::M1::T*> {
synthetic constructor •() → self::M1<self::M1::T*>*
;
abstract class M1<T extends core::Object* = dynamic> extends self::I<self::M1::T*> /*isMixinDeclaration*/ {
}
class M2<T extends core::Object* = dynamic> extends self::I<self::M2::T*> {
synthetic constructor •() → self::M2<self::M2::T*>*
;
abstract class M2<T extends core::Object* = dynamic> extends self::I<self::M2::T*> /*isMixinDeclaration*/ {
}
abstract class _A&M0&M1 = self::M0<core::int*> with self::M1<core::int*> /*isAnonymousMixin*/ {
synthetic constructor •() → self::_A&M0&M1*

View file

@ -22,15 +22,9 @@ class M0<T extends core::Object* = dynamic> extends self::I<self::M0::T*> {
: super self::I::•()
;
}
class M1<T extends core::Object* = dynamic> extends self::I<self::M1::T*> {
synthetic constructor •() → self::M1<self::M1::T*>*
: super self::I::•()
;
abstract class M1<T extends core::Object* = dynamic> extends self::I<self::M1::T*> /*isMixinDeclaration*/ {
}
class M2<T extends core::Object* = dynamic> extends self::I<self::M2::T*> {
synthetic constructor •() → self::M2<self::M2::T*>*
: super self::I::•()
;
abstract class M2<T extends core::Object* = dynamic> extends self::I<self::M2::T*> /*isMixinDeclaration*/ {
}
abstract class _A&M0&M1 extends self::M0<core::int*> implements self::M1<core::int*> /*isAnonymousMixin,isEliminatedMixin*/ {
synthetic constructor •() → self::_A&M0&M1*

View file

@ -6,7 +6,7 @@ class I<X> {}
class M0<T> extends Object implements I<T> {}
class M1<T> extends I<T> {}
mixin M1<T> on I<T> {}
// M0 is inferred as M0<dynamic>
// Error since class hierarchy is inconsistent

View file

@ -3,7 +3,7 @@ class I<X> {}
class M0<T> extends Object implements I<T> {}
class M1<T> extends I<T> {}
mixin M1<T> on I<T> {}
class A extends Object with M0, M1<int> {}

View file

@ -5,6 +5,5 @@ class I<X> {}
class M0<T> extends Object implements I<T> {}
class M1<T> extends I<T> {}
main() {}
mixin M1<T> on I<T> {}

View file

@ -7,6 +7,16 @@
// ^
//
library;
//
// Problems in library:
//
// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:13:7: Error: '_A&Object&M0' doesn't implement 'I<int>' so it can't be used with 'M1<int>'.
// - 'Object with M0' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart'.
// - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart'.
// - 'M1' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart'.
// class A extends Object with M0, M1<int> {}
// ^
//
import self as self;
import "dart:core" as core;
@ -40,10 +50,7 @@ class M0<T extends core::Object* = dynamic> extends core::Object implements self
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class M1<T extends core::Object* = dynamic> extends self::I<self::M1::T*> {
synthetic constructor •() → self::M1<self::M1::T*>*
: super self::I::•()
;
abstract class M1<T extends core::Object* = dynamic> extends self::I<self::M1::T*> /*isMixinDeclaration*/ {
}
abstract class _A&Object&M0 = core::Object with self::M0<dynamic> /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_A&Object&M0*

View file

@ -7,6 +7,16 @@
// ^
//
library;
//
// Problems in library:
//
// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:13:7: Error: '_A&Object&M0' doesn't implement 'I<int>' so it can't be used with 'M1<int>'.
// - 'Object with M0' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart'.
// - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart'.
// - 'M1' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart'.
// class A extends Object with M0, M1<int> {}
// ^
//
import self as self;
import "dart:core" as core;
@ -40,10 +50,7 @@ class M0<T extends core::Object* = dynamic> extends core::Object implements self
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class M1<T extends core::Object* = dynamic> extends self::I<self::M1::T*> {
synthetic constructor •() → self::M1<self::M1::T*>*
: super self::I::•()
;
abstract class M1<T extends core::Object* = dynamic> extends self::I<self::M1::T*> /*isMixinDeclaration*/ {
}
abstract class _A&Object&M0 = core::Object with self::M0<dynamic> /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_A&Object&M0*

View file

@ -7,6 +7,16 @@
// ^
//
library;
//
// Problems in library:
//
// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:13:7: Error: '_A&Object&M0' doesn't implement 'I<int>' so it can't be used with 'M1<int>'.
// - 'Object with M0' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart'.
// - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart'.
// - 'M1' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart'.
// class A extends Object with M0, M1<int> {}
// ^
//
import self as self;
import "dart:core" as core;
@ -38,9 +48,7 @@ class M0<T extends core::Object* = dynamic> extends core::Object implements self
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class M1<T extends core::Object* = dynamic> extends self::I<self::M1::T*> {
synthetic constructor •() → self::M1<self::M1::T*>*
;
abstract class M1<T extends core::Object* = dynamic> extends self::I<self::M1::T*> /*isMixinDeclaration*/ {
}
abstract class _A&Object&M0 = core::Object with self::M0<dynamic> /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_A&Object&M0*

View file

@ -6,7 +6,7 @@ class I<X> {}
class M0<T> extends Object implements I<T> {}
class M1<T> extends I<T> {}
mixin M1<T> on I<T> {}
// M0 is inferred as M0<dynamic> (unconstrained)
// M1 is inferred as M1<dynamic> (constrained by inferred argument to M0)

View file

@ -3,7 +3,7 @@ class I<X> {}
class M0<T> extends Object implements I<T> {}
class M1<T> extends I<T> {}
mixin M1<T> on I<T> {}
class A extends Object with M0, M1 implements I<int> {}

View file

@ -5,6 +5,5 @@ class I<X> {}
class M0<T> extends Object implements I<T> {}
class M1<T> extends I<T> {}
main() {}
mixin M1<T> on I<T> {}

View file

@ -40,10 +40,7 @@ class M0<T extends core::Object* = dynamic> extends core::Object implements self
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class M1<T extends core::Object* = dynamic> extends self::I<self::M1::T*> {
synthetic constructor •() → self::M1<self::M1::T*>*
: super self::I::•()
;
abstract class M1<T extends core::Object* = dynamic> extends self::I<self::M1::T*> /*isMixinDeclaration*/ {
}
abstract class _A&Object&M0 = core::Object with self::M0<dynamic> /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_A&Object&M0*

View file

@ -40,10 +40,7 @@ class M0<T extends core::Object* = dynamic> extends core::Object implements self
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class M1<T extends core::Object* = dynamic> extends self::I<self::M1::T*> {
synthetic constructor •() → self::M1<self::M1::T*>*
: super self::I::•()
;
abstract class M1<T extends core::Object* = dynamic> extends self::I<self::M1::T*> /*isMixinDeclaration*/ {
}
abstract class _A&Object&M0 = core::Object with self::M0<dynamic> /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_A&Object&M0*

View file

@ -38,9 +38,7 @@ class M0<T extends core::Object* = dynamic> extends core::Object implements self
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class M1<T extends core::Object* = dynamic> extends self::I<self::M1::T*> {
synthetic constructor •() → self::M1<self::M1::T*>*
;
abstract class M1<T extends core::Object* = dynamic> extends self::I<self::M1::T*> /*isMixinDeclaration*/ {
}
abstract class _A&Object&M0 = core::Object with self::M0<dynamic> /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_A&Object&M0*

View file

@ -302,7 +302,7 @@ main() {
main.writeAsStringSync("""
import 'lib.dart';
main() => print(foo());
class C1 extends Object with C2, C3 {
class C1 extends Object with C3, C2 {
c1method() {
print("c1");
}
@ -318,7 +318,7 @@ main() {
import 'main.dart';
foo() => 'foo';
main() => print('bar');
class C2 extends Object with C3 {
mixin C2 on C3 {
c2method() {
print("c2");
}

View file

@ -30,9 +30,9 @@ class Keep {
@keepToStringInSubtypes
class Base1 {}
class Base2 extends Base1 {}
mixin Base2 on Base1 {}
class Base3 extends Object with Base2 {}
class Base3 extends Object with Base1, Base2 {}
class KeepInherited implements Base3 {
@override

Some files were not shown because too many files have changed in this diff Show more