JVM_IR: Generate private suspend functions as synthetic package-private

Do not generate accessors for them.
 #KT-37086 Fixed
This commit is contained in:
Ilmir Usmanov
2020-03-04 14:47:37 +01:00
parent 5826db97c7
commit f8903ca04b
4 changed files with 11 additions and 3 deletions

View File

@@ -173,7 +173,9 @@ open class FunctionCodegen(
}
val nativeFlag = if (irFunction.isExternal) Opcodes.ACC_NATIVE else 0
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
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

View File

@@ -576,6 +576,8 @@ internal class SyntheticAccessorLowering(val context: JvmBackendContext) : IrEle
((thisObjReference == null || contextDeclarationContainer.symbol.isSubtypeOfClass(thisObjReference)) &&
(contextDeclarationContainer.isSubclassOf(symbolDeclarationContainer)))
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.isProtected && !samePackage && !fromSubclassOfReceiversClass -> false
withSuper && !fromSubclassOfReceiversClass -> false

View File

@@ -1,5 +1,3 @@
// IGNORE_BACKEND: JVM_IR
// TODO: KT-37086
// WITH_RUNTIME
// COMMON_COROUTINES_TEST
import COROUTINES_PACKAGE.*

View File

@@ -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
}