KT-1934 Check inherited signatures for compatibility
Overridden signatures should have compatible return types (equal types for 'var'). Only relevant overrides should be taken into account. Refactor inherited signatures check, introduce a strategy interface for problem reporting.
This commit is contained in:
@@ -324,6 +324,11 @@ public interface Errors {
|
|||||||
DiagnosticFactory2<KtNamedDeclaration, CallableMemberDescriptor, CallableMemberDescriptor> PROPERTY_TYPE_MISMATCH_ON_OVERRIDE =
|
DiagnosticFactory2<KtNamedDeclaration, CallableMemberDescriptor, CallableMemberDescriptor> PROPERTY_TYPE_MISMATCH_ON_OVERRIDE =
|
||||||
DiagnosticFactory2.create(ERROR, DECLARATION_RETURN_TYPE);
|
DiagnosticFactory2.create(ERROR, DECLARATION_RETURN_TYPE);
|
||||||
|
|
||||||
|
DiagnosticFactory2<KtClassOrObject, CallableMemberDescriptor, CallableMemberDescriptor> RETURN_TYPE_MISMATCH_ON_INHERITANCE =
|
||||||
|
DiagnosticFactory2.create(ERROR, DECLARATION_NAME);
|
||||||
|
DiagnosticFactory2<KtClassOrObject, CallableMemberDescriptor, CallableMemberDescriptor> PROPERTY_TYPE_MISMATCH_ON_INHERITANCE =
|
||||||
|
DiagnosticFactory2.create(ERROR, DECLARATION_NAME);
|
||||||
|
|
||||||
DiagnosticFactory2<KtClassOrObject, KtClassOrObject, CallableMemberDescriptor> ABSTRACT_MEMBER_NOT_IMPLEMENTED =
|
DiagnosticFactory2<KtClassOrObject, KtClassOrObject, CallableMemberDescriptor> ABSTRACT_MEMBER_NOT_IMPLEMENTED =
|
||||||
DiagnosticFactory2.create(ERROR, DECLARATION_NAME);
|
DiagnosticFactory2.create(ERROR, DECLARATION_NAME);
|
||||||
DiagnosticFactory2<KtClassOrObject, KtClassOrObject, CallableMemberDescriptor> ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED =
|
DiagnosticFactory2<KtClassOrObject, KtClassOrObject, CallableMemberDescriptor> ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED =
|
||||||
|
|||||||
+4
@@ -555,9 +555,13 @@ public class DefaultErrorMessages {
|
|||||||
|
|
||||||
MAP.put(RETURN_TYPE_MISMATCH_ON_OVERRIDE, "Return type of ''{0}'' is not a subtype of the return type of the overridden member ''{1}''",
|
MAP.put(RETURN_TYPE_MISMATCH_ON_OVERRIDE, "Return type of ''{0}'' is not a subtype of the return type of the overridden member ''{1}''",
|
||||||
NAME, FQ_NAMES_IN_TYPES);
|
NAME, FQ_NAMES_IN_TYPES);
|
||||||
|
MAP.put(RETURN_TYPE_MISMATCH_ON_INHERITANCE, "''{0}'' clashes with ''{1}'': return types are incompatible",
|
||||||
|
SHORT_NAMES_IN_TYPES, SHORT_NAMES_IN_TYPES);
|
||||||
|
|
||||||
MAP.put(PROPERTY_TYPE_MISMATCH_ON_OVERRIDE, "Type of ''{0}'' doesn''t match the type of the overridden var-property ''{1}''",
|
MAP.put(PROPERTY_TYPE_MISMATCH_ON_OVERRIDE, "Type of ''{0}'' doesn''t match the type of the overridden var-property ''{1}''",
|
||||||
NAME, FQ_NAMES_IN_TYPES);
|
NAME, FQ_NAMES_IN_TYPES);
|
||||||
|
MAP.put(PROPERTY_TYPE_MISMATCH_ON_INHERITANCE, "''{0}'' clashes with ''{1}'': property types are incompatible",
|
||||||
|
SHORT_NAMES_IN_TYPES, SHORT_NAMES_IN_TYPES);
|
||||||
|
|
||||||
MAP.put(VAR_OVERRIDDEN_BY_VAL, "Var-property {0} cannot be overridden by val-property {1}", FQ_NAMES_IN_TYPES, FQ_NAMES_IN_TYPES);
|
MAP.put(VAR_OVERRIDDEN_BY_VAL, "Var-property {0} cannot be overridden by val-property {1}", FQ_NAMES_IN_TYPES, FQ_NAMES_IN_TYPES);
|
||||||
|
|
||||||
|
|||||||
@@ -257,7 +257,7 @@ public class OverrideResolver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkOverridesInAClass(@NotNull ClassDescriptorWithResolutionScopes classDescriptor, @NotNull KtClassOrObject klass) {
|
private void checkOverridesInAClass(@NotNull ClassDescriptorWithResolutionScopes classDescriptor, @NotNull final KtClassOrObject klass) {
|
||||||
// Check overrides for internal consistency
|
// Check overrides for internal consistency
|
||||||
for (CallableMemberDescriptor member : classDescriptor.getDeclaredCallableMembers()) {
|
for (CallableMemberDescriptor member : classDescriptor.getDeclaredCallableMembers()) {
|
||||||
checkOverrideForMember(member);
|
checkOverrideForMember(member);
|
||||||
@@ -265,13 +265,53 @@ public class OverrideResolver {
|
|||||||
|
|
||||||
// Check if everything that must be overridden, actually is
|
// Check if everything that must be overridden, actually is
|
||||||
// More than one implementation or no implementations at all
|
// More than one implementation or no implementations at all
|
||||||
Set<CallableMemberDescriptor> abstractNoImpl = Sets.newLinkedHashSet();
|
final Set<CallableMemberDescriptor> abstractNoImpl = Sets.newLinkedHashSet();
|
||||||
Set<CallableMemberDescriptor> manyImpl = Sets.newLinkedHashSet();
|
final Set<CallableMemberDescriptor> manyImpl = Sets.newLinkedHashSet();
|
||||||
Set<CallableMemberDescriptor> abstractInBaseClassNoImpl = Sets.newLinkedHashSet();
|
final Set<CallableMemberDescriptor> abstractInBaseClassNoImpl = Sets.newLinkedHashSet();
|
||||||
Set<CallableMemberDescriptor> conflictingInterfaceOverrides = Sets.newLinkedHashSet();
|
final Set<CallableMemberDescriptor> conflictingInterfaceOverrides = Sets.newLinkedHashSet();
|
||||||
collectMissingImplementations(classDescriptor,
|
|
||||||
abstractNoImpl, manyImpl,
|
checkInheritedSignatures(
|
||||||
abstractInBaseClassNoImpl, conflictingInterfaceOverrides);
|
classDescriptor,
|
||||||
|
new CheckInheritedSignaturesReportingStrategy() {
|
||||||
|
private boolean returnTypeMismatch = false;
|
||||||
|
private boolean propertyTypeMismatch = false;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void abstractMemberNoImpl(CallableMemberDescriptor descriptor) {
|
||||||
|
abstractNoImpl.add(descriptor);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void abstractBaseClassMemberNoImpl(CallableMemberDescriptor descriptor) {
|
||||||
|
abstractInBaseClassNoImpl.add(descriptor);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void manyImplMemberNoImpl(CallableMemberDescriptor descriptor) {
|
||||||
|
manyImpl.add(descriptor);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void conflictingMemberFromInterface(CallableMemberDescriptor descriptor) {
|
||||||
|
conflictingInterfaceOverrides.add(descriptor);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void clashingWithReturnType(CallableMemberDescriptor descriptor1, CallableMemberDescriptor descriptor2) {
|
||||||
|
if (!returnTypeMismatch) {
|
||||||
|
returnTypeMismatch = true;
|
||||||
|
trace.report(RETURN_TYPE_MISMATCH_ON_INHERITANCE.on(klass, descriptor1, descriptor2));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void clashingWithPropertyType(CallableMemberDescriptor descriptor1, CallableMemberDescriptor descriptor2) {
|
||||||
|
if (!propertyTypeMismatch) {
|
||||||
|
propertyTypeMismatch = true;
|
||||||
|
trace.report(PROPERTY_TYPE_MISMATCH_ON_INHERITANCE.on(klass, descriptor1, descriptor2));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
if (!classCanHaveAbstractMembers(classDescriptor)) {
|
if (!classCanHaveAbstractMembers(classDescriptor)) {
|
||||||
if (!abstractInBaseClassNoImpl.isEmpty()) {
|
if (!abstractInBaseClassNoImpl.isEmpty()) {
|
||||||
@@ -292,34 +332,68 @@ public class OverrideResolver {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public static Set<CallableMemberDescriptor> getMissingImplementations(@NotNull ClassDescriptor classDescriptor) {
|
public static Set<CallableMemberDescriptor> getMissingImplementations(@NotNull ClassDescriptor classDescriptor) {
|
||||||
Set<CallableMemberDescriptor> shouldImplement = new LinkedHashSet<CallableMemberDescriptor>();
|
CollectMissingImplementationsStrategy collector = new CollectMissingImplementationsStrategy();
|
||||||
Set<CallableMemberDescriptor> dontCare = new HashSet<CallableMemberDescriptor>();
|
checkInheritedSignatures(classDescriptor, collector);
|
||||||
collectMissingImplementations(classDescriptor, shouldImplement, shouldImplement, dontCare, dontCare);
|
return collector.shouldImplement;
|
||||||
return shouldImplement;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void collectMissingImplementations(
|
private interface CheckInheritedSignaturesReportingStrategy {
|
||||||
|
void abstractMemberNoImpl(CallableMemberDescriptor descriptor);
|
||||||
|
void abstractBaseClassMemberNoImpl(CallableMemberDescriptor descriptor);
|
||||||
|
void manyImplMemberNoImpl(CallableMemberDescriptor descriptor);
|
||||||
|
void conflictingMemberFromInterface(CallableMemberDescriptor descriptor);
|
||||||
|
void clashingWithReturnType(CallableMemberDescriptor descriptor1, CallableMemberDescriptor descriptor2);
|
||||||
|
void clashingWithPropertyType(CallableMemberDescriptor descriptor1, CallableMemberDescriptor descriptor2);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class CollectMissingImplementationsStrategy implements CheckInheritedSignaturesReportingStrategy {
|
||||||
|
private Set<CallableMemberDescriptor> shouldImplement = new LinkedHashSet<CallableMemberDescriptor>();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void abstractMemberNoImpl(CallableMemberDescriptor descriptor) {
|
||||||
|
shouldImplement.add(descriptor);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void abstractBaseClassMemberNoImpl(CallableMemberDescriptor descriptor) {
|
||||||
|
// don't care
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void manyImplMemberNoImpl(CallableMemberDescriptor descriptor) {
|
||||||
|
shouldImplement.add(descriptor);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void conflictingMemberFromInterface(CallableMemberDescriptor descriptor) {
|
||||||
|
// don't care
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void clashingWithReturnType(CallableMemberDescriptor descriptor1, CallableMemberDescriptor descriptor2) {
|
||||||
|
// don't care
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void clashingWithPropertyType(CallableMemberDescriptor descriptor1, CallableMemberDescriptor descriptor2) {
|
||||||
|
// don't care
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void checkInheritedSignatures(
|
||||||
@NotNull ClassDescriptor classDescriptor,
|
@NotNull ClassDescriptor classDescriptor,
|
||||||
@NotNull Set<CallableMemberDescriptor> abstractNoImpl,
|
@NotNull CheckInheritedSignaturesReportingStrategy reportingStrategy
|
||||||
@NotNull Set<CallableMemberDescriptor> manyImpl,
|
|
||||||
@NotNull Set<CallableMemberDescriptor> abstractInBaseClassNoImpl,
|
|
||||||
@NotNull Set<CallableMemberDescriptor> conflictingInterfaceOverrides
|
|
||||||
) {
|
) {
|
||||||
for (DeclarationDescriptor member : DescriptorUtils.getAllDescriptors(classDescriptor.getDefaultType().getMemberScope())) {
|
for (DeclarationDescriptor member : DescriptorUtils.getAllDescriptors(classDescriptor.getDefaultType().getMemberScope())) {
|
||||||
if (member instanceof CallableMemberDescriptor) {
|
if (member instanceof CallableMemberDescriptor) {
|
||||||
collectMissingImplementations((CallableMemberDescriptor) member,
|
checkInheritedSignatures((CallableMemberDescriptor) member, reportingStrategy);
|
||||||
abstractNoImpl, manyImpl,
|
|
||||||
abstractInBaseClassNoImpl, conflictingInterfaceOverrides);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void collectMissingImplementations(
|
private static void checkInheritedSignatures(
|
||||||
@NotNull CallableMemberDescriptor descriptor,
|
@NotNull CallableMemberDescriptor descriptor,
|
||||||
@NotNull Set<CallableMemberDescriptor> abstractNoImpl,
|
@NotNull CheckInheritedSignaturesReportingStrategy reportingStrategy
|
||||||
@NotNull Set<CallableMemberDescriptor> manyImpl,
|
|
||||||
@NotNull Set<CallableMemberDescriptor> abstractInBaseClassNoImpl,
|
|
||||||
@NotNull Set<CallableMemberDescriptor> conflictingInterfaceOverrides
|
|
||||||
) {
|
) {
|
||||||
if (descriptor.getKind().isReal()) return;
|
if (descriptor.getKind().isReal()) return;
|
||||||
if (descriptor.getVisibility() == Visibilities.INVISIBLE_FAKE) return;
|
if (descriptor.getVisibility() == Visibilities.INVISIBLE_FAKE) return;
|
||||||
@@ -341,7 +415,9 @@ public class OverrideResolver {
|
|||||||
Set<CallableMemberDescriptor> relevantDirectlyOverridden =
|
Set<CallableMemberDescriptor> relevantDirectlyOverridden =
|
||||||
getRelevantDirectlyOverridden(overriddenDeclarationsByDirectParent, allFilteredOverriddenDeclarations);
|
getRelevantDirectlyOverridden(overriddenDeclarationsByDirectParent, allFilteredOverriddenDeclarations);
|
||||||
|
|
||||||
collectJava8MissingOverrides(relevantDirectlyOverridden, abstractInBaseClassNoImpl, conflictingInterfaceOverrides);
|
checkInheritedSignaturesForFakeOverride(descriptor, relevantDirectlyOverridden, reportingStrategy);
|
||||||
|
|
||||||
|
collectJava8MissingOverrides(relevantDirectlyOverridden, reportingStrategy);
|
||||||
|
|
||||||
List<CallableMemberDescriptor> implementations = collectImplementations(relevantDirectlyOverridden);
|
List<CallableMemberDescriptor> implementations = collectImplementations(relevantDirectlyOverridden);
|
||||||
if (implementations.size() == 1 && isReturnTypeOkForOverride(descriptor, implementations.get(0))) return;
|
if (implementations.size() == 1 && isReturnTypeOkForOverride(descriptor, implementations.get(0))) return;
|
||||||
@@ -351,20 +427,27 @@ public class OverrideResolver {
|
|||||||
filterNotSynthesizedDescriptorsByModality(allFilteredOverriddenDeclarations, abstractOverridden, concreteOverridden);
|
filterNotSynthesizedDescriptorsByModality(allFilteredOverriddenDeclarations, abstractOverridden, concreteOverridden);
|
||||||
|
|
||||||
if (implementations.isEmpty()) {
|
if (implementations.isEmpty()) {
|
||||||
abstractNoImpl.addAll(abstractOverridden);
|
for (CallableMemberDescriptor member : abstractOverridden) {
|
||||||
|
reportingStrategy.abstractMemberNoImpl(member);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (implementations.size() > 1) {
|
else if (implementations.size() > 1) {
|
||||||
manyImpl.addAll(concreteOverridden);
|
for (CallableMemberDescriptor member : concreteOverridden) {
|
||||||
|
reportingStrategy.manyImplMemberNoImpl(member);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
abstractNoImpl.addAll(collectAbstractMethodsWithMoreSpecificReturnType(abstractOverridden, implementations.get(0)));
|
List<CallableMemberDescriptor> membersWithMoreSpecificReturnType =
|
||||||
|
collectAbstractMethodsWithMoreSpecificReturnType(abstractOverridden, implementations.get(0));
|
||||||
|
for (CallableMemberDescriptor member : membersWithMoreSpecificReturnType) {
|
||||||
|
reportingStrategy.abstractMemberNoImpl(member);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void collectJava8MissingOverrides(
|
private static void collectJava8MissingOverrides(
|
||||||
Set<CallableMemberDescriptor> relevantDirectlyOverridden,
|
@NotNull Set<CallableMemberDescriptor> relevantDirectlyOverridden,
|
||||||
@NotNull Set<CallableMemberDescriptor> abstractInBaseClassNoImpl,
|
@NotNull CheckInheritedSignaturesReportingStrategy reportingStrategy
|
||||||
@NotNull Set<CallableMemberDescriptor> conflictingInterfaceOverrides
|
|
||||||
) {
|
) {
|
||||||
// Java 8:
|
// Java 8:
|
||||||
// -- class should implement an abstract member of a super-class,
|
// -- class should implement an abstract member of a super-class,
|
||||||
@@ -396,11 +479,13 @@ public class OverrideResolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (overridesAbstractInBaseClass != null) {
|
if (overridesAbstractInBaseClass != null) {
|
||||||
abstractInBaseClassNoImpl.add(overridesAbstractInBaseClass);
|
reportingStrategy.abstractBaseClassMemberNoImpl(overridesAbstractInBaseClass);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!overridesClassMember && overridesNonAbstractInterfaceMember && overriddenInterfaceMembers.size() > 1) {
|
if (!overridesClassMember && overridesNonAbstractInterfaceMember && overriddenInterfaceMembers.size() > 1) {
|
||||||
conflictingInterfaceOverrides.addAll(overriddenInterfaceMembers);
|
for (CallableMemberDescriptor member : overriddenInterfaceMembers) {
|
||||||
|
reportingStrategy.conflictingMemberFromInterface(member);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -638,6 +723,39 @@ public class OverrideResolver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void checkInheritedSignaturesForFakeOverride(
|
||||||
|
@NotNull CallableMemberDescriptor fakeOverride,
|
||||||
|
@NotNull Collection<CallableMemberDescriptor> relevantDirectlyOverridden,
|
||||||
|
@NotNull CheckInheritedSignaturesReportingStrategy reportingStrategy
|
||||||
|
) {
|
||||||
|
assert fakeOverride.getKind() == FAKE_OVERRIDE
|
||||||
|
: "Fake override expected; actual: " + fakeOverride + " of kind " + fakeOverride.getKind();
|
||||||
|
|
||||||
|
// FIXME This algorithm depends on transitiveness of sub-typing relation, which is broken in presence of flexible types.
|
||||||
|
// See override/clashesOnInheritance/flexibleReturnType.kt.
|
||||||
|
if (relevantDirectlyOverridden.size() > 1) {
|
||||||
|
Iterator<CallableMemberDescriptor> overriddenIterator = relevantDirectlyOverridden.iterator();
|
||||||
|
CallableMemberDescriptor mostSpecificOverridden = overriddenIterator.next();
|
||||||
|
while (overriddenIterator.hasNext()) {
|
||||||
|
CallableMemberDescriptor overriddenDescriptor = overriddenIterator.next();
|
||||||
|
if (OverridingUtil.isMoreSpecific(overriddenDescriptor, mostSpecificOverridden)) {
|
||||||
|
mostSpecificOverridden = overriddenDescriptor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (CallableMemberDescriptor overriddenDescriptor : relevantDirectlyOverridden) {
|
||||||
|
if (!OverridingUtil.isMoreSpecific(mostSpecificOverridden, overriddenDescriptor)) {
|
||||||
|
if (overriddenDescriptor instanceof PropertyDescriptor) {
|
||||||
|
reportingStrategy.clashingWithPropertyType(mostSpecificOverridden, overriddenDescriptor);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
reportingStrategy.clashingWithReturnType(mostSpecificOverridden, overriddenDescriptor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static void checkOverridesForMemberMarkedOverride(
|
private static void checkOverridesForMemberMarkedOverride(
|
||||||
@NotNull CallableMemberDescriptor declared,
|
@NotNull CallableMemberDescriptor declared,
|
||||||
boolean checkIfOverridesNothing,
|
boolean checkIfOverridesNothing,
|
||||||
|
|||||||
+1
-1
@@ -3,7 +3,7 @@ abstract class Foo<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
interface Tr {
|
interface Tr {
|
||||||
fun hello(s : String)
|
fun hello(s : String): String
|
||||||
}
|
}
|
||||||
|
|
||||||
class Bar: Foo<String>(), Tr {
|
class Bar: Foo<String>(), Tr {
|
||||||
|
|||||||
+3
-2
@@ -7,7 +7,8 @@ open class B {
|
|||||||
}
|
}
|
||||||
|
|
||||||
interface C {
|
interface C {
|
||||||
fun foo(y: Int)
|
fun foo(y: Int): Int
|
||||||
}
|
}
|
||||||
|
|
||||||
<!MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE, DIFFERENT_NAMES_FOR_THE_SAME_PARAMETER_IN_SUPERTYPES!>class Z<!> : A, B(), C
|
// TODO DIFFERENT_NAMES_FOR_THE_SAME_PARAMETER_IN_SUPERTYPES reported twice
|
||||||
|
<!MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE, DIFFERENT_NAMES_FOR_THE_SAME_PARAMETER_IN_SUPERTYPES, DIFFERENT_NAMES_FOR_THE_SAME_PARAMETER_IN_SUPERTYPES!>class Z<!> : A, B(), C
|
||||||
+2
-2
@@ -17,7 +17,7 @@ public open class B {
|
|||||||
|
|
||||||
public interface C {
|
public interface C {
|
||||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
public abstract fun foo(/*0*/ y: kotlin.Int): kotlin.Unit
|
public abstract fun foo(/*0*/ y: kotlin.Int): kotlin.Int
|
||||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
}
|
}
|
||||||
@@ -25,7 +25,7 @@ public interface C {
|
|||||||
public final class Z : A, B, C {
|
public final class Z : A, B, C {
|
||||||
public constructor Z()
|
public constructor Z()
|
||||||
public open override /*3*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
public open override /*3*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
public final override /*3*/ /*fake_override*/ fun foo(/*0*/ x: kotlin.Int = ...): kotlin.Int
|
public final override /*3*/ /*fake_override*/ fun foo(/*0*/ y: kotlin.Int = ...): kotlin.Int
|
||||||
public open override /*3*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
public open override /*3*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
public open override /*3*/ /*fake_override*/ fun toString(): kotlin.String
|
public open override /*3*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
}
|
}
|
||||||
|
|||||||
+37
@@ -0,0 +1,37 @@
|
|||||||
|
interface IBase {
|
||||||
|
fun copy(): IBase
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ILeft : IBase {
|
||||||
|
override fun copy(): ILeft
|
||||||
|
}
|
||||||
|
|
||||||
|
open class CLeft : ILeft {
|
||||||
|
override fun copy(): ILeft = CLeft()
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IRight : IBase {
|
||||||
|
override fun copy(): IRight
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IDerived : ILeft, IRight {
|
||||||
|
override fun copy(): IDerived
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error: ILeft::copy and IRight::copy have unrelated return types
|
||||||
|
<!RETURN_TYPE_MISMATCH_ON_INHERITANCE, ABSTRACT_MEMBER_NOT_IMPLEMENTED!>class CDerivedInvalid1<!> : ILeft, IRight
|
||||||
|
|
||||||
|
// Error: CLeft::copy and IRight::copy have unrelated return types
|
||||||
|
<!RETURN_TYPE_MISMATCH_ON_INHERITANCE!>class CDerivedInvalid2<!> : CLeft(), IRight
|
||||||
|
|
||||||
|
// OK: CDerived1::copy overrides both ILeft::copy and IRight::copy
|
||||||
|
class CDerived1 : ILeft, IRight {
|
||||||
|
override fun copy(): CDerived1 = CDerived1()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Although ILeft::copy and IRight::copy return types are unrelated, IDerived::copy return type is the most specific of three.
|
||||||
|
abstract class CDerived2 : ILeft, IRight, IDerived
|
||||||
|
|
||||||
|
class CDerived2a : ILeft, IRight, IDerived {
|
||||||
|
override fun copy(): IDerived = CDerived2a()
|
||||||
|
}
|
||||||
+77
@@ -0,0 +1,77 @@
|
|||||||
|
package
|
||||||
|
|
||||||
|
public final class CDerived1 : ILeft, IRight {
|
||||||
|
public constructor CDerived1()
|
||||||
|
public open override /*2*/ fun copy(): CDerived1
|
||||||
|
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract class CDerived2 : ILeft, IRight, IDerived {
|
||||||
|
public constructor CDerived2()
|
||||||
|
public abstract override /*3*/ /*fake_override*/ fun copy(): IDerived
|
||||||
|
public open override /*3*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*3*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*3*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public final class CDerived2a : ILeft, IRight, IDerived {
|
||||||
|
public constructor CDerived2a()
|
||||||
|
public open override /*3*/ fun copy(): IDerived
|
||||||
|
public open override /*3*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*3*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*3*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public final class CDerivedInvalid1 : ILeft, IRight {
|
||||||
|
public constructor CDerivedInvalid1()
|
||||||
|
public abstract override /*2*/ /*fake_override*/ fun copy(): ILeft
|
||||||
|
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public final class CDerivedInvalid2 : CLeft, IRight {
|
||||||
|
public constructor CDerivedInvalid2()
|
||||||
|
public open override /*2*/ /*fake_override*/ fun copy(): ILeft
|
||||||
|
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public open class CLeft : ILeft {
|
||||||
|
public constructor CLeft()
|
||||||
|
public open override /*1*/ fun copy(): ILeft
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IBase {
|
||||||
|
public abstract fun copy(): IBase
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IDerived : ILeft, IRight {
|
||||||
|
public abstract override /*2*/ fun copy(): IDerived
|
||||||
|
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface ILeft : IBase {
|
||||||
|
public abstract override /*1*/ fun copy(): ILeft
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IRight : IBase {
|
||||||
|
public abstract override /*1*/ fun copy(): IRight
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
+30
@@ -0,0 +1,30 @@
|
|||||||
|
// FILE: J.java
|
||||||
|
public interface J {
|
||||||
|
String foo(); // String!
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: K.kt
|
||||||
|
interface K1 {
|
||||||
|
fun foo(): String
|
||||||
|
}
|
||||||
|
|
||||||
|
interface K2 {
|
||||||
|
fun foo(): String?
|
||||||
|
}
|
||||||
|
|
||||||
|
interface KDerived1a : K1, J
|
||||||
|
|
||||||
|
interface KDerived1b : J, K1
|
||||||
|
|
||||||
|
interface KDerived2a : K2, J
|
||||||
|
|
||||||
|
interface KDerived2b : J, K2
|
||||||
|
|
||||||
|
interface KDerived12a : K1, K2, J
|
||||||
|
// public abstract override /*3*/ /*fake_override*/ fun foo(): kotlin.String!
|
||||||
|
|
||||||
|
<!RETURN_TYPE_MISMATCH_ON_INHERITANCE!>interface KDerived12b<!> : K1, J, K2 // TODO
|
||||||
|
// public abstract override /*3*/ /*fake_override*/ fun foo(): kotlin.String?
|
||||||
|
|
||||||
|
interface KDerived12c : J, K1, K2
|
||||||
|
// public abstract override /*3*/ /*fake_override*/ fun foo(): kotlin.String
|
||||||
+73
@@ -0,0 +1,73 @@
|
|||||||
|
package
|
||||||
|
|
||||||
|
public /*synthesized*/ fun J(/*0*/ function: () -> kotlin.String!): J
|
||||||
|
|
||||||
|
public interface J {
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public abstract fun foo(): kotlin.String!
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface K1 {
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public abstract fun foo(): kotlin.String
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface K2 {
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public abstract fun foo(): kotlin.String?
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface KDerived12a : K1, K2, J {
|
||||||
|
public open override /*3*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public abstract override /*3*/ /*fake_override*/ fun foo(): kotlin.String!
|
||||||
|
public open override /*3*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*3*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface KDerived12b : K1, J, K2 {
|
||||||
|
public open override /*3*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public abstract override /*3*/ /*fake_override*/ fun foo(): kotlin.String?
|
||||||
|
public open override /*3*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*3*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface KDerived12c : J, K1, K2 {
|
||||||
|
public open override /*3*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public abstract override /*3*/ /*fake_override*/ fun foo(): kotlin.String
|
||||||
|
public open override /*3*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*3*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface KDerived1a : K1, J {
|
||||||
|
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public abstract override /*2*/ /*fake_override*/ fun foo(): kotlin.String!
|
||||||
|
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface KDerived1b : J, K1 {
|
||||||
|
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public abstract override /*2*/ /*fake_override*/ fun foo(): kotlin.String
|
||||||
|
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface KDerived2a : K2, J {
|
||||||
|
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public abstract override /*2*/ /*fake_override*/ fun foo(): kotlin.String!
|
||||||
|
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface KDerived2b : J, K2 {
|
||||||
|
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public abstract override /*2*/ /*fake_override*/ fun foo(): kotlin.String?
|
||||||
|
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
+29
@@ -0,0 +1,29 @@
|
|||||||
|
open class A {
|
||||||
|
open val foo: Boolean = true
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IA {
|
||||||
|
val foo: String
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IAA {
|
||||||
|
val foo: Int
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IGA<T> {
|
||||||
|
val foo: T
|
||||||
|
}
|
||||||
|
|
||||||
|
<!PROPERTY_TYPE_MISMATCH_ON_INHERITANCE!>class B1<!>: A(), IA
|
||||||
|
|
||||||
|
<!PROPERTY_TYPE_MISMATCH_ON_INHERITANCE!>class B2<!>: A(), IA, IAA
|
||||||
|
|
||||||
|
abstract <!PROPERTY_TYPE_MISMATCH_ON_INHERITANCE!>class B3<!>: IA, IAA
|
||||||
|
|
||||||
|
class BS1: A(), IGA<Boolean>
|
||||||
|
|
||||||
|
class BS2: A(), IGA<Any>
|
||||||
|
|
||||||
|
<!PROPERTY_TYPE_MISMATCH_ON_INHERITANCE!>class BS3<!>: A(), IGA<String>
|
||||||
|
|
||||||
|
<!PROPERTY_TYPE_MISMATCH_ON_INHERITANCE!>class BG1<!><T>: A(), IGA<T>
|
||||||
+86
@@ -0,0 +1,86 @@
|
|||||||
|
package
|
||||||
|
|
||||||
|
public open class A {
|
||||||
|
public constructor A()
|
||||||
|
public open val foo: kotlin.Boolean = true
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public final class B1 : A, IA {
|
||||||
|
public constructor B1()
|
||||||
|
public open override /*2*/ /*fake_override*/ val foo: kotlin.Boolean
|
||||||
|
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public final class B2 : A, IA, IAA {
|
||||||
|
public constructor B2()
|
||||||
|
public open override /*3*/ /*fake_override*/ val foo: kotlin.Boolean
|
||||||
|
public open override /*3*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*3*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*3*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract class B3 : IA, IAA {
|
||||||
|
public constructor B3()
|
||||||
|
public abstract override /*2*/ /*fake_override*/ val foo: kotlin.String
|
||||||
|
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public final class BG1</*0*/ T> : A, IGA<T> {
|
||||||
|
public constructor BG1</*0*/ T>()
|
||||||
|
public open override /*2*/ /*fake_override*/ val foo: kotlin.Boolean
|
||||||
|
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public final class BS1 : A, IGA<kotlin.Boolean> {
|
||||||
|
public constructor BS1()
|
||||||
|
public open override /*2*/ /*fake_override*/ val foo: kotlin.Boolean
|
||||||
|
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public final class BS2 : A, IGA<kotlin.Any> {
|
||||||
|
public constructor BS2()
|
||||||
|
public open override /*2*/ /*fake_override*/ val foo: kotlin.Boolean
|
||||||
|
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public final class BS3 : A, IGA<kotlin.String> {
|
||||||
|
public constructor BS3()
|
||||||
|
public open override /*2*/ /*fake_override*/ val foo: kotlin.Boolean
|
||||||
|
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IA {
|
||||||
|
public abstract val foo: kotlin.String
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IAA {
|
||||||
|
public abstract val foo: kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IGA</*0*/ T> {
|
||||||
|
public abstract val foo: T
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
+29
@@ -0,0 +1,29 @@
|
|||||||
|
open class A {
|
||||||
|
open fun foo(): Boolean = true
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IA {
|
||||||
|
fun foo(): String
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IAA {
|
||||||
|
fun foo(): Int
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IGA<T> {
|
||||||
|
fun foo(): T
|
||||||
|
}
|
||||||
|
|
||||||
|
<!RETURN_TYPE_MISMATCH_ON_INHERITANCE!>class B1<!>: A(), IA
|
||||||
|
|
||||||
|
<!RETURN_TYPE_MISMATCH_ON_INHERITANCE!>class B2<!>: A(), IA, IAA
|
||||||
|
|
||||||
|
abstract <!RETURN_TYPE_MISMATCH_ON_INHERITANCE!>class B3<!>: IA, IAA
|
||||||
|
|
||||||
|
class BS1: A(), IGA<Boolean>
|
||||||
|
|
||||||
|
class BS2: A(), IGA<Any>
|
||||||
|
|
||||||
|
<!RETURN_TYPE_MISMATCH_ON_INHERITANCE!>class BS3<!>: A(), IGA<String>
|
||||||
|
|
||||||
|
<!RETURN_TYPE_MISMATCH_ON_INHERITANCE!>class BG1<!><T>: A(), IGA<T>
|
||||||
+86
@@ -0,0 +1,86 @@
|
|||||||
|
package
|
||||||
|
|
||||||
|
public open class A {
|
||||||
|
public constructor A()
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open fun foo(): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public final class B1 : A, IA {
|
||||||
|
public constructor B1()
|
||||||
|
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*2*/ /*fake_override*/ fun foo(): kotlin.Boolean
|
||||||
|
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public final class B2 : A, IA, IAA {
|
||||||
|
public constructor B2()
|
||||||
|
public open override /*3*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*3*/ /*fake_override*/ fun foo(): kotlin.Boolean
|
||||||
|
public open override /*3*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*3*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract class B3 : IA, IAA {
|
||||||
|
public constructor B3()
|
||||||
|
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public abstract override /*2*/ /*fake_override*/ fun foo(): kotlin.String
|
||||||
|
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public final class BG1</*0*/ T> : A, IGA<T> {
|
||||||
|
public constructor BG1</*0*/ T>()
|
||||||
|
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*2*/ /*fake_override*/ fun foo(): kotlin.Boolean
|
||||||
|
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public final class BS1 : A, IGA<kotlin.Boolean> {
|
||||||
|
public constructor BS1()
|
||||||
|
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*2*/ /*fake_override*/ fun foo(): kotlin.Boolean
|
||||||
|
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public final class BS2 : A, IGA<kotlin.Any> {
|
||||||
|
public constructor BS2()
|
||||||
|
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*2*/ /*fake_override*/ fun foo(): kotlin.Boolean
|
||||||
|
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public final class BS3 : A, IGA<kotlin.String> {
|
||||||
|
public constructor BS3()
|
||||||
|
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*2*/ /*fake_override*/ fun foo(): kotlin.Boolean
|
||||||
|
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IA {
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public abstract fun foo(): kotlin.String
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IAA {
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public abstract fun foo(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IGA</*0*/ T> {
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public abstract fun foo(): T
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
+33
@@ -0,0 +1,33 @@
|
|||||||
|
interface IA {
|
||||||
|
fun method(): String
|
||||||
|
val propVal: String
|
||||||
|
var propVar: String
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IB1 : IA
|
||||||
|
interface IB2 : IA
|
||||||
|
|
||||||
|
interface IGA<T> {
|
||||||
|
fun method(): T
|
||||||
|
val propVal: T
|
||||||
|
var propVar: T
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IGB1Str : IGA<String>
|
||||||
|
interface IGB2Str : IGA<String>
|
||||||
|
interface IGB3Int : IGA<Int>
|
||||||
|
|
||||||
|
interface IGB4T<T> : IGA<T>
|
||||||
|
interface IGB5T<T> : IGA<T>
|
||||||
|
|
||||||
|
interface IC : IB1, IB2
|
||||||
|
|
||||||
|
interface IGC1 : IGB1Str, IGB2Str
|
||||||
|
|
||||||
|
interface IGC2 : <!INCONSISTENT_TYPE_PARAMETER_VALUES!>IGB1Str, IGB3Int<!>
|
||||||
|
|
||||||
|
interface IGC3<T> : IGB4T<T>, IGB5T<T>
|
||||||
|
|
||||||
|
interface IGC4<T> : <!INCONSISTENT_TYPE_PARAMETER_VALUES!>IGB4T<T>, IGB5T<String><!>
|
||||||
|
|
||||||
|
interface IGC5 : IGB4T<String>, IGB5T<String>
|
||||||
+136
@@ -0,0 +1,136 @@
|
|||||||
|
package
|
||||||
|
|
||||||
|
public interface IA {
|
||||||
|
public abstract val propVal: kotlin.String
|
||||||
|
public abstract var propVar: kotlin.String
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public abstract fun method(): kotlin.String
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IB1 : IA {
|
||||||
|
public abstract override /*1*/ /*fake_override*/ val propVal: kotlin.String
|
||||||
|
public abstract override /*1*/ /*fake_override*/ var propVar: kotlin.String
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public abstract override /*1*/ /*fake_override*/ fun method(): kotlin.String
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IB2 : IA {
|
||||||
|
public abstract override /*1*/ /*fake_override*/ val propVal: kotlin.String
|
||||||
|
public abstract override /*1*/ /*fake_override*/ var propVar: kotlin.String
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public abstract override /*1*/ /*fake_override*/ fun method(): kotlin.String
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IC : IB1, IB2 {
|
||||||
|
public abstract override /*2*/ /*fake_override*/ val propVal: kotlin.String
|
||||||
|
public abstract override /*2*/ /*fake_override*/ var propVar: kotlin.String
|
||||||
|
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public abstract override /*2*/ /*fake_override*/ fun method(): kotlin.String
|
||||||
|
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IGA</*0*/ T> {
|
||||||
|
public abstract val propVal: T
|
||||||
|
public abstract var propVar: T
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public abstract fun method(): T
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IGB1Str : IGA<kotlin.String> {
|
||||||
|
public abstract override /*1*/ /*fake_override*/ val propVal: kotlin.String
|
||||||
|
public abstract override /*1*/ /*fake_override*/ var propVar: kotlin.String
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public abstract override /*1*/ /*fake_override*/ fun method(): kotlin.String
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IGB2Str : IGA<kotlin.String> {
|
||||||
|
public abstract override /*1*/ /*fake_override*/ val propVal: kotlin.String
|
||||||
|
public abstract override /*1*/ /*fake_override*/ var propVar: kotlin.String
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public abstract override /*1*/ /*fake_override*/ fun method(): kotlin.String
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IGB3Int : IGA<kotlin.Int> {
|
||||||
|
public abstract override /*1*/ /*fake_override*/ val propVal: kotlin.Int
|
||||||
|
public abstract override /*1*/ /*fake_override*/ var propVar: kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public abstract override /*1*/ /*fake_override*/ fun method(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IGB4T</*0*/ T> : IGA<T> {
|
||||||
|
public abstract override /*1*/ /*fake_override*/ val propVal: T
|
||||||
|
public abstract override /*1*/ /*fake_override*/ var propVar: T
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public abstract override /*1*/ /*fake_override*/ fun method(): T
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IGB5T</*0*/ T> : IGA<T> {
|
||||||
|
public abstract override /*1*/ /*fake_override*/ val propVal: T
|
||||||
|
public abstract override /*1*/ /*fake_override*/ var propVar: T
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public abstract override /*1*/ /*fake_override*/ fun method(): T
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IGC1 : IGB1Str, IGB2Str {
|
||||||
|
public abstract override /*2*/ /*fake_override*/ val propVal: kotlin.String
|
||||||
|
public abstract override /*2*/ /*fake_override*/ var propVar: kotlin.String
|
||||||
|
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public abstract override /*2*/ /*fake_override*/ fun method(): kotlin.String
|
||||||
|
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IGC2 : IGB1Str, IGB3Int {
|
||||||
|
public abstract override /*2*/ /*fake_override*/ val propVal: kotlin.String
|
||||||
|
public abstract override /*2*/ /*fake_override*/ var propVar: kotlin.String
|
||||||
|
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public abstract override /*2*/ /*fake_override*/ fun method(): kotlin.String
|
||||||
|
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IGC3</*0*/ T> : IGB4T<T>, IGB5T<T> {
|
||||||
|
public abstract override /*2*/ /*fake_override*/ val propVal: T
|
||||||
|
public abstract override /*2*/ /*fake_override*/ var propVar: T
|
||||||
|
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public abstract override /*2*/ /*fake_override*/ fun method(): T
|
||||||
|
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IGC4</*0*/ T> : IGB4T<T>, IGB5T<kotlin.String> {
|
||||||
|
public abstract override /*2*/ /*fake_override*/ val propVal: T
|
||||||
|
public abstract override /*2*/ /*fake_override*/ var propVar: T
|
||||||
|
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public abstract override /*2*/ /*fake_override*/ fun method(): T
|
||||||
|
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IGC5 : IGB4T<kotlin.String>, IGB5T<kotlin.String> {
|
||||||
|
public abstract override /*2*/ /*fake_override*/ val propVal: kotlin.String
|
||||||
|
public abstract override /*2*/ /*fake_override*/ var propVar: kotlin.String
|
||||||
|
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public abstract override /*2*/ /*fake_override*/ fun method(): kotlin.String
|
||||||
|
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
@@ -11295,6 +11295,45 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("compiler/testData/diagnostics/tests/override/clashesOnInheritance")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
public static class ClashesOnInheritance extends AbstractDiagnosticsTest {
|
||||||
|
public void testAllFilesPresentInClashesOnInheritance() throws Exception {
|
||||||
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/tests/override/clashesOnInheritance"), Pattern.compile("^(.+)\\.kt$"), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("covariantOverrides.kt")
|
||||||
|
public void testCovariantOverrides() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/override/clashesOnInheritance/covariantOverrides.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("flexibleReturnType.kt")
|
||||||
|
public void testFlexibleReturnType() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/override/clashesOnInheritance/flexibleReturnType.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("propertyTypeMismatch.kt")
|
||||||
|
public void testPropertyTypeMismatch() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/override/clashesOnInheritance/propertyTypeMismatch.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("returnTypeMismatch.kt")
|
||||||
|
public void testReturnTypeMismatch() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/override/clashesOnInheritance/returnTypeMismatch.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("unrelatedInherited.kt")
|
||||||
|
public void testUnrelatedInherited() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/override/clashesOnInheritance/unrelatedInherited.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("compiler/testData/diagnostics/tests/override/parameterNames")
|
@TestMetadata("compiler/testData/diagnostics/tests/override/parameterNames")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
@RunWith(JUnit3RunnerWithInners.class)
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
|||||||
@@ -319,7 +319,7 @@ public class OverridingUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isMoreSpecific(@NotNull CallableMemberDescriptor a, @NotNull CallableMemberDescriptor b) {
|
public static boolean isMoreSpecific(@NotNull CallableMemberDescriptor a, @NotNull CallableMemberDescriptor b) {
|
||||||
if (a instanceof SimpleFunctionDescriptor) {
|
if (a instanceof SimpleFunctionDescriptor) {
|
||||||
assert b instanceof SimpleFunctionDescriptor : "b is " + b.getClass();
|
assert b instanceof SimpleFunctionDescriptor : "b is " + b.getClass();
|
||||||
|
|
||||||
@@ -333,12 +333,14 @@ public class OverridingUtil {
|
|||||||
if (a instanceof PropertyDescriptor) {
|
if (a instanceof PropertyDescriptor) {
|
||||||
assert b instanceof PropertyDescriptor : "b is " + b.getClass();
|
assert b instanceof PropertyDescriptor : "b is " + b.getClass();
|
||||||
|
|
||||||
if (((PropertyDescriptor) a).isVar() || ((PropertyDescriptor) b).isVar()) {
|
PropertyDescriptor pa = (PropertyDescriptor) a;
|
||||||
return ((PropertyDescriptor) a).isVar();
|
PropertyDescriptor pb = (PropertyDescriptor) b;
|
||||||
|
if (pa.isVar() && pb.isVar()) {
|
||||||
|
return KotlinTypeChecker.DEFAULT.equalTypes(pa.getType(), pb.getType());
|
||||||
}
|
}
|
||||||
|
|
||||||
// both vals
|
// both vals or var <? val
|
||||||
return KotlinTypeChecker.DEFAULT.isSubtypeOf(((PropertyDescriptor) a).getType(), ((PropertyDescriptor) b).getType());
|
return KotlinTypeChecker.DEFAULT.isSubtypeOf(pa.getType(), pb.getType());
|
||||||
}
|
}
|
||||||
throw new IllegalArgumentException("Unexpected callable: " + a.getClass());
|
throw new IllegalArgumentException("Unexpected callable: " + a.getClass());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -96,9 +96,13 @@ public class IdeErrorMessages {
|
|||||||
|
|
||||||
MAP.put(RETURN_TYPE_MISMATCH_ON_OVERRIDE, "<html>Return type is ''{0}'', which is not a subtype of overridden<br/>" +
|
MAP.put(RETURN_TYPE_MISMATCH_ON_OVERRIDE, "<html>Return type is ''{0}'', which is not a subtype of overridden<br/>" +
|
||||||
"{1}</html>", HTML_RENDER_RETURN_TYPE, DescriptorRenderer.HTML);
|
"{1}</html>", HTML_RENDER_RETURN_TYPE, DescriptorRenderer.HTML);
|
||||||
|
MAP.put(RETURN_TYPE_MISMATCH_ON_INHERITANCE, "<html>Return types of inherited members are incompatible:<br/>{0},<br/>{1}</html>",
|
||||||
|
DescriptorRenderer.HTML, DescriptorRenderer.HTML);
|
||||||
|
|
||||||
MAP.put(PROPERTY_TYPE_MISMATCH_ON_OVERRIDE, "<html>Var-property type is ''{0}'', which is not a type of overridden<br/>" +
|
MAP.put(PROPERTY_TYPE_MISMATCH_ON_OVERRIDE, "<html>Var-property type is ''{0}'', which is not a type of overridden<br/>" +
|
||||||
"{1}</html>", HTML_RENDER_RETURN_TYPE, DescriptorRenderer.HTML);
|
"{1}</html>", HTML_RENDER_RETURN_TYPE, DescriptorRenderer.HTML);
|
||||||
|
MAP.put(PROPERTY_TYPE_MISMATCH_ON_INHERITANCE, "<html>Property types of inherited members are incompatible:<br/>{0},<br/>{1}</html>",
|
||||||
|
DescriptorRenderer.HTML, DescriptorRenderer.HTML);
|
||||||
|
|
||||||
MAP.put(VAR_OVERRIDDEN_BY_VAL, "<html>Val-property cannot override var-property<br />" +
|
MAP.put(VAR_OVERRIDDEN_BY_VAL, "<html>Val-property cannot override var-property<br />" +
|
||||||
"{1}</html>", DescriptorRenderer.HTML, DescriptorRenderer.HTML);
|
"{1}</html>", DescriptorRenderer.HTML, DescriptorRenderer.HTML);
|
||||||
|
|||||||
Reference in New Issue
Block a user