Move `ReflectiveAccessLowering` in the very end of the lowerings list
diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/JvmLoweringPhases.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/JvmLoweringPhases.kt index 281b56d..acfd5c0 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/JvmLoweringPhases.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/JvmLoweringPhases.kt
@@ -78,7 +78,6 @@ ::JvmDefaultParameterCleaner, ::FragmentLocalFunctionPatchLowering, - ::ReflectiveAccessLowering, ::InterfaceLowering, ::InheritedDefaultMethodsOnClassesLowering, @@ -122,6 +121,8 @@ ::RenameFieldsLowering, ::FakeLocalVariablesForBytecodeInlinerLowering, ::FakeLocalVariablesForIrInlinerLowering, + + ::ReflectiveAccessLowering, ) val jvmLoweringPhases = SameTypeNamedCompilerPhase(
diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt index 9399c23..c8774a3 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.backend.jvm.ir.findInlineCallSites import org.jetbrains.kotlin.backend.jvm.ir.isAssertionsDisabledField import org.jetbrains.kotlin.backend.jvm.ir.receiverAndArgs +import org.jetbrains.kotlin.backend.jvm.lower.SyntheticAccessorLowering.Companion.isAccessible import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.ir.IrStatement @@ -163,6 +164,8 @@ } val accessor = when { + shouldGenerateReflectiveAccess(expression, withSuper) -> + return super.visitFunctionAccess(expression) callee is IrConstructor && accessorGenerator.isOrShouldBeHiddenAsSealedClassConstructor(callee) -> accessorGenerator.getSyntheticConstructorOfSealedClass(callee).symbol callee is IrConstructor && accessorGenerator.isOrShouldBeHiddenSinceHasMangledParams(callee) -> @@ -176,6 +179,21 @@ return super.visitExpression(modifyFunctionAccessExpression(expression, accessor)) } + private fun shouldGenerateReflectiveAccess(expression: IrFunctionAccessExpression, withSuper: Boolean) = + when { + context.evaluatorData == null -> false + expression is IrCall -> !expression.symbol.isAccessibleWithoutReflection(withSuper) + expression is IrConstructorCall -> !expression.symbol.isAccessibleWithoutReflection(false) + else -> false + } + + private fun shouldGenerateReflectiveAccess(symbol: IrSymbol): Boolean { + return context.evaluatorData != null && !symbol.isAccessibleWithoutReflection(withSuper = false) + } + + private fun IrSymbol.isAccessibleWithoutReflection(withSuper: Boolean) = + isAccessible(context, currentScope, inlineScopeResolver, withSuper, null, fromOtherClassLoader = true) + private fun handleLambdaMetafactoryIntrinsic(call: IrCall, thisSymbol: IrClassSymbol?): IrExpression { val implFunRef = call.getValueArgument(1) as? IrFunctionReference ?: throw AssertionError("'implMethodReference' is expected to be 'IrFunctionReference': ${call.dump()}") @@ -239,6 +257,10 @@ return super.visitExpression(expression) } + if (shouldGenerateReflectiveAccess(expression.symbol)) { + return super.visitExpression(expression) + } + return super.visitExpression( modifyGetterExpression( expression, accessorGenerator.getSyntheticGetter(expression, allScopes).save() @@ -255,6 +277,10 @@ return super.visitExpression(expression) } + if (shouldGenerateReflectiveAccess(expression.symbol)) { + return super.visitExpression(expression) + } + val dispatchReceiverType = expression.receiver?.type val dispatchReceiverClassSymbol = dispatchReceiverType?.classifierOrNull as? IrClassSymbol if (expression.symbol.isAccessible(false, dispatchReceiverClassSymbol)) {