Skip to content

Commit

Permalink
Proper check NON_JVM_DEFAULT_OVERRIDES_JAVA_DEFAULT in new jvm-defaul…
Browse files Browse the repository at this point in the history
…t modes

 #KT-42699 Fixed

(cherry picked from commit c8e84f8)
  • Loading branch information
Mikhael Bogdanov committed Oct 15, 2020
1 parent 43ee55b commit a9e0002
Show file tree
Hide file tree
Showing 8 changed files with 166 additions and 7 deletions.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ class JvmDefaultChecker(val jvmTarget: JvmTarget, project: Project) : Declaratio
}


if (isInterface(descriptor.containingDeclaration)) {
if (!jvmDefaultMode.forAllMethodsWithBody && isInterface(descriptor.containingDeclaration)) {
val memberDescriptor = descriptor as? CallableMemberDescriptor ?: return
if (descriptor is PropertyAccessorDescriptor) return

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ public class DefaultErrorMessagesJvm implements DefaultErrorMessages.Extension {
MAP.put(JVM_DEFAULT_IN_DECLARATION, "Usage of ''@{0}'' is only allowed with -Xjvm-default option", STRING);
MAP.put(JVM_DEFAULT_THROUGH_INHERITANCE, "Inheritance from an interface with '@JvmDefault' members is only allowed with -Xjvm-default option");
MAP.put(USAGE_OF_JVM_DEFAULT_THROUGH_SUPER_CALL, "Super calls of '@JvmDefault' members are only allowed with -Xjvm-default option");
MAP.put(NON_JVM_DEFAULT_OVERRIDES_JAVA_DEFAULT, "Non-@JvmDefault interface method cannot override default Java method. Please annotate this method with @JvmDefault");
MAP.put(NON_JVM_DEFAULT_OVERRIDES_JAVA_DEFAULT, "Non-@JvmDefault interface method cannot override default Java method. Please annotate this method with @JvmDefault or enable `-Xjvm-default=all|all-compatibility`");
MAP.put(EXPLICIT_METADATA_IS_DISALLOWED, "Explicit @Metadata is disallowed");
MAP.put(SUSPENSION_POINT_INSIDE_MONITOR, "A suspension point at {0} is inside a critical section", STRING);
MAP.put(SUSPENSION_POINT_INSIDE_CRITICAL_SECTION, "The ''{0}'' suspension point is inside a critical section", NAME);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
// FIR_IDENTICAL
// !JVM_DEFAULT_MODE: all
// !JVM_TARGET: 1.8

// FILE: JavaInterface.java
public interface JavaInterface {
default void test() {}

default void testForNonDefault() {}

void testAbstract();
}

// FILE: 1.kt

interface KotlinInterface : JavaInterface {
@JvmDefault
override fun test() {}

override fun testForNonDefault() {}

override fun testAbstract() {}
}

interface KotlinInterface2 : JavaInterface, KotlinInterface {
override fun test() {}

override fun testForNonDefault() {}

override fun testAbstract() {}
}


interface KotlinInterfaceForIndirect : JavaInterface {

}

interface KotlinInterfaceIndirectInheritance : KotlinInterfaceForIndirect {

override fun test() {}

override fun testForNonDefault() {}

override fun testAbstract() {}
}

open class KotlinClass : JavaInterface {
override fun test() {}

override fun testForNonDefault() {}

override fun testAbstract() {}
}

interface KotlinInterfaceX {

fun test() {}

fun testForNonDefault() {}

fun testAbstract() {}
}

interface KotlinInterfaceManySuper: JavaInterface, KotlinInterfaceX {
override fun test() {}

override fun testForNonDefault() {}

override fun testAbstract() {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package

public interface JavaInterface {
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 fun test(): kotlin.Unit
public abstract fun testAbstract(): kotlin.Unit
public open fun testForNonDefault(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}

public open class KotlinClass : JavaInterface {
public constructor KotlinClass()
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*/ fun test(): kotlin.Unit
public open override /*1*/ fun testAbstract(): kotlin.Unit
public open override /*1*/ fun testForNonDefault(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}

public interface KotlinInterface : JavaInterface {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
@kotlin.jvm.JvmDefault public open override /*1*/ fun test(): kotlin.Unit
public open override /*1*/ fun testAbstract(): kotlin.Unit
public open override /*1*/ fun testForNonDefault(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}

public interface KotlinInterface2 : JavaInterface, KotlinInterface {
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*/ fun test(): kotlin.Unit
public open override /*2*/ fun testAbstract(): kotlin.Unit
public open override /*2*/ fun testForNonDefault(): kotlin.Unit
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
}

public interface KotlinInterfaceForIndirect : JavaInterface {
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 test(): kotlin.Unit
public abstract override /*1*/ /*fake_override*/ fun testAbstract(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun testForNonDefault(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}

public interface KotlinInterfaceIndirectInheritance : KotlinInterfaceForIndirect {
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*/ fun test(): kotlin.Unit
public open override /*1*/ fun testAbstract(): kotlin.Unit
public open override /*1*/ fun testForNonDefault(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}

public interface KotlinInterfaceManySuper : JavaInterface, KotlinInterfaceX {
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*/ fun test(): kotlin.Unit
public open override /*2*/ fun testAbstract(): kotlin.Unit
public open override /*2*/ fun testForNonDefault(): kotlin.Unit
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
}

public interface KotlinInterfaceX {
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 fun test(): kotlin.Unit
public open fun testAbstract(): kotlin.Unit
public open fun testForNonDefault(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit a9e0002

Please sign in to comment.