diff --git a/analysis/low-level-api-fir/testData/getOrBuildFirBinary/delegate.kt b/analysis/low-level-api-fir/testData/getOrBuildFirBinary/delegate.kt index 744ce3b245b..47c57584770 100644 --- a/analysis/low-level-api-fir/testData/getOrBuildFirBinary/delegate.kt +++ b/analysis/low-level-api-fir/testData/getOrBuildFirBinary/delegate.kt @@ -1,3 +1,4 @@ +// MAIN_FILE_NAME: I // DECLARATION_TYPE: org.jetbrains.kotlin.psi.KtClass class I(private val p: A) : A by p diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractFirLazyDeclarationResolveTest.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractFirLazyDeclarationResolveTest.kt index 71b7f4154b0..22bead6a0e6 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractFirLazyDeclarationResolveTest.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractFirLazyDeclarationResolveTest.kt @@ -22,9 +22,9 @@ abstract class AbstractFirLazyDeclarationResolveTest : AbstractFirLazyDeclaratio require(firSession.isSourceSession) } - override fun doTestByFileStructure(ktFile: KtFile, testModule: TestModule, testServices: TestServices) { - doLazyResolveTest(ktFile, testServices, renderAllFiles = true) { firResolveSession -> - findFirDeclarationToResolve(ktFile, testServices.moduleStructure, testServices, firResolveSession) + override fun doTestByMainFile(mainFile: KtFile, mainModule: TestModule, testServices: TestServices) { + doLazyResolveTest(mainFile, testServices, renderAllFiles = true) { firResolveSession -> + findFirDeclarationToResolve(mainFile, testServices.moduleStructure, testServices, firResolveSession) } } diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractFirLazyDeclarationResolveTestCase.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractFirLazyDeclarationResolveTestCase.kt index 9466a6af288..8833318b681 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractFirLazyDeclarationResolveTestCase.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractFirLazyDeclarationResolveTestCase.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -8,12 +8,11 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession import org.jetbrains.kotlin.analysis.low.level.api.fir.api.resolveToFirSymbol import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirResolvableModuleSession -import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.AbstractLowLevelApiLastModuleFirstFileTest import org.jetbrains.kotlin.analysis.low.level.api.fir.util.FirElementFinder.findElementIn +import org.jetbrains.kotlin.analysis.test.framework.base.AbstractAnalysisApiBasedTest import org.jetbrains.kotlin.analysis.test.framework.services.expressionMarkerProvider import org.jetbrains.kotlin.analysis.utils.errors.requireIsInstance import org.jetbrains.kotlin.fir.FirElementWithResolveState -import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.renderer.FirDeclarationRendererWithFilteredAttributes @@ -42,7 +41,7 @@ import org.jetbrains.kotlin.test.services.TestServices /** * Test that we do not resolve declarations we do not need & do not build bodies for them */ -abstract class AbstractFirLazyDeclarationResolveTestCase : AbstractLowLevelApiLastModuleFirstFileTest() { +abstract class AbstractFirLazyDeclarationResolveTestCase : AbstractAnalysisApiBasedTest() { protected fun findFirDeclarationToResolve( ktFile: KtFile, moduleStructure: TestModuleStructure, diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractGetOrBuildFirTest.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractGetOrBuildFirTest.kt index 37a41984dc7..c5fa5564df0 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractGetOrBuildFirTest.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractGetOrBuildFirTest.kt @@ -7,10 +7,10 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFir import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirFile -import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.AbstractLowLevelApiLastModuleFirstFileTest import org.jetbrains.kotlin.analysis.low.level.api.fir.test.configurators.AnalysisApiFirOutOfContentRootTestConfigurator import org.jetbrains.kotlin.analysis.low.level.api.fir.test.configurators.AnalysisApiFirScriptTestConfigurator import org.jetbrains.kotlin.analysis.low.level.api.fir.test.configurators.AnalysisApiFirSourceTestConfigurator +import org.jetbrains.kotlin.analysis.test.framework.base.AbstractAnalysisApiBasedTest import org.jetbrains.kotlin.analysis.test.framework.services.expressionMarkerProvider import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.declarations.FirFile @@ -22,15 +22,15 @@ import org.jetbrains.kotlin.test.model.TestModule import org.jetbrains.kotlin.test.services.TestServices import org.jetbrains.kotlin.test.services.assertions -abstract class AbstractGetOrBuildFirTest : AbstractLowLevelApiLastModuleFirstFileTest() { - override fun doTestByFileStructure(ktFile: KtFile, testModule: TestModule, testServices: TestServices) { - val selectedElement = testServices.expressionMarkerProvider.getSelectedElementOfTypeByDirective(ktFile, testModule) as KtElement +abstract class AbstractGetOrBuildFirTest : AbstractAnalysisApiBasedTest() { + override fun doTestByMainFile(mainFile: KtFile, mainModule: TestModule, testServices: TestServices) { + val selectedElement = testServices.expressionMarkerProvider.getSelectedElementOfTypeByDirective(mainFile, mainModule) as KtElement - val actual = resolveWithClearCaches(ktFile) { session -> + val actual = resolveWithClearCaches(mainFile) { session -> renderActualFir( fir = selectedElement.getOrBuildFir(session), ktElement = selectedElement, - firFile = ktFile.getOrBuildFirFile(session), + firFile = mainFile.getOrBuildFirFile(session), ) } diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractLazyTypeAnnotationsTest.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractLazyTypeAnnotationsTest.kt index db52b9a7c98..8ec8762790a 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractLazyTypeAnnotationsTest.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractLazyTypeAnnotationsTest.kt @@ -45,14 +45,14 @@ import org.jetbrains.kotlin.test.services.moduleStructure * It collects all type annotations from the selected declaration and resolves them */ abstract class AbstractLazyTypeAnnotationsTest : AbstractFirLazyDeclarationResolveTestCase() { - override fun doTestByFileStructure(ktFile: KtFile, testModule: TestModule, testServices: TestServices) { + override fun doTestByMainFile(mainFile: KtFile, mainModule: TestModule, testServices: TestServices) { val builderBeforeAnnotationResolve = StringBuilder() val builderAfterAnnotationResolve = StringBuilder() val allKtFiles = testServices.allKtFiles() - resolveWithClearCaches(ktFile) { session -> + resolveWithClearCaches(mainFile) { session -> val moduleStructure = testServices.moduleStructure - val (declaration, resolver) = findFirDeclarationToResolve(ktFile, moduleStructure, testServices, session) + val (declaration, resolver) = findFirDeclarationToResolve(mainFile, moduleStructure, testServices, session) resolver.invoke(FirResolvePhase.TYPES) if (declaration is FirCallableDeclaration) { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractLibraryGetOrBuildFirTest.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractLibraryGetOrBuildFirTest.kt index fa1ef1b7b63..e9819a02761 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractLibraryGetOrBuildFirTest.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractLibraryGetOrBuildFirTest.kt @@ -6,10 +6,10 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.AbstractLowLevelApiLastModuleFirstFileTest import org.jetbrains.kotlin.analysis.low.level.api.fir.test.configurators.AnalysisApiFirLibraryBinaryTestConfigurator import org.jetbrains.kotlin.analysis.low.level.api.fir.util.FirDeclarationForCompiledElementSearcher import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider +import org.jetbrains.kotlin.analysis.test.framework.base.AbstractAnalysisApiBasedTest import org.jetbrains.kotlin.analysis.test.framework.services.libraries.CompiledLibraryProvider import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider import org.jetbrains.kotlin.platform.js.JsPlatforms @@ -23,7 +23,7 @@ import org.jetbrains.kotlin.test.services.assertions import org.jetbrains.kotlin.test.services.moduleStructure import org.jetbrains.kotlin.test.services.service -abstract class AbstractLibraryGetOrBuildFirTest : AbstractLowLevelApiLastModuleFirstFileTest() { +abstract class AbstractLibraryGetOrBuildFirTest : AbstractAnalysisApiBasedTest() { override val configurator = AnalysisApiFirLibraryBinaryTestConfigurator override fun configureTest(builder: TestConfigurationBuilder) { builder.forTestsMatching("analysis/low-level-api-fir/testData/getOrBuildFirBinary/js/*") { @@ -36,27 +36,27 @@ abstract class AbstractLibraryGetOrBuildFirTest : AbstractLowLevelApiLastModuleF } } - override fun doTestByFileStructure(ktFile: KtFile, testModule: TestModule, testServices: TestServices) { - val declaration = getElementToSearch(ktFile, testServices.moduleStructure) + override fun doTestByMainFile(mainFile: KtFile, mainModule: TestModule, testServices: TestServices) { + val declaration = getElementToSearch(mainFile, testServices.moduleStructure)!! - val module = ProjectStructureProvider.getModule(ktFile.project, ktFile, contextualModule = null) - val resolveSession = LLFirResolveSessionService.getInstance(ktFile.project).getFirResolveSessionForBinaryModule(module) + val module = ProjectStructureProvider.getModule(mainFile.project, mainFile, contextualModule = null) + val resolveSession = LLFirResolveSessionService.getInstance(mainFile.project).getFirResolveSessionForBinaryModule(module) val symbolProvider = resolveSession.getSessionFor(module).symbolProvider val fir = FirDeclarationForCompiledElementSearcher(symbolProvider).findNonLocalDeclaration(declaration) testServices.assertions.assertEqualsToTestDataFileSibling(renderActualFir(fir, declaration, true)) } - private fun getElementToSearch(ktFile: KtFile, moduleStructure: TestModuleStructure): KtDeclaration { + private fun getElementToSearch(ktFile: KtFile, moduleStructure: TestModuleStructure): KtDeclaration? { val expectedType = moduleStructure.allDirectives[Directives.DECLARATION_TYPE].firstOrNull() ?: error("Compiled code should have element type specified") @Suppress("UNCHECKED_CAST") val expectedClass = Class.forName(expectedType) as Class - return findFirstDeclaration(ktFile.declarations, expectedClass)!! + return findFirstDeclaration(ktFile.declarations, expectedClass) } private fun findFirstDeclaration( declarations: List, - expectedClass: Class + expectedClass: Class, ): KtDeclaration? { declarations.filterIsInstance(expectedClass).firstOrNull()?.let { return it as KtDeclaration } declarations.forEach { decl -> diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractStdLibSourcesLazyDeclarationResolveTest.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractStdLibSourcesLazyDeclarationResolveTest.kt index a7786d8df57..9e19c977b56 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractStdLibSourcesLazyDeclarationResolveTest.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractStdLibSourcesLazyDeclarationResolveTest.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.test.configurators.Analys import org.jetbrains.kotlin.analysis.project.structure.KtLibrarySourceModule import org.jetbrains.kotlin.analysis.project.structure.KtModule import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider +import org.jetbrains.kotlin.analysis.test.framework.project.structure.ktModuleProvider import org.jetbrains.kotlin.analysis.utils.errors.requireIsInstance import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.resolve.providers.getRegularClassSymbolByClassId @@ -38,11 +39,12 @@ abstract class AbstractStdLibSourcesLazyDeclarationResolveTest : AbstractFirLazy override val configurator get() = AnalysisApiFirStdlibSourceTestConfigurator - override fun doTestByFileStructure(ktFile: KtFile, testModule: TestModule, testServices: TestServices) { - val project = ktFile.project + override fun doTestByMainModuleAndOptionalMainFile(mainFile: KtFile?, mainModule: TestModule, testServices: TestServices) { + val psiFile = mainFile ?: testServices.ktModuleProvider.getModuleFiles(mainModule).first() + val project = psiFile.project val moduleStructure = testServices.moduleStructure val classId = moduleStructure.allDirectives.singleValue(Directives.CLASS_ID).let(ClassId::fromString) - val module = ProjectStructureProvider.getModule(project, ktFile, contextualModule = null) + val module = ProjectStructureProvider.getModule(project, psiFile, contextualModule = null) val resolveSession = LLFirResolveSessionService.getInstance(project).getFirResolveSession(module) val classDeclaration = findRegularClass(classId, module, resolveSession).findPsi() as KtClassOrObject val file = classDeclaration.containingFile as KtFile diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/resolve/AbstractLazyDeclarationResolveScopeBasedTest.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/resolve/AbstractLazyDeclarationResolveScopeBasedTest.kt index cb34e0366fa..fd05b516017 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/resolve/AbstractLazyDeclarationResolveScopeBasedTest.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/resolve/AbstractLazyDeclarationResolveScopeBasedTest.kt @@ -9,10 +9,10 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession import org.jetbrains.kotlin.analysis.low.level.api.fir.api.resolveToFirSymbolOfType import org.jetbrains.kotlin.analysis.low.level.api.fir.lazyResolveRenderer import org.jetbrains.kotlin.analysis.low.level.api.fir.resolveWithClearCaches -import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.AbstractLowLevelApiLastModuleFirstFileTest import org.jetbrains.kotlin.analysis.low.level.api.fir.test.configurators.AnalysisApiFirOutOfContentRootTestConfigurator import org.jetbrains.kotlin.analysis.low.level.api.fir.test.configurators.AnalysisApiFirScriptTestConfigurator import org.jetbrains.kotlin.analysis.low.level.api.fir.test.configurators.AnalysisApiFirSourceTestConfigurator +import org.jetbrains.kotlin.analysis.test.framework.base.AbstractAnalysisApiBasedTest import org.jetbrains.kotlin.analysis.test.framework.services.expressionMarkerProvider import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.scopes.ProcessorAction @@ -33,9 +33,9 @@ import org.jetbrains.kotlin.test.services.assertions /** * This test exists to check lazy resolution for fake overrides */ -abstract class AbstractLazyDeclarationResolveScopeBasedTest : AbstractLowLevelApiLastModuleFirstFileTest() { - override fun doTestByFileStructure(ktFile: KtFile, testModule: TestModule, testServices: TestServices) { - val classOrObject = testServices.expressionMarkerProvider.getElementOfTypeAtCaret(ktFile) +abstract class AbstractLazyDeclarationResolveScopeBasedTest : AbstractAnalysisApiBasedTest() { + override fun doTestByMainFile(mainFile: KtFile, mainModule: TestModule, testServices: TestServices) { + val classOrObject = testServices.expressionMarkerProvider.getElementOfTypeAtCaret(mainFile) resolveWithClearCaches(classOrObject) { session -> val classSymbol = classOrObject.resolveToFirSymbolOfType>(session) val symbols = collectAllCallableDeclarations(classSymbol, session) diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/AbstractLowLevelApiLastModuleFirstFileTest.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/AbstractLowLevelApiLastModuleFirstFileTest.kt deleted file mode 100644 index b3942f0242d..00000000000 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/AbstractLowLevelApiLastModuleFirstFileTest.kt +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors. - * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. - */ - -package org.jetbrains.kotlin.analysis.low.level.api.fir.test.base - -import org.jetbrains.kotlin.analysis.test.framework.base.AbstractAnalysisApiBasedTest -import org.jetbrains.kotlin.analysis.test.framework.project.structure.ktModuleProvider -import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.test.model.TestModule -import org.jetbrains.kotlin.test.services.TestModuleStructure -import org.jetbrains.kotlin.test.services.TestServices - -abstract class AbstractLowLevelApiLastModuleFirstFileTest : AbstractAnalysisApiBasedTest() { - final override fun doTestByModuleStructure(moduleStructure: TestModuleStructure, testServices: TestServices) { - val lastModule = moduleStructure.modules.last() - val firstKtFileFile = testServices.ktModuleProvider.getModuleFiles(lastModule).firstNotNullOf { it as? KtFile } - doTestByFileStructure(firstKtFileFile, lastModule, testServices) - } - - abstract fun doTestByFileStructure(ktFile: KtFile, testModule: TestModule, testServices: TestServices) -}