diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/declarationCheckers.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/declarationCheckers.kt index 89d8adcb54f..cead9374ef9 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/declarationCheckers.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/declarationCheckers.kt @@ -90,7 +90,7 @@ class JvmStaticChecker(jvmTarget: JvmTarget, languageVersionSettings: LanguageVe supportJvmStaticInInterface && descriptor is DeclarationDescriptorWithVisibility ) { - checkVisibility(descriptor, diagnosticHolder, declaration) + checkForInterface(descriptor, diagnosticHolder, declaration) if (isLessJVM18) { diagnosticHolder.report(ErrorsJvm.JVM_STATIC_IN_INTERFACE_1_6.on(declaration)) } @@ -116,15 +116,18 @@ class JvmStaticChecker(jvmTarget: JvmTarget, languageVersionSettings: LanguageVe } } - private fun checkVisibility( + private fun checkForInterface( descriptor: DeclarationDescriptorWithVisibility, diagnosticHolder: DiagnosticSink, declaration: KtDeclaration ) { if (descriptor.visibility != DescriptorVisibilities.PUBLIC) { diagnosticHolder.report(ErrorsJvm.JVM_STATIC_ON_NON_PUBLIC_MEMBER.on(declaration)) + } else if (descriptor is MemberDescriptor && descriptor.isExternal) { + diagnosticHolder.report(ErrorsJvm.JVM_STATIC_ON_EXTERNAL_IN_INTERFACE.on(declaration)) } else if (descriptor is PropertyDescriptor) { - descriptor.setter?.let { checkVisibility(it, diagnosticHolder, declaration) } + descriptor.getter?.let { checkForInterface(it, diagnosticHolder, declaration) } + descriptor.setter?.let { checkForInterface(it, diagnosticHolder, declaration) } } } } diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/DefaultErrorMessagesJvm.java b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/DefaultErrorMessagesJvm.java index 8bb3120bfe1..2baaa249995 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/DefaultErrorMessagesJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/DefaultErrorMessagesJvm.java @@ -45,6 +45,7 @@ public class DefaultErrorMessagesJvm implements DefaultErrorMessages.Extension { MAP.put(JVM_STATIC_ON_NON_PUBLIC_MEMBER, "Only public members in interface companion objects can be annotated with '@JvmStatic'"); MAP.put(JVM_STATIC_IN_INTERFACE_1_6, "'@JvmStatic' annotation in interface supported only with JVM target 1.8 and above. Recompile with '-jvm-target 1.8'\""); MAP.put(JVM_STATIC_ON_CONST_OR_JVM_FIELD, "'@JvmStatic' annotation is useless for const or '@JvmField' properties"); + MAP.put(JVM_STATIC_ON_EXTERNAL_IN_INTERFACE, "'@JvmStatic' annotation cannot be used on 'external' members of interface companions"); MAP.put(OVERRIDE_CANNOT_BE_STATIC, "Override member cannot be '@JvmStatic' in object"); MAP.put(OVERLOADS_WITHOUT_DEFAULT_ARGUMENTS, "'@JvmOverloads' annotation has no effect for methods without default arguments"); MAP.put(OVERLOADS_ABSTRACT, "'@JvmOverloads' annotation cannot be used on abstract methods"); diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java index ad1035efe14..981d7fb996e 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java @@ -34,6 +34,7 @@ public interface ErrorsJvm { DiagnosticFactory0 JVM_STATIC_ON_NON_PUBLIC_MEMBER = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE); DiagnosticFactory0 JVM_STATIC_IN_INTERFACE_1_6 = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE); DiagnosticFactory0 JVM_STATIC_ON_CONST_OR_JVM_FIELD = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE); + DiagnosticFactory0 JVM_STATIC_ON_EXTERNAL_IN_INTERFACE = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE); DiagnosticFactory0 INAPPLICABLE_JVM_NAME = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 ILLEGAL_JVM_NAME = DiagnosticFactory0.create(ERROR); diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/interfaceCompanion_LL12.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/interfaceCompanion_LL12.fir.kt index a62b3c83176..d2b5a849d1c 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/interfaceCompanion_LL12.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/interfaceCompanion_LL12.fir.kt @@ -18,6 +18,8 @@ interface B { } + @JvmStatic external fun a5() + @JvmStatic var foo = 1 @@ -49,6 +51,11 @@ interface B { public var foo9 = 1 @JvmStatic private set + + @JvmStatic + val foo10: Int external get + + val foo11: Int @JvmStatic external get } } \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/interfaceCompanion_LL12.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/interfaceCompanion_LL12.kt index 503136d19e3..0a34635df19 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/interfaceCompanion_LL12.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/interfaceCompanion_LL12.kt @@ -18,6 +18,8 @@ interface B { } + @JvmStatic external fun a5() + @JvmStatic var foo = 1 @@ -49,6 +51,11 @@ interface B { public var foo9 = 1 @JvmStatic private set + + @JvmStatic + val foo10: Int external get + + val foo11: Int @JvmStatic external get } } \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/interfaceCompanion_LL12.txt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/interfaceCompanion_LL12.txt index 62ed049e764..86a98c44c1f 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/interfaceCompanion_LL12.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/interfaceCompanion_LL12.txt @@ -9,6 +9,8 @@ public interface B { private constructor Companion() @kotlin.jvm.JvmStatic public final var foo: kotlin.Int @kotlin.jvm.JvmStatic public final var foo1: kotlin.Int + @kotlin.jvm.JvmStatic public final val foo10: kotlin.Int + @get:kotlin.jvm.JvmStatic public final val foo11: kotlin.Int @kotlin.jvm.JvmStatic public final var foo2: kotlin.Int @kotlin.jvm.JvmStatic private final var foo3: kotlin.Int @kotlin.jvm.JvmStatic protected final var foo4: kotlin.Int @@ -21,6 +23,7 @@ public interface B { @kotlin.jvm.JvmStatic private final fun a2(): kotlin.Unit @kotlin.jvm.JvmStatic protected final fun a3(): kotlin.Unit @kotlin.jvm.JvmStatic internal final fun a4(): kotlin.Unit + @kotlin.jvm.JvmStatic public final external fun a5(): kotlin.Unit 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 diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/interfaceCompanion_LL13_16.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/interfaceCompanion_LL13_16.fir.kt index 20754cb4c63..77eac3f4956 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/interfaceCompanion_LL13_16.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/interfaceCompanion_LL13_16.fir.kt @@ -20,6 +20,8 @@ interface B { } + @JvmStatic external fun a5() + @JvmStatic var foo = 1 @@ -52,6 +54,10 @@ interface B { public var foo9 = 1 @JvmStatic private set + @JvmStatic + val foo10: Int external get + + val foo11: Int @JvmStatic external get } } \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/interfaceCompanion_LL13_16.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/interfaceCompanion_LL13_16.kt index a0837b30a80..64349cf25d8 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/interfaceCompanion_LL13_16.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/interfaceCompanion_LL13_16.kt @@ -20,6 +20,8 @@ interface B { } + @JvmStatic external fun a5() + @JvmStatic var foo = 1 @@ -52,6 +54,10 @@ interface B { public var foo9 = 1 @JvmStatic private set + @JvmStatic + val foo10: Int external get + + val foo11: Int @JvmStatic external get } } \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/interfaceCompanion_LL13_16.txt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/interfaceCompanion_LL13_16.txt index 62ed049e764..86a98c44c1f 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/interfaceCompanion_LL13_16.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/interfaceCompanion_LL13_16.txt @@ -9,6 +9,8 @@ public interface B { private constructor Companion() @kotlin.jvm.JvmStatic public final var foo: kotlin.Int @kotlin.jvm.JvmStatic public final var foo1: kotlin.Int + @kotlin.jvm.JvmStatic public final val foo10: kotlin.Int + @get:kotlin.jvm.JvmStatic public final val foo11: kotlin.Int @kotlin.jvm.JvmStatic public final var foo2: kotlin.Int @kotlin.jvm.JvmStatic private final var foo3: kotlin.Int @kotlin.jvm.JvmStatic protected final var foo4: kotlin.Int @@ -21,6 +23,7 @@ public interface B { @kotlin.jvm.JvmStatic private final fun a2(): kotlin.Unit @kotlin.jvm.JvmStatic protected final fun a3(): kotlin.Unit @kotlin.jvm.JvmStatic internal final fun a4(): kotlin.Unit + @kotlin.jvm.JvmStatic public final external fun a5(): kotlin.Unit 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 diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/interfaceCompanion_LL13_18.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/interfaceCompanion_LL13_18.fir.kt index 0d49e751ca8..ac24d902e02 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/interfaceCompanion_LL13_18.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/interfaceCompanion_LL13_18.fir.kt @@ -19,6 +19,8 @@ interface B { } + @JvmStatic external fun a5() + @JvmStatic var foo = 1 @@ -51,6 +53,10 @@ interface B { public var foo9 = 1 @JvmStatic private set + @JvmStatic + val foo10: Int external get + + val foo11: Int @JvmStatic external get } } \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/interfaceCompanion_LL13_18.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/interfaceCompanion_LL13_18.kt index c2698dda517..7ab07071503 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/interfaceCompanion_LL13_18.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/interfaceCompanion_LL13_18.kt @@ -19,6 +19,8 @@ interface B { } + @JvmStatic external fun a5() + @JvmStatic var foo = 1 @@ -51,6 +53,10 @@ interface B { public var foo9 = 1 @JvmStatic private set + @JvmStatic + val foo10: Int external get + + val foo11: Int @JvmStatic external get } } \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/interfaceCompanion_LL13_18.txt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/interfaceCompanion_LL13_18.txt index 62ed049e764..86a98c44c1f 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/interfaceCompanion_LL13_18.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/interfaceCompanion_LL13_18.txt @@ -9,6 +9,8 @@ public interface B { private constructor Companion() @kotlin.jvm.JvmStatic public final var foo: kotlin.Int @kotlin.jvm.JvmStatic public final var foo1: kotlin.Int + @kotlin.jvm.JvmStatic public final val foo10: kotlin.Int + @get:kotlin.jvm.JvmStatic public final val foo11: kotlin.Int @kotlin.jvm.JvmStatic public final var foo2: kotlin.Int @kotlin.jvm.JvmStatic private final var foo3: kotlin.Int @kotlin.jvm.JvmStatic protected final var foo4: kotlin.Int @@ -21,6 +23,7 @@ public interface B { @kotlin.jvm.JvmStatic private final fun a2(): kotlin.Unit @kotlin.jvm.JvmStatic protected final fun a3(): kotlin.Unit @kotlin.jvm.JvmStatic internal final fun a4(): kotlin.Unit + @kotlin.jvm.JvmStatic public final external fun a5(): kotlin.Unit 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