Support platformStatic members in companion object of enums

#KT-7777 Fixed
This commit is contained in:
Alexander Udalov
2015-05-19 15:49:06 +03:00
parent e1b367bd65
commit 189286efee
5 changed files with 54 additions and 10 deletions
@@ -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();
}
}
@@ -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"
}
@@ -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/");