diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmStaticInPrivateCompanionChecker.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmStaticInPrivateCompanionChecker.kt index e08d7f0ecae..9eeb7b44d48 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmStaticInPrivateCompanionChecker.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmStaticInPrivateCompanionChecker.kt @@ -18,14 +18,16 @@ import org.jetbrains.kotlin.utils.addToStdlib.safeAs class JvmStaticInPrivateCompanionChecker : DeclarationChecker { override fun check(declaration: KtDeclaration, descriptor: DeclarationDescriptor, context: DeclarationCheckerContext) { + val containingDeclaration = descriptor.containingDeclaration - descriptor.containingDeclaration.safeAs()?.takeIf { - it.isCompanionObject && Visibilities.isPrivate(it.visibility.delegate) - } ?: return + if (containingDeclaration !is ClassDescriptor + || !containingDeclaration.isCompanionObject + || !Visibilities.isPrivate(containingDeclaration.visibility.delegate) + ) return val jvmStaticAnnotation = descriptor.annotations.findAnnotation(JVM_STATIC_ANNOTATION_FQ_NAME) ?: return - val reportTarget = jvmStaticAnnotation.source.safeAs()?.psi ?: declaration + val reportTarget = jvmStaticAnnotation.source.safeAs()?.psi ?: return context.trace.report(JVM_STATIC_IN_PRIVATE_COMPANION.on(reportTarget)) } } \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/privateCompanionObject.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/privateCompanionObject.fir.kt index 4b6f9d5ae3b..e6dac1eb6b0 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/privateCompanionObject.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/privateCompanionObject.fir.kt @@ -26,4 +26,31 @@ class WithPrivateCompanion { @JvmStatic fun staticFunction() {} } -} \ No newline at end of file +} + +class WithPublicCompanion { + companion object { + @JvmStatic + val staticVal1: Int = 42 + + val staticVal2: Int + @JvmStatic get() = 42 + + @get:JvmStatic + val staticVal3: Int = 42 + + @JvmStatic + var staticVar1: Int = 42 + + var staticVar2: Int + @JvmStatic get() = 42 + @JvmStatic set(value) {} + + @get: JvmStatic + @set: JvmStatic + var staticVar3: Int = 42 + + @JvmStatic + fun staticFunction() {} + } +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/privateCompanionObject.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/privateCompanionObject.kt index 1c718ce215b..0adcfbf6b42 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/privateCompanionObject.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/privateCompanionObject.kt @@ -26,4 +26,31 @@ class WithPrivateCompanion { @JvmStatic fun staticFunction() {} } -} \ No newline at end of file +} + +class WithPublicCompanion { + companion object { + @JvmStatic + val staticVal1: Int = 42 + + val staticVal2: Int + @JvmStatic get() = 42 + + @get:JvmStatic + val staticVal3: Int = 42 + + @JvmStatic + var staticVar1: Int = 42 + + var staticVar2: Int + @JvmStatic get() = 42 + @JvmStatic set(value) {} + + @get: JvmStatic + @set: JvmStatic + var staticVar3: Int = 42 + + @JvmStatic + fun staticFunction() {} + } +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/privateCompanionObject.txt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/privateCompanionObject.txt index f6ceea5ca4d..c04308bf1bd 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/privateCompanionObject.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/privateCompanionObject.txt @@ -20,3 +20,24 @@ public final class WithPrivateCompanion { public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } } + +public final class WithPublicCompanion { + public constructor WithPublicCompanion() + 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 companion object Companion { + private constructor Companion() + @kotlin.jvm.JvmStatic public final val staticVal1: kotlin.Int = 42 + @get:kotlin.jvm.JvmStatic public final val staticVal2: kotlin.Int + @get:kotlin.jvm.JvmStatic public final val staticVal3: kotlin.Int = 42 + @kotlin.jvm.JvmStatic public final var staticVar1: kotlin.Int + @get:kotlin.jvm.JvmStatic @set:kotlin.jvm.JvmStatic public final var staticVar2: kotlin.Int + @get:kotlin.jvm.JvmStatic @set:kotlin.jvm.JvmStatic public final var staticVar3: 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 + @kotlin.jvm.JvmStatic public final fun staticFunction(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +}