diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/LowLevelFirApiFacadeForResolveOnAir.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/LowLevelFirApiFacadeForResolveOnAir.kt index 1b78d001d7f..7a3df552703 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/LowLevelFirApiFacadeForResolveOnAir.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/LowLevelFirApiFacadeForResolveOnAir.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.util.codeFragment import org.jetbrains.kotlin.analysis.low.level.api.fir.util.errorWithFirSpecificEntries import org.jetbrains.kotlin.analysis.low.level.api.fir.util.isScriptStatement import org.jetbrains.kotlin.analysis.low.level.api.fir.util.originalDeclaration +import org.jetbrains.kotlin.analysis.low.level.api.fir.util.originalKtFile import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment import org.jetbrains.kotlin.analysis.utils.printer.parentOfType import org.jetbrains.kotlin.analysis.utils.printer.parentsOfType @@ -190,6 +191,8 @@ object LowLevelFirApiFacadeForResolveOnAir { require(originalFirResolveSession is LLFirResolvableResolveSession) require(elementToAnalyze !is KtFile) { "KtFile for dependency element not supported" } + elementToAnalyze.containingKtFile.originalKtFile = originalKtFile + val minimalCopiedDeclaration = elementToAnalyze.getNonLocalContainingOrThisDeclarationCodeFragmentAware { it.isApplicableForOnAirResolve() } diff --git a/analysis/low-level-api-fir/testdata/dependentCopy/function.context.txt b/analysis/low-level-api-fir/testdata/dependentCopy/function.context.txt new file mode 100644 index 00000000000..ea9558f05c0 --- /dev/null +++ b/analysis/low-level-api-fir/testdata/dependentCopy/function.context.txt @@ -0,0 +1,17 @@ +Tower Data Context: + Element 0 + Scope: FirDefaultStarImportingScope + Element 1 + Scope: FirDefaultSimpleImportingScope + Element 2 + Scope: FirExplicitStarImportingScope + Element 3 + Scope: FirDefaultSimpleImportingScope + Element 4 + Scope: FirDefaultSimpleImportingScope + Element 5 + Scope: FirPackageMemberScope + Element 6 + Scope: FirExplicitSimpleImportingScope + Element 7 + Scope: FirLocalScope diff --git a/analysis/low-level-api-fir/testdata/dependentCopy/function.copy.txt b/analysis/low-level-api-fir/testdata/dependentCopy/function.copy.txt new file mode 100644 index 00000000000..e337105a6c2 --- /dev/null +++ b/analysis/low-level-api-fir/testdata/dependentCopy/function.copy.txt @@ -0,0 +1,5 @@ +fun foo() { + val i = unusedInOriginal() +} + +fun unusedInOriginal() = 42 \ No newline at end of file diff --git a/analysis/low-level-api-fir/testdata/dependentCopy/function.fir.txt b/analysis/low-level-api-fir/testdata/dependentCopy/function.fir.txt new file mode 100644 index 00000000000..c5ba411c4a7 --- /dev/null +++ b/analysis/low-level-api-fir/testdata/dependentCopy/function.fir.txt @@ -0,0 +1,8 @@ +KT element: KtNamedFunction +FIR element: FirSimpleFunctionImpl +FIR source kind: KtRealSourceElementKind + +FIR element rendered: +public final [ResolvedTo(BODY_RESOLVE)] fun foo(): R|kotlin/Unit| { + [ResolvedTo(BODY_RESOLVE)] lval i: R|kotlin/Int| = R|/unusedInOriginal|() +} \ No newline at end of file diff --git a/analysis/low-level-api-fir/testdata/dependentCopy/function.kt b/analysis/low-level-api-fir/testdata/dependentCopy/function.kt new file mode 100644 index 00000000000..8de764e839e --- /dev/null +++ b/analysis/low-level-api-fir/testdata/dependentCopy/function.kt @@ -0,0 +1,5 @@ +fun foo() { + "original text" +} + +fun unusedInOriginal() = 42 \ No newline at end of file diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractDependentCopyTest.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractDependentCopyTest.kt index e2d64a54ea5..5d3d14cbf6f 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractDependentCopyTest.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractDependentCopyTest.kt @@ -11,8 +11,11 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.AbstractLowLeve import org.jetbrains.kotlin.analysis.test.framework.services.expressionMarkerProvider import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.psi.KtPsiFactory import org.jetbrains.kotlin.test.services.TestModuleStructure import org.jetbrains.kotlin.test.services.TestServices +import kotlin.io.path.exists +import kotlin.io.path.readText /** * This test class is supposed to specify the behavior of [getFirResolveSessionForDependentCopy]. @@ -28,7 +31,18 @@ abstract class AbstractDependentCopyTest : AbstractLowLevelApiSingleFileTest() { registeredDirectives = moduleStructure.allDirectives, ) - val fileCopy = ktFile.copy() as KtFile + val specialContentForCopiedFile = getTestDataFileSiblingPath( + extension = "copy.txt", + testPrefix = null, + ).takeIf { it.exists() }?.readText() + + val fileCopy = KtPsiFactory(ktFile.project).createFile( + ktFile.name, + specialContentForCopiedFile ?: ktFile.text, + ) + + fileCopy.originalFile = ktFile + val sameElementInCopy = PsiTreeUtil.findSameElementInCopy(element, fileCopy) resolveWithClearCaches(ktFile) { originalSession -> val dependentSession = getFirResolveSessionForDependentCopy( diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/SourceDependentCopyContextTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/SourceDependentCopyContextTestGenerated.java index 91948647c4e..2587ea327c9 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/SourceDependentCopyContextTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/SourceDependentCopyContextTestGenerated.java @@ -35,4 +35,10 @@ public class SourceDependentCopyContextTestGenerated extends AbstractSourceDepen public void testClassBody() throws Exception { runTest("analysis/low-level-api-fir/testdata/dependentCopy/classBody.kt"); } + + @Test + @TestMetadata("function.kt") + public void testFunction() throws Exception { + runTest("analysis/low-level-api-fir/testdata/dependentCopy/function.kt"); + } } diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/SourceDependentCopyFirTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/SourceDependentCopyFirTestGenerated.java index 95d1f33b91c..724df1c96eb 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/SourceDependentCopyFirTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/SourceDependentCopyFirTestGenerated.java @@ -35,4 +35,10 @@ public class SourceDependentCopyFirTestGenerated extends AbstractSourceDependent public void testClassBody() throws Exception { runTest("analysis/low-level-api-fir/testdata/dependentCopy/classBody.kt"); } + + @Test + @TestMetadata("function.kt") + public void testFunction() throws Exception { + runTest("analysis/low-level-api-fir/testdata/dependentCopy/function.kt"); + } }