Support platformStatic members in companion object of enums
#KT-7777 Fixed
This commit is contained in:
+8
-5
@@ -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.load.kotlin.nativeDeclarations.NativeFunChecker
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.psi.*
|
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.hasInlineAnnotation
|
||||||
import org.jetbrains.kotlin.resolve.annotations.hasIntrinsicAnnotation
|
import org.jetbrains.kotlin.resolve.annotations.hasIntrinsicAnnotation
|
||||||
import org.jetbrains.kotlin.resolve.annotations.hasPlatformStaticAnnotation
|
import org.jetbrains.kotlin.resolve.annotations.hasPlatformStaticAnnotation
|
||||||
@@ -95,11 +98,11 @@ public class PlatformStaticAnnotationChecker : DeclarationChecker {
|
|||||||
val container = descriptor.getContainingDeclaration()
|
val container = descriptor.getContainingDeclaration()
|
||||||
val insideObject = container != null && DescriptorUtils.isNonCompanionObject(container)
|
val insideObject = container != null && DescriptorUtils.isNonCompanionObject(container)
|
||||||
val insideCompanionObjectInClass =
|
val insideCompanionObjectInClass =
|
||||||
container != null && DescriptorUtils.isCompanionObject(container) && DescriptorUtils.isClass(container.getContainingDeclaration())
|
container != null && DescriptorUtils.isCompanionObject(container) &&
|
||||||
container != null && DescriptorUtils.isCompanionObject(container) && DescriptorUtils.isClass(container.getContainingDeclaration())
|
container.getContainingDeclaration().let { DescriptorUtils.isClass(it) || DescriptorUtils.isEnumClass(it) }
|
||||||
|
|
||||||
if (!insideObject && !insideCompanionObjectInClass) {
|
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) {
|
val checkDeclaration = when(declaration) {
|
||||||
@@ -108,7 +111,7 @@ public class PlatformStaticAnnotationChecker : DeclarationChecker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (insideObject && checkDeclaration.getModifierList()?.hasModifier(JetTokens.OVERRIDE_KEYWORD) == true) {
|
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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,12 +16,11 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.resolve.annotations
|
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.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.PropertyAccessorDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
import org.jetbrains.kotlin.name.FqName
|
||||||
|
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||||
|
|
||||||
public fun DeclarationDescriptor.hasInlineAnnotation(): Boolean {
|
public fun DeclarationDescriptor.hasInlineAnnotation(): Boolean {
|
||||||
return getAnnotations().findAnnotation(FqName("kotlin.inline")) != null
|
return getAnnotations().findAnnotation(FqName("kotlin.inline")) != null
|
||||||
@@ -36,7 +35,7 @@ public fun DeclarationDescriptor.hasIntrinsicAnnotation(): Boolean {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public fun CallableDescriptor.isPlatformStaticInObjectOrClass(): 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 =
|
public fun CallableDescriptor.isPlatformStaticInCompanionObject(): Boolean =
|
||||||
isPlatformStaticIn { DescriptorUtils.isCompanionObject(it) }
|
isPlatformStaticIn { DescriptorUtils.isCompanionObject(it) }
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
+19
@@ -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"
|
||||||
|
}
|
||||||
+6
@@ -173,6 +173,12 @@ public class BlackBoxWithJavaCodegenTestGenerated extends AbstractBlackBoxCodege
|
|||||||
doTestWithJava(fileName);
|
doTestWithJava(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("enumCompanion")
|
||||||
|
public void testEnumCompanion() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithJava/platformStatic/enumCompanion/");
|
||||||
|
doTestWithJava(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("object")
|
@TestMetadata("object")
|
||||||
public void testObject() throws Exception {
|
public void testObject() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithJava/platformStatic/object/");
|
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithJava/platformStatic/object/");
|
||||||
|
|||||||
Reference in New Issue
Block a user