Fix for KT-11034: Private set with @JvmStatic lateinit var doesn't compile
#KT-11034 Fixed
This commit is contained in:
@@ -188,7 +188,7 @@ public class FunctionCodegen {
|
|||||||
boolean staticInCompanionObject = AnnotationUtilKt.isPlatformStaticInCompanionObject(functionDescriptor);
|
boolean staticInCompanionObject = AnnotationUtilKt.isPlatformStaticInCompanionObject(functionDescriptor);
|
||||||
if (staticInCompanionObject) {
|
if (staticInCompanionObject) {
|
||||||
ImplementationBodyCodegen parentBodyCodegen = (ImplementationBodyCodegen) memberCodegen.getParentCodegen();
|
ImplementationBodyCodegen parentBodyCodegen = (ImplementationBodyCodegen) memberCodegen.getParentCodegen();
|
||||||
parentBodyCodegen.addAdditionalTask(new JvmStaticGenerator(functionDescriptor, origin, state));
|
parentBodyCodegen.addAdditionalTask(new JvmStaticGenerator(functionDescriptor, origin, state, parentBodyCodegen));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state.getClassBuilderMode() == ClassBuilderMode.LIGHT_CLASSES || isAbstractMethod(functionDescriptor, contextKind)) {
|
if (state.getClassBuilderMode() == ClassBuilderMode.LIGHT_CLASSES || isAbstractMethod(functionDescriptor, contextKind)) {
|
||||||
|
|||||||
@@ -17,26 +17,25 @@
|
|||||||
package org.jetbrains.kotlin.codegen
|
package org.jetbrains.kotlin.codegen
|
||||||
|
|
||||||
import org.jetbrains.kotlin.backend.common.CodegenUtil
|
import org.jetbrains.kotlin.backend.common.CodegenUtil
|
||||||
import org.jetbrains.kotlin.codegen.context.MethodContext
|
|
||||||
import org.jetbrains.kotlin.codegen.state.GenerationState
|
import org.jetbrains.kotlin.codegen.state.GenerationState
|
||||||
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
|
||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
|
||||||
import org.jetbrains.kotlin.descriptors.PropertyAccessorDescriptor
|
|
||||||
import org.jetbrains.kotlin.psi.KtNamedFunction
|
import org.jetbrains.kotlin.psi.KtNamedFunction
|
||||||
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin
|
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin
|
||||||
import org.jetbrains.kotlin.resolve.jvm.diagnostics.Synthetic
|
import org.jetbrains.kotlin.resolve.jvm.diagnostics.Synthetic
|
||||||
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature
|
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature
|
||||||
import org.jetbrains.org.objectweb.asm.MethodVisitor
|
|
||||||
import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter
|
|
||||||
|
|
||||||
class JvmStaticGenerator(
|
class JvmStaticGenerator(
|
||||||
val descriptor: FunctionDescriptor,
|
val descriptor: FunctionDescriptor,
|
||||||
val declarationOrigin: JvmDeclarationOrigin,
|
val declarationOrigin: JvmDeclarationOrigin,
|
||||||
val state: GenerationState
|
val state: GenerationState,
|
||||||
|
parentBodyCodegen: ImplementationBodyCodegen
|
||||||
) : Function2<ImplementationBodyCodegen, ClassBuilder, Unit> {
|
) : Function2<ImplementationBodyCodegen, ClassBuilder, Unit> {
|
||||||
private val typeMapper = state.typeMapper
|
private val typeMapper = state.typeMapper
|
||||||
|
|
||||||
|
init {
|
||||||
|
parentBodyCodegen.getContext().accessibleDescriptor(JvmCodegenUtil.getDirectMember(descriptor), null)
|
||||||
|
}
|
||||||
|
|
||||||
override fun invoke(codegen: ImplementationBodyCodegen, classBuilder: ClassBuilder) {
|
override fun invoke(codegen: ImplementationBodyCodegen, classBuilder: ClassBuilder) {
|
||||||
val staticFunctionDescriptor = createStaticFunctionDescriptor(descriptor)
|
val staticFunctionDescriptor = createStaticFunctionDescriptor(descriptor)
|
||||||
|
|
||||||
@@ -44,15 +43,9 @@ class JvmStaticGenerator(
|
|||||||
codegen.functionCodegen.generateMethod(
|
codegen.functionCodegen.generateMethod(
|
||||||
Synthetic(originElement, staticFunctionDescriptor),
|
Synthetic(originElement, staticFunctionDescriptor),
|
||||||
staticFunctionDescriptor,
|
staticFunctionDescriptor,
|
||||||
object : FunctionGenerationStrategy() {
|
object : FunctionGenerationStrategy.CodegenBased<FunctionDescriptor>(state, descriptor) {
|
||||||
override fun generateBody(
|
override fun doGenerateBody(codegen: ExpressionCodegen, signature: JvmMethodSignature) {
|
||||||
mv: MethodVisitor,
|
val iv = codegen.v
|
||||||
frameMap: FrameMap,
|
|
||||||
signature: JvmMethodSignature,
|
|
||||||
context: MethodContext,
|
|
||||||
parentCodegen: MemberCodegen<*>
|
|
||||||
) {
|
|
||||||
val iv = InstructionAdapter(mv)
|
|
||||||
val classDescriptor = descriptor.containingDeclaration as ClassDescriptor
|
val classDescriptor = descriptor.containingDeclaration as ClassDescriptor
|
||||||
val singletonValue = StackValue.singleton(classDescriptor, typeMapper)
|
val singletonValue = StackValue.singleton(classDescriptor, typeMapper)
|
||||||
singletonValue.put(singletonValue.type, iv)
|
singletonValue.put(singletonValue.type, iv)
|
||||||
@@ -62,12 +55,22 @@ class JvmStaticGenerator(
|
|||||||
iv.load(index, paramType)
|
iv.load(index, paramType)
|
||||||
index += paramType.size
|
index += paramType.size
|
||||||
}
|
}
|
||||||
|
if (descriptor is PropertyAccessorDescriptor) {
|
||||||
val syntheticOrOriginalMethod = typeMapper.mapToCallableMethod(
|
val propertyValue = codegen.intermediateValueForProperty(descriptor.correspondingProperty, false, null, StackValue.none())
|
||||||
codegen.getContext().accessibleDescriptor(descriptor, /* superCallTarget = */ null),
|
if (callableDescriptor is PropertyGetterDescriptor) {
|
||||||
false
|
propertyValue.put(signature.returnType, iv)
|
||||||
)
|
}
|
||||||
syntheticOrOriginalMethod.genInvokeInstruction(iv)
|
else {
|
||||||
|
propertyValue.store(StackValue.onStack(propertyValue.type), iv, true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
val syntheticOrOriginalMethod = typeMapper.mapToCallableMethod(
|
||||||
|
codegen.context.accessibleDescriptor(descriptor, /* superCallTarget = */ null),
|
||||||
|
false
|
||||||
|
)
|
||||||
|
syntheticOrOriginalMethod.genInvokeInstruction(iv)
|
||||||
|
}
|
||||||
iv.areturn(asmMethod.returnType)
|
iv.areturn(asmMethod.returnType)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
// FILE: JavaClass.java
|
||||||
|
class JavaClass {
|
||||||
|
|
||||||
|
|
||||||
|
public static String test()
|
||||||
|
{
|
||||||
|
return TestApp.getValue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: Kotlin.kt
|
||||||
|
open class TestApp {
|
||||||
|
companion object {
|
||||||
|
@JvmStatic
|
||||||
|
var value: String = "OK"
|
||||||
|
private set
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
return JavaClass.test()
|
||||||
|
}
|
||||||
@@ -7510,6 +7510,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("privateSetter.kt")
|
||||||
|
public void testPrivateSetter() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/jvmStatic/privateSetter.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("propertyAccess.kt")
|
@TestMetadata("propertyAccess.kt")
|
||||||
public void testPropertyAccess() throws Exception {
|
public void testPropertyAccess() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/jvmStatic/propertyAccess.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/jvmStatic/propertyAccess.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user