From 0f33f82ffc38cc93034515ad0cea9b9729f74f5e Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Wed, 6 Sep 2023 17:22:43 +0900 Subject: [PATCH] [LL API] Fix reflective patching for field accesses Implement the same behavior as in K1 evaluator. Also see 'IRFragmentCompilerCodegen#codegenFactory' in the IntelliJ project. The commit fixes the following failing tests in the IntelliJ project: - K2IdeK2CodeKotlinEvaluateExpressionTestGenerated$SingleBreakpoint$CompilingEvaluator$InaccessibleMembers.testPrivateAnnotationCompanionValue - K2IdeK2CodeKotlinEvaluateExpressionTestGenerated$SingleBreakpoint$CompilingEvaluator$InaccessibleMembers.testSelfMembers - K2IdeK2CodeKotlinEvaluateExpressionTestGenerated$SingleBreakpoint$CompilingEvaluator$InaccessibleMembers.testOuterMembers - K2IdeK2CodeKotlinEvaluateExpressionTestGenerated$SingleBreakpoint$Uncategorized.testPrivateMember - K2IdeK2CodeKotlinEvaluateExpressionTestGenerated$SingleBreakpoint$Uncategorized.testProperties - K2IdeK2CodeKotlinEvaluateExpressionTestGenerated$SingleBreakpoint$Uncategorized.testPrivatePropertyWithExplicitDefaultGetter - K2IdeK2CodeKotlinEvaluateExpressionTestGenerated$SingleBreakpoint$Uncategorized.testPrivateClass --- .../api/fir/components/KtFirCompilerFacility.kt | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCompilerFacility.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCompilerFacility.kt index 09b72507419..e1b4d17491b 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCompilerFacility.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCompilerFacility.kt @@ -44,8 +44,10 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.toFirDiagnostics import org.jetbrains.kotlin.fir.backend.* import org.jetbrains.kotlin.fir.backend.jvm.* import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.declarations.utils.hasBody import org.jetbrains.kotlin.fir.diagnostics.ConeSyntaxDiagnostic import org.jetbrains.kotlin.fir.languageVersionSettings +import org.jetbrains.kotlin.fir.lazy.AbstractFir2IrLazyDeclaration import org.jetbrains.kotlin.fir.pipeline.applyIrGenerationExtensions import org.jetbrains.kotlin.fir.pipeline.signatureComposerForJvmFir2Ir import org.jetbrains.kotlin.fir.psi @@ -435,7 +437,15 @@ internal class KtFirCompilerFacility( * [org.jetbrains.kotlin.backend.jvm.lower.ReflectiveAccessLowering.visitGetField] (or visitSetField) generates the access without * asking. */ - override fun isAccessorWithExplicitImplementation(accessor: IrSimpleFunction) = true + override fun isAccessorWithExplicitImplementation(accessor: IrSimpleFunction): Boolean { + if (accessor is AbstractFir2IrLazyDeclaration<*>) { + val fir = accessor.fir + if (fir is FirFunction && fir.hasBody) { + return true + } + } + return false + } } private class CompilerFacilityFir2IrExtensions(