JVM_IR: Generate private suspend functions as synthetic package-private
Do not generate accessors for them. #KT-37086 Fixed
This commit is contained in:
+3
-1
@@ -173,7 +173,9 @@ open class FunctionCodegen(
|
|||||||
}
|
}
|
||||||
val nativeFlag = if (irFunction.isExternal) Opcodes.ACC_NATIVE else 0
|
val nativeFlag = if (irFunction.isExternal) Opcodes.ACC_NATIVE else 0
|
||||||
val syntheticFlag =
|
val syntheticFlag =
|
||||||
if (irFunction.origin.isSynthetic || irFunction.hasAnnotation(JVM_SYNTHETIC_ANNOTATION_FQ_NAME)) Opcodes.ACC_SYNTHETIC
|
if (irFunction.origin.isSynthetic || irFunction.hasAnnotation(JVM_SYNTHETIC_ANNOTATION_FQ_NAME) ||
|
||||||
|
(irFunction.isSuspend && irFunction.visibility == Visibilities.PRIVATE && !irFunction.isInline)
|
||||||
|
) Opcodes.ACC_SYNTHETIC
|
||||||
else 0
|
else 0
|
||||||
val strictFpFlag = if (irFunction.hasAnnotation(STRICTFP_ANNOTATION_FQ_NAME)) Opcodes.ACC_STRICT else 0
|
val strictFpFlag = if (irFunction.hasAnnotation(STRICTFP_ANNOTATION_FQ_NAME)) Opcodes.ACC_STRICT else 0
|
||||||
val synchronizedFlag = if (irFunction.hasAnnotation(SYNCHRONIZED_ANNOTATION_FQ_NAME)) Opcodes.ACC_SYNCHRONIZED else 0
|
val synchronizedFlag = if (irFunction.hasAnnotation(SYNCHRONIZED_ANNOTATION_FQ_NAME)) Opcodes.ACC_SYNCHRONIZED else 0
|
||||||
|
|||||||
+2
@@ -576,6 +576,8 @@ internal class SyntheticAccessorLowering(val context: JvmBackendContext) : IrEle
|
|||||||
((thisObjReference == null || contextDeclarationContainer.symbol.isSubtypeOfClass(thisObjReference)) &&
|
((thisObjReference == null || contextDeclarationContainer.symbol.isSubtypeOfClass(thisObjReference)) &&
|
||||||
(contextDeclarationContainer.isSubclassOf(symbolDeclarationContainer)))
|
(contextDeclarationContainer.isSubclassOf(symbolDeclarationContainer)))
|
||||||
return when {
|
return when {
|
||||||
|
// private suspend functions are generated as synthetic package private
|
||||||
|
declaration is IrFunction && declaration.isSuspend && declaration.visibility.isPrivate && samePackage -> true
|
||||||
declaration.visibility.isPrivate && symbolDeclarationContainer != contextDeclarationContainer -> false
|
declaration.visibility.isPrivate && symbolDeclarationContainer != contextDeclarationContainer -> false
|
||||||
declaration.visibility.isProtected && !samePackage && !fromSubclassOfReceiversClass -> false
|
declaration.visibility.isProtected && !samePackage && !fromSubclassOfReceiversClass -> false
|
||||||
withSuper && !fromSubclassOfReceiversClass -> false
|
withSuper && !fromSubclassOfReceiversClass -> false
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// TODO: KT-37086
|
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
// COMMON_COROUTINES_TEST
|
// COMMON_COROUTINES_TEST
|
||||||
import COROUTINES_PACKAGE.*
|
import COROUTINES_PACKAGE.*
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
@kotlin.Metadata
|
||||||
|
public final class PrivateAccessorKt {
|
||||||
|
public synthetic final static method access$foo(): void
|
||||||
|
synthetic final static method bar(p0: kotlin.coroutines.Continuation): java.lang.Object
|
||||||
|
private final static method foo(): void
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user