diff --git a/pkg/compiler/lib/src/kernel/env.dart b/pkg/compiler/lib/src/kernel/env.dart index bbad224e6a6..49c87e21243 100644 --- a/pkg/compiler/lib/src/kernel/env.dart +++ b/pkg/compiler/lib/src/kernel/env.dart @@ -419,12 +419,15 @@ class KClassEnvImpl implements KClassEnv { ir.Procedure existingSetter = existingSetters[field.name]; cls.addField(cloneVisitor.cloneField( field, existingGetter?.reference, existingSetter?.reference)); + // TODO(johnniwinther): We need to unbind the canonical names before + // serializing these references since the canonical names refer to + // @getters and @setters instead of @fields and @fields=. This will + // not be needed if stop using @fields/@fields= in favor of + // @getters/@setters in general. if (existingGetter != null) { - existingGetter.reference.canonicalName?.unbind(); cls.procedures.remove(existingGetter); } if (existingSetter != null) { - existingSetter.reference.canonicalName?.unbind(); cls.procedures.remove(existingSetter); } continue; @@ -444,7 +447,6 @@ class KClassEnvImpl implements KClassEnv { ? existingSetters[procedure.name] : existingNonSetters[procedure.name]; if (existingProcedure != null) { - existingProcedure.reference.canonicalName?.unbind(); cls.procedures.remove(existingProcedure); } cls.addProcedure(cloneVisitor.cloneProcedure( diff --git a/pkg/front_end/test/spell_checking_list_tests.txt b/pkg/front_end/test/spell_checking_list_tests.txt index 74205c3d6b8..c2db70b8eb5 100644 --- a/pkg/front_end/test/spell_checking_list_tests.txt +++ b/pkg/front_end/test/spell_checking_list_tests.txt @@ -606,6 +606,7 @@ scans scheduler screen scripts +scroll sdkroot sdks secondary diff --git a/pkg/front_end/testcases/none/mixin_super.dart b/pkg/front_end/testcases/none/mixin_super.dart new file mode 100644 index 00000000000..5b9023435ba --- /dev/null +++ b/pkg/front_end/testcases/none/mixin_super.dart @@ -0,0 +1,34 @@ +// Copyright (c) 2021, 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.md file. + +mixin Diagnosticable { + void debugFillProperties(DiagnosticPropertiesBuilder properties) {} +} + +class DiagnosticPropertiesBuilder {} + +abstract class PointerEvent with Diagnosticable {} + +abstract class PointerSignalEvent extends PointerEvent {} + +mixin _PointerEventDescription on PointerEvent { + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + } +} +mixin _CopyPointerScrollEvent on PointerEvent {} + +class PointerScrollEvent extends PointerSignalEvent + with _PointerEventDescription, _CopyPointerScrollEvent { + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + } +} + +main() { + new PointerScrollEvent() + .debugFillProperties(new DiagnosticPropertiesBuilder()); +} diff --git a/pkg/front_end/testcases/none/mixin_super.dart.outline.expect b/pkg/front_end/testcases/none/mixin_super.dart.outline.expect new file mode 100644 index 00000000000..6e052ce6fd3 --- /dev/null +++ b/pkg/front_end/testcases/none/mixin_super.dart.outline.expect @@ -0,0 +1,61 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:core" as core; + +abstract class Diagnosticable extends core::Object /*isMixinDeclaration*/ { + method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void + ; +} +class DiagnosticPropertiesBuilder extends core::Object { + synthetic constructor •() → self::DiagnosticPropertiesBuilder + ; +} +abstract class _PointerEvent&Object&Diagnosticable = core::Object with self::Diagnosticable /*isAnonymousMixin,hasConstConstructor*/ { + const synthetic constructor •() → self::_PointerEvent&Object&Diagnosticable + : super core::Object::•() + ; + mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void + return super.{self::Diagnosticable::debugFillProperties}(properties); +} +abstract class PointerEvent extends self::_PointerEvent&Object&Diagnosticable { + synthetic constructor •() → self::PointerEvent + ; +} +abstract class PointerSignalEvent extends self::PointerEvent { + synthetic constructor •() → self::PointerSignalEvent + ; +} +abstract class _PointerEventDescription extends self::PointerEvent /*isMixinDeclaration*/ { + @core::override + method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void + ; +} +abstract class _CopyPointerScrollEvent extends self::PointerEvent /*isMixinDeclaration*/ { +} +abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription = self::PointerSignalEvent with self::_PointerEventDescription /*isAnonymousMixin*/ { + synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription + : super self::PointerSignalEvent::•() + ; + mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void + return super.{self::_PointerEventDescription::debugFillProperties}(properties); +} +abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent = self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription with self::_CopyPointerScrollEvent /*isAnonymousMixin*/ { + synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent + : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::•() + ; +} +class PointerScrollEvent extends self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent { + synthetic constructor •() → self::PointerScrollEvent + ; + @core::override + method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void + ; +} +static method main() → dynamic + ; + + +Extra constant evaluation status: +Evaluated: StaticGet @ org-dartlang-testcase:///mixin_super.dart:16:4 -> InstanceConstant(const _Override{}) +Evaluated: StaticGet @ org-dartlang-testcase:///mixin_super.dart:25:4 -> InstanceConstant(const _Override{}) +Extra constant evaluation: evaluated: 6, effectively constant: 2 diff --git a/pkg/front_end/testcases/none/mixin_super.dart.strong.expect b/pkg/front_end/testcases/none/mixin_super.dart.strong.expect new file mode 100644 index 00000000000..9929e6937ac --- /dev/null +++ b/pkg/front_end/testcases/none/mixin_super.dart.strong.expect @@ -0,0 +1,65 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:core" as core; + +abstract class Diagnosticable extends core::Object /*isMixinDeclaration*/ { + method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {} +} +class DiagnosticPropertiesBuilder extends core::Object { + synthetic constructor •() → self::DiagnosticPropertiesBuilder + : super core::Object::•() + ; +} +abstract class _PointerEvent&Object&Diagnosticable = core::Object with self::Diagnosticable /*isAnonymousMixin,hasConstConstructor*/ { + const synthetic constructor •() → self::_PointerEvent&Object&Diagnosticable + : super core::Object::•() + ; + mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void + return super.{self::Diagnosticable::debugFillProperties}(properties); +} +abstract class PointerEvent extends self::_PointerEvent&Object&Diagnosticable { + synthetic constructor •() → self::PointerEvent + : super self::_PointerEvent&Object&Diagnosticable::•() + ; +} +abstract class PointerSignalEvent extends self::PointerEvent { + synthetic constructor •() → self::PointerSignalEvent + : super self::PointerEvent::•() + ; +} +abstract class _PointerEventDescription extends self::PointerEvent /*isMixinDeclaration*/ { + @#C1 + method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void { + super.{self::_PointerEvent&Object&Diagnosticable::debugFillProperties}(properties); + } +} +abstract class _CopyPointerScrollEvent extends self::PointerEvent /*isMixinDeclaration*/ { +} +abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription = self::PointerSignalEvent with self::_PointerEventDescription /*isAnonymousMixin*/ { + synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription + : super self::PointerSignalEvent::•() + ; + mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void + return super.{self::_PointerEventDescription::debugFillProperties}(properties); +} +abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent = self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription with self::_CopyPointerScrollEvent /*isAnonymousMixin*/ { + synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent + : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::•() + ; +} +class PointerScrollEvent extends self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent { + synthetic constructor •() → self::PointerScrollEvent + : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent::•() + ; + @#C1 + method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void { + super.{self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::debugFillProperties}(properties); + } +} +static method main() → dynamic { + new self::PointerScrollEvent::•().{self::PointerScrollEvent::debugFillProperties}(new self::DiagnosticPropertiesBuilder::•()){(self::DiagnosticPropertiesBuilder) → void}; +} + +constants { + #C1 = core::_Override {} +} diff --git a/pkg/front_end/testcases/none/mixin_super.dart.strong.transformed.expect b/pkg/front_end/testcases/none/mixin_super.dart.strong.transformed.expect new file mode 100644 index 00000000000..9929e6937ac --- /dev/null +++ b/pkg/front_end/testcases/none/mixin_super.dart.strong.transformed.expect @@ -0,0 +1,65 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:core" as core; + +abstract class Diagnosticable extends core::Object /*isMixinDeclaration*/ { + method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {} +} +class DiagnosticPropertiesBuilder extends core::Object { + synthetic constructor •() → self::DiagnosticPropertiesBuilder + : super core::Object::•() + ; +} +abstract class _PointerEvent&Object&Diagnosticable = core::Object with self::Diagnosticable /*isAnonymousMixin,hasConstConstructor*/ { + const synthetic constructor •() → self::_PointerEvent&Object&Diagnosticable + : super core::Object::•() + ; + mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void + return super.{self::Diagnosticable::debugFillProperties}(properties); +} +abstract class PointerEvent extends self::_PointerEvent&Object&Diagnosticable { + synthetic constructor •() → self::PointerEvent + : super self::_PointerEvent&Object&Diagnosticable::•() + ; +} +abstract class PointerSignalEvent extends self::PointerEvent { + synthetic constructor •() → self::PointerSignalEvent + : super self::PointerEvent::•() + ; +} +abstract class _PointerEventDescription extends self::PointerEvent /*isMixinDeclaration*/ { + @#C1 + method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void { + super.{self::_PointerEvent&Object&Diagnosticable::debugFillProperties}(properties); + } +} +abstract class _CopyPointerScrollEvent extends self::PointerEvent /*isMixinDeclaration*/ { +} +abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription = self::PointerSignalEvent with self::_PointerEventDescription /*isAnonymousMixin*/ { + synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription + : super self::PointerSignalEvent::•() + ; + mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void + return super.{self::_PointerEventDescription::debugFillProperties}(properties); +} +abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent = self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription with self::_CopyPointerScrollEvent /*isAnonymousMixin*/ { + synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent + : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::•() + ; +} +class PointerScrollEvent extends self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent { + synthetic constructor •() → self::PointerScrollEvent + : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent::•() + ; + @#C1 + method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void { + super.{self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::debugFillProperties}(properties); + } +} +static method main() → dynamic { + new self::PointerScrollEvent::•().{self::PointerScrollEvent::debugFillProperties}(new self::DiagnosticPropertiesBuilder::•()){(self::DiagnosticPropertiesBuilder) → void}; +} + +constants { + #C1 = core::_Override {} +} diff --git a/pkg/front_end/testcases/none/mixin_super.dart.textual_outline.expect b/pkg/front_end/testcases/none/mixin_super.dart.textual_outline.expect new file mode 100644 index 00000000000..dd596587ac8 --- /dev/null +++ b/pkg/front_end/testcases/none/mixin_super.dart.textual_outline.expect @@ -0,0 +1,23 @@ +mixin Diagnosticable { + void debugFillProperties(DiagnosticPropertiesBuilder properties) {} +} + +class DiagnosticPropertiesBuilder {} + +abstract class PointerEvent with Diagnosticable {} + +abstract class PointerSignalEvent extends PointerEvent {} + +mixin _PointerEventDescription on PointerEvent { + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) {} +} +mixin _CopyPointerScrollEvent on PointerEvent {} + +class PointerScrollEvent extends PointerSignalEvent + with _PointerEventDescription, _CopyPointerScrollEvent { + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) {} +} + +main() {} diff --git a/pkg/front_end/testcases/none/mixin_super.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/none/mixin_super.dart.textual_outline_modelled.expect new file mode 100644 index 00000000000..e011475fb44 --- /dev/null +++ b/pkg/front_end/testcases/none/mixin_super.dart.textual_outline_modelled.expect @@ -0,0 +1,21 @@ +abstract class PointerEvent with Diagnosticable {} + +abstract class PointerSignalEvent extends PointerEvent {} + +class DiagnosticPropertiesBuilder {} + +class PointerScrollEvent extends PointerSignalEvent + with _PointerEventDescription, _CopyPointerScrollEvent { + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) {} +} + +main() {} +mixin Diagnosticable { + void debugFillProperties(DiagnosticPropertiesBuilder properties) {} +} +mixin _CopyPointerScrollEvent on PointerEvent {} +mixin _PointerEventDescription on PointerEvent { + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) {} +} diff --git a/pkg/front_end/testcases/none/mixin_super.dart.weak.expect b/pkg/front_end/testcases/none/mixin_super.dart.weak.expect new file mode 100644 index 00000000000..9929e6937ac --- /dev/null +++ b/pkg/front_end/testcases/none/mixin_super.dart.weak.expect @@ -0,0 +1,65 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:core" as core; + +abstract class Diagnosticable extends core::Object /*isMixinDeclaration*/ { + method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {} +} +class DiagnosticPropertiesBuilder extends core::Object { + synthetic constructor •() → self::DiagnosticPropertiesBuilder + : super core::Object::•() + ; +} +abstract class _PointerEvent&Object&Diagnosticable = core::Object with self::Diagnosticable /*isAnonymousMixin,hasConstConstructor*/ { + const synthetic constructor •() → self::_PointerEvent&Object&Diagnosticable + : super core::Object::•() + ; + mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void + return super.{self::Diagnosticable::debugFillProperties}(properties); +} +abstract class PointerEvent extends self::_PointerEvent&Object&Diagnosticable { + synthetic constructor •() → self::PointerEvent + : super self::_PointerEvent&Object&Diagnosticable::•() + ; +} +abstract class PointerSignalEvent extends self::PointerEvent { + synthetic constructor •() → self::PointerSignalEvent + : super self::PointerEvent::•() + ; +} +abstract class _PointerEventDescription extends self::PointerEvent /*isMixinDeclaration*/ { + @#C1 + method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void { + super.{self::_PointerEvent&Object&Diagnosticable::debugFillProperties}(properties); + } +} +abstract class _CopyPointerScrollEvent extends self::PointerEvent /*isMixinDeclaration*/ { +} +abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription = self::PointerSignalEvent with self::_PointerEventDescription /*isAnonymousMixin*/ { + synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription + : super self::PointerSignalEvent::•() + ; + mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void + return super.{self::_PointerEventDescription::debugFillProperties}(properties); +} +abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent = self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription with self::_CopyPointerScrollEvent /*isAnonymousMixin*/ { + synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent + : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::•() + ; +} +class PointerScrollEvent extends self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent { + synthetic constructor •() → self::PointerScrollEvent + : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent::•() + ; + @#C1 + method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void { + super.{self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::debugFillProperties}(properties); + } +} +static method main() → dynamic { + new self::PointerScrollEvent::•().{self::PointerScrollEvent::debugFillProperties}(new self::DiagnosticPropertiesBuilder::•()){(self::DiagnosticPropertiesBuilder) → void}; +} + +constants { + #C1 = core::_Override {} +} diff --git a/pkg/front_end/testcases/none/mixin_super.dart.weak.transformed.expect b/pkg/front_end/testcases/none/mixin_super.dart.weak.transformed.expect new file mode 100644 index 00000000000..9929e6937ac --- /dev/null +++ b/pkg/front_end/testcases/none/mixin_super.dart.weak.transformed.expect @@ -0,0 +1,65 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:core" as core; + +abstract class Diagnosticable extends core::Object /*isMixinDeclaration*/ { + method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {} +} +class DiagnosticPropertiesBuilder extends core::Object { + synthetic constructor •() → self::DiagnosticPropertiesBuilder + : super core::Object::•() + ; +} +abstract class _PointerEvent&Object&Diagnosticable = core::Object with self::Diagnosticable /*isAnonymousMixin,hasConstConstructor*/ { + const synthetic constructor •() → self::_PointerEvent&Object&Diagnosticable + : super core::Object::•() + ; + mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void + return super.{self::Diagnosticable::debugFillProperties}(properties); +} +abstract class PointerEvent extends self::_PointerEvent&Object&Diagnosticable { + synthetic constructor •() → self::PointerEvent + : super self::_PointerEvent&Object&Diagnosticable::•() + ; +} +abstract class PointerSignalEvent extends self::PointerEvent { + synthetic constructor •() → self::PointerSignalEvent + : super self::PointerEvent::•() + ; +} +abstract class _PointerEventDescription extends self::PointerEvent /*isMixinDeclaration*/ { + @#C1 + method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void { + super.{self::_PointerEvent&Object&Diagnosticable::debugFillProperties}(properties); + } +} +abstract class _CopyPointerScrollEvent extends self::PointerEvent /*isMixinDeclaration*/ { +} +abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription = self::PointerSignalEvent with self::_PointerEventDescription /*isAnonymousMixin*/ { + synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription + : super self::PointerSignalEvent::•() + ; + mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void + return super.{self::_PointerEventDescription::debugFillProperties}(properties); +} +abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent = self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription with self::_CopyPointerScrollEvent /*isAnonymousMixin*/ { + synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent + : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::•() + ; +} +class PointerScrollEvent extends self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent { + synthetic constructor •() → self::PointerScrollEvent + : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent::•() + ; + @#C1 + method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void { + super.{self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::debugFillProperties}(properties); + } +} +static method main() → dynamic { + new self::PointerScrollEvent::•().{self::PointerScrollEvent::debugFillProperties}(new self::DiagnosticPropertiesBuilder::•()){(self::DiagnosticPropertiesBuilder) → void}; +} + +constants { + #C1 = core::_Override {} +} diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status index 2d00cd044eb..d84d3b919d0 100644 --- a/pkg/front_end/testcases/text_serialization.status +++ b/pkg/front_end/testcases/text_serialization.status @@ -181,6 +181,7 @@ none/mixin_covariant: TextSerializationFailure none/operator: TypeCheckError none/property_get: TypeCheckError none/property_set: TypeCheckError +none/mixin_super: TextSerializationFailure none/tearoff_opt_out: TextSerializationFailure rasta/abstract_constructor: RuntimeError rasta/bad_constructor_redirection: RuntimeError diff --git a/tests/modular/mixin_super/main.dart b/tests/modular/mixin_super/main.dart new file mode 100644 index 00000000000..5b9023435ba --- /dev/null +++ b/tests/modular/mixin_super/main.dart @@ -0,0 +1,34 @@ +// Copyright (c) 2021, 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.md file. + +mixin Diagnosticable { + void debugFillProperties(DiagnosticPropertiesBuilder properties) {} +} + +class DiagnosticPropertiesBuilder {} + +abstract class PointerEvent with Diagnosticable {} + +abstract class PointerSignalEvent extends PointerEvent {} + +mixin _PointerEventDescription on PointerEvent { + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + } +} +mixin _CopyPointerScrollEvent on PointerEvent {} + +class PointerScrollEvent extends PointerSignalEvent + with _PointerEventDescription, _CopyPointerScrollEvent { + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + } +} + +main() { + new PointerScrollEvent() + .debugFillProperties(new DiagnosticPropertiesBuilder()); +} diff --git a/tests/modular/mixin_super/modules.yaml b/tests/modular/mixin_super/modules.yaml new file mode 100644 index 00000000000..7313554a3bd --- /dev/null +++ b/tests/modular/mixin_super/modules.yaml @@ -0,0 +1,6 @@ +# Copyright (c) 2021, 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. + +dependencies: + main: []