Support accessors for private methods for default methods

This commit is contained in:
Mikhail Bogdanov
2020-03-27 17:14:01 +01:00
parent 7bcbae9826
commit 93b915c77a
12 changed files with 294 additions and 2 deletions
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.codegen.*;
import org.jetbrains.kotlin.codegen.binding.MutableClosure;
import org.jetbrains.kotlin.codegen.state.GenerationState;
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper;
import org.jetbrains.kotlin.config.JvmDefaultMode;
import org.jetbrains.kotlin.descriptors.*;
import org.jetbrains.kotlin.load.java.JavaVisibilities;
import org.jetbrains.kotlin.load.java.sam.SamConstructorDescriptor;
@@ -651,7 +652,10 @@ public abstract class CodegenContext<T extends DeclarationDescriptor> {
return descriptor;
}
if (JvmAnnotationUtilKt.isCompiledToJvmDefaultIfNoAbstract(descriptor, getState().getJvmDefaultMode()) && descriptorContext instanceof DefaultImplsClassContext) {
//in other default modes there shouldn't be any accessors form DefaultImpls to Interface cause all compiled inside interface
if (getState().getJvmDefaultMode() == JvmDefaultMode.ENABLE &&
JvmAnnotationUtilKt.hasJvmDefaultAnnotation(descriptor) &&
descriptorContext instanceof DefaultImplsClassContext) {
descriptorContext = ((DefaultImplsClassContext) descriptorContext).getInterfaceContext();
}
@@ -456,7 +456,9 @@ class KotlinTypeMapper @JvmOverloads constructor(
if (isInterface && (superCall || descriptor.visibility == Visibilities.PRIVATE || isAccessor(descriptor))) {
thisClass = mapClass(functionParent)
dispatchReceiverKotlinType = functionParent.defaultType
if (declarationOwner is JavaClassDescriptor || declarationFunctionDescriptor.isCompiledToJvmDefaultIfNoAbstract(jvmDefaultMode)) {
if (declarationOwner is JavaClassDescriptor ||
(declarationFunctionDescriptor.isCompiledToJvmDefaultIfNoAbstract(jvmDefaultMode) && !isAccessor(descriptor))
) {
invokeOpcode = INVOKESPECIAL
signature = mapSignatureSkipGeneric(functionDescriptor)
returnKotlinType = functionDescriptor.returnType