diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/KotlinJvmCheckerProvider.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/KotlinJvmCheckerProvider.kt index 0674588273e..870e0933584 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/KotlinJvmCheckerProvider.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/KotlinJvmCheckerProvider.kt @@ -25,7 +25,10 @@ import org.jetbrains.kotlin.load.java.lazy.types.isMarkedNullable import org.jetbrains.kotlin.load.kotlin.nativeDeclarations.NativeFunChecker import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.resolve.* +import org.jetbrains.kotlin.resolve.AdditionalCheckerProvider +import org.jetbrains.kotlin.resolve.DeclarationChecker +import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils +import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.annotations.hasInlineAnnotation import org.jetbrains.kotlin.resolve.annotations.hasIntrinsicAnnotation import org.jetbrains.kotlin.resolve.annotations.hasPlatformStaticAnnotation @@ -95,11 +98,11 @@ public class PlatformStaticAnnotationChecker : DeclarationChecker { val container = descriptor.getContainingDeclaration() val insideObject = container != null && DescriptorUtils.isNonCompanionObject(container) val insideCompanionObjectInClass = - container != null && DescriptorUtils.isCompanionObject(container) && DescriptorUtils.isClass(container.getContainingDeclaration()) - container != null && DescriptorUtils.isCompanionObject(container) && DescriptorUtils.isClass(container.getContainingDeclaration()) + container != null && DescriptorUtils.isCompanionObject(container) && + container.getContainingDeclaration().let { DescriptorUtils.isClass(it) || DescriptorUtils.isEnumClass(it) } if (!insideObject && !insideCompanionObjectInClass) { - diagnosticHolder.report(ErrorsJvm.PLATFORM_STATIC_NOT_IN_OBJECT.on(declaration)); + diagnosticHolder.report(ErrorsJvm.PLATFORM_STATIC_NOT_IN_OBJECT.on(declaration)) } val checkDeclaration = when(declaration) { @@ -108,7 +111,7 @@ public class PlatformStaticAnnotationChecker : DeclarationChecker { } if (insideObject && checkDeclaration.getModifierList()?.hasModifier(JetTokens.OVERRIDE_KEYWORD) == true) { - diagnosticHolder.report(ErrorsJvm.OVERRIDE_CANNOT_BE_STATIC.on(declaration)); + diagnosticHolder.report(ErrorsJvm.OVERRIDE_CANNOT_BE_STATIC.on(declaration)) } } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationUtil.kt index c889eef15f8..ee88fa73598 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationUtil.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationUtil.kt @@ -16,12 +16,11 @@ package org.jetbrains.kotlin.resolve.annotations -import org.jetbrains.kotlin.descriptors.DeclarationDescriptor -import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.descriptors.CallableDescriptor -import org.jetbrains.kotlin.resolve.DescriptorUtils +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.PropertyAccessorDescriptor -import org.jetbrains.kotlin.descriptors.ClassKind +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.resolve.DescriptorUtils public fun DeclarationDescriptor.hasInlineAnnotation(): Boolean { return getAnnotations().findAnnotation(FqName("kotlin.inline")) != null @@ -36,7 +35,7 @@ public fun DeclarationDescriptor.hasIntrinsicAnnotation(): Boolean { } public fun CallableDescriptor.isPlatformStaticInObjectOrClass(): Boolean = - isPlatformStaticIn { DescriptorUtils.isNonCompanionObject(it) || DescriptorUtils.isClass(it) } + isPlatformStaticIn { DescriptorUtils.isNonCompanionObject(it) || DescriptorUtils.isClass(it) || DescriptorUtils.isEnumClass(it) } public fun CallableDescriptor.isPlatformStaticInCompanionObject(): Boolean = isPlatformStaticIn { DescriptorUtils.isCompanionObject(it) } diff --git a/compiler/testData/codegen/boxWithJava/platformStatic/enumCompanion/Test.java b/compiler/testData/codegen/boxWithJava/platformStatic/enumCompanion/Test.java new file mode 100644 index 00000000000..8c566c76827 --- /dev/null +++ b/compiler/testData/codegen/boxWithJava/platformStatic/enumCompanion/Test.java @@ -0,0 +1,17 @@ +class Test { + public static String foo() { + return A.foo; + } + + public static String bar() { + return A.bar; + } + + public static String getBar() { + return A.getBar(); + } + + public static String baz() { + return A.baz(); + } +} diff --git a/compiler/testData/codegen/boxWithJava/platformStatic/enumCompanion/enumCompanionObject.kt b/compiler/testData/codegen/boxWithJava/platformStatic/enumCompanion/enumCompanionObject.kt new file mode 100644 index 00000000000..a3205d3e732 --- /dev/null +++ b/compiler/testData/codegen/boxWithJava/platformStatic/enumCompanion/enumCompanionObject.kt @@ -0,0 +1,19 @@ +import kotlin.platform.platformStatic + +enum class A { + companion object { + val foo: String = "OK" + + platformStatic val bar: String = "OK" + + platformStatic fun baz() = foo + } +} + +fun box(): String { + if (Test.foo() != "OK") return "Fail foo" + if (Test.bar() != "OK") return "Fail bar" + if (Test.getBar() != "OK") return "Fail getBar" + if (Test.baz() != "OK") return "Fail baz" + return "OK" +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java index 97d6ab11fe0..579b41c3121 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java @@ -173,6 +173,12 @@ public class BlackBoxWithJavaCodegenTestGenerated extends AbstractBlackBoxCodege doTestWithJava(fileName); } + @TestMetadata("enumCompanion") + public void testEnumCompanion() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithJava/platformStatic/enumCompanion/"); + doTestWithJava(fileName); + } + @TestMetadata("object") public void testObject() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithJava/platformStatic/object/");