blob: 3d60365b8cc4a3501c00c1c70f8233811466097f [file] [log] [blame]
// 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.
// Tests collisions of `@JSExport` members using inheritance.
import 'dart:js_interop';
import 'package:js/js_util.dart';
// Overridden members do not count as an export name collision.
@JSExport()
class SuperclassNoCollision {
int field = throw '';
final int finalField = throw '';
int get getSet => throw '';
set getSet(int val) => throw '';
void method() => throw '';
}
@JSExport()
mixin MixinNoCollision {
int field = throw '';
final int finalField = throw '';
int get getSet => throw '';
set getSet(int val) => throw '';
void method() => throw '';
}
@JSExport()
mixin MixinNoCollision2 {
int field = throw '';
final int finalField = throw '';
int get getSet => throw '';
set getSet(int val) => throw '';
void method() => throw '';
}
@JSExport()
class InheritanceOneOverrideNoCollision extends SuperclassNoCollision
with MixinNoCollision {}
@JSExport()
class InheritanceTwoOverridesNoCollision extends SuperclassNoCollision
with MixinNoCollision, MixinNoCollision2 {}
@JSExport()
class InheritanceThreeOverridesNoCollision extends SuperclassNoCollision
with MixinNoCollision, MixinNoCollision2 {
int field = throw '';
final int finalField = throw '';
int get getSet => throw '';
set getSet(int val) => throw '';
void method() => throw '';
}
// Export name collisions can exist across classes and mixin applications.
@JSExport()
class SuperclassCollision {
@JSExport('field')
int fieldSuper = throw '';
@JSExport('finalField')
final int finalFieldSuper = throw '';
@JSExport('getSet')
int get getSetSuper => throw '';
@JSExport('getSet')
set getSetSuper(int val) => throw '';
@JSExport('method')
void methodSuper() => throw '';
}
@JSExport()
mixin MixinCollision {
@JSExport('field')
int fieldMixin = throw '';
@JSExport('finalField')
final int finalFieldMixin = throw '';
@JSExport('getSet')
int get getSetMixin => throw '';
@JSExport('getSet')
set getSetMixin(int val) => throw '';
@JSExport('method')
void methodMixin() => throw '';
}
@JSExport()
mixin MixinCollision2 {
@JSExport('field')
int fieldMixin2 = throw '';
@JSExport('finalField')
final int finalFieldMixin2 = throw '';
@JSExport('getSet')
int get getSetMixin2 => throw '';
@JSExport('getSet')
set getSetMixin2(int val) => throw '';
@JSExport('method')
void methodMixin2() => throw '';
}
@JSExport()
class InheritanceRenameOneCollision extends SuperclassCollision
// ^
// [web] The following class members collide with the same export 'field': MixinCollision.fieldMixin, SuperclassCollision.fieldSuper.
// [web] The following class members collide with the same export 'finalField': MixinCollision.finalFieldMixin, SuperclassCollision.finalFieldSuper.
// [web] The following class members collide with the same export 'getSet': MixinCollision.getSetMixin, MixinCollision.getSetMixin, SuperclassCollision.getSetSuper, SuperclassCollision.getSetSuper.
// [web] The following class members collide with the same export 'method': MixinCollision.methodMixin, SuperclassCollision.methodSuper.
with
MixinCollision {}
@JSExport()
class InheritanceRenameTwoCollisions extends SuperclassCollision
// ^
// [web] The following class members collide with the same export 'field': MixinCollision.fieldMixin, MixinCollision2.fieldMixin2, SuperclassCollision.fieldSuper.
// [web] The following class members collide with the same export 'finalField': MixinCollision.finalFieldMixin, MixinCollision2.finalFieldMixin2, SuperclassCollision.finalFieldSuper.
// [web] The following class members collide with the same export 'getSet': MixinCollision.getSetMixin, MixinCollision.getSetMixin, MixinCollision2.getSetMixin2, MixinCollision2.getSetMixin2, SuperclassCollision.getSetSuper, SuperclassCollision.getSetSuper.
// [web] The following class members collide with the same export 'method': MixinCollision.methodMixin, MixinCollision2.methodMixin2, SuperclassCollision.methodSuper.
with
MixinCollision,
MixinCollision2 {}
@JSExport()
class InheritanceRenameThreeCollisions extends SuperclassCollision
// ^
// [web] The following class members collide with the same export 'field': InheritanceRenameThreeCollisions.fieldDerived, MixinCollision.fieldMixin, MixinCollision2.fieldMixin2, SuperclassCollision.fieldSuper.
// [web] The following class members collide with the same export 'finalField': InheritanceRenameThreeCollisions.finalFieldDerived, MixinCollision.finalFieldMixin, MixinCollision2.finalFieldMixin2, SuperclassCollision.finalFieldSuper.
// [web] The following class members collide with the same export 'getSet': InheritanceRenameThreeCollisions.getSetDerived, InheritanceRenameThreeCollisions.getSetDerived, MixinCollision.getSetMixin, MixinCollision.getSetMixin, MixinCollision2.getSetMixin2, MixinCollision2.getSetMixin2, SuperclassCollision.getSetSuper, SuperclassCollision.getSetSuper.
// [web] The following class members collide with the same export 'method': InheritanceRenameThreeCollisions.methodDerived, MixinCollision.methodMixin, MixinCollision2.methodMixin2, SuperclassCollision.methodSuper.
with
MixinCollision,
MixinCollision2 {
@JSExport('field')
int fieldDerived = throw '';
@JSExport('finalField')
final int finalFieldDerived = throw '';
@JSExport('getSet')
int get getSetDerived => throw '';
@JSExport('getSet')
set getSetDerived(int val) => throw '';
@JSExport('method')
void methodDerived() => throw '';
}
// No collision if superclass doesn't contain any members marked for export.
class SuperclassNoMembers {
int field = throw '';
final int finalField = throw '';
int get getSet => throw '';
set getSet(int val) => throw '';
void method() => throw '';
}
class InheritanceNoSuperclassMembers extends SuperclassNoMembers {
@JSExport('field')
int fieldDerived = throw '';
@JSExport('finalField')
final int finalFieldDerived = throw '';
@JSExport('getSet')
int get getSetDerived => throw '';
@JSExport('getSet')
set getSetDerived(int val) => throw '';
@JSExport('method')
void methodDerived() => throw '';
}
class Fields {
int getterField = throw '';
int setterField = throw '';
}
// These partial overrides are okay, as there's still one getter and one setter
// per name.
@JSExport()
class PartialOverrideFieldNoCollision extends Fields {
set getterField(int val) => throw '';
int get setterField => throw '';
}
@JSExport()
class GetSet {
int get getter => throw '';
set setter(int val) => throw '';
}
// Getters and setters through inheritance should be okay.
@JSExport()
class GetSetInheritanceNoCollision extends Fields {
int get setter => throw '';
set getter(int val) => throw '';
}
void main() {
createDartExport(InheritanceOneOverrideNoCollision());
createDartExport(InheritanceTwoOverridesNoCollision());
createDartExport(InheritanceThreeOverridesNoCollision());
createDartExport(InheritanceRenameOneCollision());
createDartExport(InheritanceRenameTwoCollisions());
createDartExport(InheritanceRenameThreeCollisions());
createDartExport(InheritanceNoSuperclassMembers());
createDartExport(PartialOverrideFieldNoCollision());
createDartExport(GetSetInheritanceNoCollision());
// Same method with different name and type.
createJSInteropWrapper(InheritanceOneOverrideNoCollision());
createJSInteropWrapper(InheritanceTwoOverridesNoCollision());
createJSInteropWrapper(InheritanceThreeOverridesNoCollision());
createJSInteropWrapper(InheritanceRenameOneCollision());
createJSInteropWrapper(InheritanceRenameTwoCollisions());
createJSInteropWrapper(InheritanceRenameThreeCollisions());
createJSInteropWrapper(InheritanceNoSuperclassMembers());
createJSInteropWrapper(PartialOverrideFieldNoCollision());
createJSInteropWrapper(GetSetInheritanceNoCollision());
}