[LL FIR] ger rid of AbstractLowLevelApiLastModuleFirstFileTest

Now this class is redundant and all tests migrated to the base class

^KT-64805
This commit is contained in:
Dmitrii Gridin
2024-01-08 18:25:45 +01:00
committed by Space Team
parent 84d07ef492
commit 095989b6fc
9 changed files with 34 additions and 55 deletions
@@ -1,3 +1,4 @@
// MAIN_FILE_NAME: I
// DECLARATION_TYPE: org.jetbrains.kotlin.psi.KtClass // DECLARATION_TYPE: org.jetbrains.kotlin.psi.KtClass
class I(private val p: A) : A by p class I(private val p: A) : A by p
@@ -22,9 +22,9 @@ abstract class AbstractFirLazyDeclarationResolveTest : AbstractFirLazyDeclaratio
require(firSession.isSourceSession) require(firSession.isSourceSession)
} }
override fun doTestByFileStructure(ktFile: KtFile, testModule: TestModule, testServices: TestServices) { override fun doTestByMainFile(mainFile: KtFile, mainModule: TestModule, testServices: TestServices) {
doLazyResolveTest(ktFile, testServices, renderAllFiles = true) { firResolveSession -> doLazyResolveTest(mainFile, testServices, renderAllFiles = true) { firResolveSession ->
findFirDeclarationToResolve(ktFile, testServices.moduleStructure, testServices, firResolveSession) findFirDeclarationToResolve(mainFile, testServices.moduleStructure, testServices, firResolveSession)
} }
} }
@@ -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. * 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.LLFirResolveSession
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.resolveToFirSymbol 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.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.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.test.framework.services.expressionMarkerProvider
import org.jetbrains.kotlin.analysis.utils.errors.requireIsInstance import org.jetbrains.kotlin.analysis.utils.errors.requireIsInstance
import org.jetbrains.kotlin.fir.FirElementWithResolveState 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.FirFile
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.renderer.FirDeclarationRendererWithFilteredAttributes 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 * 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( protected fun findFirDeclarationToResolve(
ktFile: KtFile, ktFile: KtFile,
moduleStructure: TestModuleStructure, moduleStructure: TestModuleStructure,
@@ -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.getOrBuildFir
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirFile 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.AnalysisApiFirOutOfContentRootTestConfigurator
import org.jetbrains.kotlin.analysis.low.level.api.fir.test.configurators.AnalysisApiFirScriptTestConfigurator 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.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.analysis.test.framework.services.expressionMarkerProvider
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.declarations.FirFile 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.TestServices
import org.jetbrains.kotlin.test.services.assertions import org.jetbrains.kotlin.test.services.assertions
abstract class AbstractGetOrBuildFirTest : AbstractLowLevelApiLastModuleFirstFileTest() { abstract class AbstractGetOrBuildFirTest : AbstractAnalysisApiBasedTest() {
override fun doTestByFileStructure(ktFile: KtFile, testModule: TestModule, testServices: TestServices) { override fun doTestByMainFile(mainFile: KtFile, mainModule: TestModule, testServices: TestServices) {
val selectedElement = testServices.expressionMarkerProvider.getSelectedElementOfTypeByDirective(ktFile, testModule) as KtElement val selectedElement = testServices.expressionMarkerProvider.getSelectedElementOfTypeByDirective(mainFile, mainModule) as KtElement
val actual = resolveWithClearCaches(ktFile) { session -> val actual = resolveWithClearCaches(mainFile) { session ->
renderActualFir( renderActualFir(
fir = selectedElement.getOrBuildFir(session), fir = selectedElement.getOrBuildFir(session),
ktElement = selectedElement, ktElement = selectedElement,
firFile = ktFile.getOrBuildFirFile(session), firFile = mainFile.getOrBuildFirFile(session),
) )
} }
@@ -45,14 +45,14 @@ import org.jetbrains.kotlin.test.services.moduleStructure
* It collects all type annotations from the selected declaration and resolves them * It collects all type annotations from the selected declaration and resolves them
*/ */
abstract class AbstractLazyTypeAnnotationsTest : AbstractFirLazyDeclarationResolveTestCase() { 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 builderBeforeAnnotationResolve = StringBuilder()
val builderAfterAnnotationResolve = StringBuilder() val builderAfterAnnotationResolve = StringBuilder()
val allKtFiles = testServices.allKtFiles() val allKtFiles = testServices.allKtFiles()
resolveWithClearCaches(ktFile) { session -> resolveWithClearCaches(mainFile) { session ->
val moduleStructure = testServices.moduleStructure val moduleStructure = testServices.moduleStructure
val (declaration, resolver) = findFirDeclarationToResolve(ktFile, moduleStructure, testServices, session) val (declaration, resolver) = findFirDeclarationToResolve(mainFile, moduleStructure, testServices, session)
resolver.invoke(FirResolvePhase.TYPES) resolver.invoke(FirResolvePhase.TYPES)
if (declaration is FirCallableDeclaration) { if (declaration is FirCallableDeclaration) {
@@ -6,10 +6,10 @@
package org.jetbrains.kotlin.analysis.low.level.api.fir package org.jetbrains.kotlin.analysis.low.level.api.fir
import com.intellij.psi.PsiElement 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.test.configurators.AnalysisApiFirLibraryBinaryTestConfigurator
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.FirDeclarationForCompiledElementSearcher import org.jetbrains.kotlin.analysis.low.level.api.fir.util.FirDeclarationForCompiledElementSearcher
import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider 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.analysis.test.framework.services.libraries.CompiledLibraryProvider
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
import org.jetbrains.kotlin.platform.js.JsPlatforms 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.moduleStructure
import org.jetbrains.kotlin.test.services.service import org.jetbrains.kotlin.test.services.service
abstract class AbstractLibraryGetOrBuildFirTest : AbstractLowLevelApiLastModuleFirstFileTest() { abstract class AbstractLibraryGetOrBuildFirTest : AbstractAnalysisApiBasedTest() {
override val configurator = AnalysisApiFirLibraryBinaryTestConfigurator override val configurator = AnalysisApiFirLibraryBinaryTestConfigurator
override fun configureTest(builder: TestConfigurationBuilder) { override fun configureTest(builder: TestConfigurationBuilder) {
builder.forTestsMatching("analysis/low-level-api-fir/testData/getOrBuildFirBinary/js/*") { 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) { override fun doTestByMainFile(mainFile: KtFile, mainModule: TestModule, testServices: TestServices) {
val declaration = getElementToSearch(ktFile, testServices.moduleStructure) val declaration = getElementToSearch(mainFile, testServices.moduleStructure)!!
val module = ProjectStructureProvider.getModule(ktFile.project, ktFile, contextualModule = null) val module = ProjectStructureProvider.getModule(mainFile.project, mainFile, contextualModule = null)
val resolveSession = LLFirResolveSessionService.getInstance(ktFile.project).getFirResolveSessionForBinaryModule(module) val resolveSession = LLFirResolveSessionService.getInstance(mainFile.project).getFirResolveSessionForBinaryModule(module)
val symbolProvider = resolveSession.getSessionFor(module).symbolProvider val symbolProvider = resolveSession.getSessionFor(module).symbolProvider
val fir = FirDeclarationForCompiledElementSearcher(symbolProvider).findNonLocalDeclaration(declaration) val fir = FirDeclarationForCompiledElementSearcher(symbolProvider).findNonLocalDeclaration(declaration)
testServices.assertions.assertEqualsToTestDataFileSibling(renderActualFir(fir, declaration, true)) 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() val expectedType = moduleStructure.allDirectives[Directives.DECLARATION_TYPE].firstOrNull()
?: error("Compiled code should have element type specified") ?: error("Compiled code should have element type specified")
@Suppress("UNCHECKED_CAST") val expectedClass = Class.forName(expectedType) as Class<out PsiElement> @Suppress("UNCHECKED_CAST") val expectedClass = Class.forName(expectedType) as Class<out PsiElement>
return findFirstDeclaration(ktFile.declarations, expectedClass)!! return findFirstDeclaration(ktFile.declarations, expectedClass)
} }
private fun findFirstDeclaration( private fun findFirstDeclaration(
declarations: List<KtDeclaration>, declarations: List<KtDeclaration>,
expectedClass: Class<out PsiElement> expectedClass: Class<out PsiElement>,
): KtDeclaration? { ): KtDeclaration? {
declarations.filterIsInstance(expectedClass).firstOrNull()?.let { return it as KtDeclaration } declarations.filterIsInstance(expectedClass).firstOrNull()?.let { return it as KtDeclaration }
declarations.forEach { decl -> declarations.forEach { decl ->
@@ -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.KtLibrarySourceModule
import org.jetbrains.kotlin.analysis.project.structure.KtModule import org.jetbrains.kotlin.analysis.project.structure.KtModule
import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider 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.analysis.utils.errors.requireIsInstance
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.resolve.providers.getRegularClassSymbolByClassId import org.jetbrains.kotlin.fir.resolve.providers.getRegularClassSymbolByClassId
@@ -38,11 +39,12 @@ abstract class AbstractStdLibSourcesLazyDeclarationResolveTest : AbstractFirLazy
override val configurator get() = AnalysisApiFirStdlibSourceTestConfigurator override val configurator get() = AnalysisApiFirStdlibSourceTestConfigurator
override fun doTestByFileStructure(ktFile: KtFile, testModule: TestModule, testServices: TestServices) { override fun doTestByMainModuleAndOptionalMainFile(mainFile: KtFile?, mainModule: TestModule, testServices: TestServices) {
val project = ktFile.project val psiFile = mainFile ?: testServices.ktModuleProvider.getModuleFiles(mainModule).first()
val project = psiFile.project
val moduleStructure = testServices.moduleStructure val moduleStructure = testServices.moduleStructure
val classId = moduleStructure.allDirectives.singleValue(Directives.CLASS_ID).let(ClassId::fromString) 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 resolveSession = LLFirResolveSessionService.getInstance(project).getFirResolveSession(module)
val classDeclaration = findRegularClass(classId, module, resolveSession).findPsi() as KtClassOrObject val classDeclaration = findRegularClass(classId, module, resolveSession).findPsi() as KtClassOrObject
val file = classDeclaration.containingFile as KtFile val file = classDeclaration.containingFile as KtFile
@@ -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.api.resolveToFirSymbolOfType
import org.jetbrains.kotlin.analysis.low.level.api.fir.lazyResolveRenderer 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.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.AnalysisApiFirOutOfContentRootTestConfigurator
import org.jetbrains.kotlin.analysis.low.level.api.fir.test.configurators.AnalysisApiFirScriptTestConfigurator 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.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.analysis.test.framework.services.expressionMarkerProvider
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.scopes.ProcessorAction 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 * This test exists to check lazy resolution for fake overrides
*/ */
abstract class AbstractLazyDeclarationResolveScopeBasedTest : AbstractLowLevelApiLastModuleFirstFileTest() { abstract class AbstractLazyDeclarationResolveScopeBasedTest : AbstractAnalysisApiBasedTest() {
override fun doTestByFileStructure(ktFile: KtFile, testModule: TestModule, testServices: TestServices) { override fun doTestByMainFile(mainFile: KtFile, mainModule: TestModule, testServices: TestServices) {
val classOrObject = testServices.expressionMarkerProvider.getElementOfTypeAtCaret<KtClassOrObject>(ktFile) val classOrObject = testServices.expressionMarkerProvider.getElementOfTypeAtCaret<KtClassOrObject>(mainFile)
resolveWithClearCaches(classOrObject) { session -> resolveWithClearCaches(classOrObject) { session ->
val classSymbol = classOrObject.resolveToFirSymbolOfType<FirClassSymbol<*>>(session) val classSymbol = classOrObject.resolveToFirSymbolOfType<FirClassSymbol<*>>(session)
val symbols = collectAllCallableDeclarations(classSymbol, session) val symbols = collectAllCallableDeclarations(classSymbol, session)
@@ -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)
}