[LL] add tests for FirDeclarationForCompiledElementSearcher

build stub if was not able to load:
expected that in IDE stubs would always be found in the index, for tests -
build from virtual file
This commit is contained in:
Anna Kozlova
2023-06-07 14:56:21 +02:00
committed by teamcity
parent bc306844af
commit 4d97e4c572
39 changed files with 473 additions and 25 deletions
@@ -24,6 +24,7 @@ dependencies {
testImplementation(project(":analysis:symbol-light-classes"))
testImplementation(projectTests(":analysis:decompiled:decompiler-to-file-stubs"))
testImplementation(project(":analysis:decompiled:decompiler-to-file-stubs"))
testImplementation(project(":analysis:decompiled:light-classes-for-decompiled"))
testImplementation(project(":analysis:decompiled:decompiler-to-psi"))
testImplementation(projectTests(":analysis:analysis-test-framework"))
testImplementation(commonDependency("org.jetbrains.kotlin:kotlin-reflect")) { isTransitive = false }
@@ -7,11 +7,16 @@ package org.jetbrains.kotlin.analysis.api.impl.base.test.configurators
import com.intellij.mock.MockApplication
import com.intellij.mock.MockProject
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiClass
import org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals
import org.jetbrains.kotlin.analysis.api.lifetime.KtDefaultLifetimeTokenProvider
import org.jetbrains.kotlin.analysis.api.lifetime.KtReadActionConfinementDefaultLifetimeTokenProvider
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.StandaloneProjectFactory
import org.jetbrains.kotlin.analysis.decompiled.light.classes.ClsJavaStubByVirtualFileCache
import org.jetbrains.kotlin.analysis.decompiled.light.classes.DecompiledLightClassesFactory
import org.jetbrains.kotlin.analysis.decompiler.psi.BuiltInDefinitionFile
import org.jetbrains.kotlin.analysis.decompiler.psi.file.KtClsFile
import org.jetbrains.kotlin.analysis.project.structure.KtModuleScopeProvider
import org.jetbrains.kotlin.analysis.project.structure.KtModuleScopeProviderImpl
import org.jetbrains.kotlin.analysis.providers.*
@@ -19,7 +24,9 @@ import org.jetbrains.kotlin.analysis.providers.impl.*
import org.jetbrains.kotlin.analysis.test.framework.project.structure.ktModuleProvider
import org.jetbrains.kotlin.analysis.test.framework.services.environmentManager
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestServiceRegistrar
import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtFileClassProvider
import org.jetbrains.kotlin.test.services.TestServices
object AnalysisApiBaseTestServiceRegistrar: AnalysisApiTestServiceRegistrar() {
@@ -30,6 +37,26 @@ object AnalysisApiBaseTestServiceRegistrar: AnalysisApiTestServiceRegistrar() {
project.apply {
registerService(KotlinModificationTrackerFactory::class.java, KotlinStaticModificationTrackerFactory::class.java)
registerService(KtDefaultLifetimeTokenProvider::class.java, KtReadActionConfinementDefaultLifetimeTokenProvider::class.java)
//KotlinClassFileDecompiler is registered as application service so it's available for the tests run in parallel as well
//when the decompiler is registered, for compiled class KtClsFile is created instead of ClsFileImpl
//and KtFile doesn't return any classes in classOwner.getClasses if there is no KtFileClassProvider
//but getClasses is used during java resolve, thus it's required to return some PsiClass for such cases
registerService(KtFileClassProvider::class.java, KtClsFileClassProvider(project))
registerService(ClsJavaStubByVirtualFileCache::class.java, ClsJavaStubByVirtualFileCache())
}
}
class KtClsFileClassProvider(val project: Project) : KtFileClassProvider {
override fun getFileClasses(file: KtFile): Array<PsiClass> {
val virtualFile = file.virtualFile
val classOrObject = file.declarations.filterIsInstance<KtClassOrObject>().singleOrNull()
if (file is KtClsFile && virtualFile != null) {
DecompiledLightClassesFactory.createClsJavaClassFromVirtualFile(file, virtualFile, classOrObject, project)?.let {
return arrayOf(it)
}
}
return PsiClass.EMPTY_ARRAY
}
}
@@ -39,7 +66,7 @@ object AnalysisApiBaseTestServiceRegistrar: AnalysisApiTestServiceRegistrar() {
val roots = StandaloneProjectFactory.getVirtualFilesForLibraryRoots(
moduleStructure.binaryModules.flatMap { binary -> binary.getBinaryRoots() },
testServices.environmentManager.getProjectEnvironment()
)
).distinct()
project.apply {
registerService(KtModuleScopeProvider::class.java, KtModuleScopeProviderImpl())
registerService(KotlinAnnotationsResolverFactory::class.java, KotlinStaticAnnotationsResolverFactory(allKtFiles))
@@ -14,13 +14,11 @@ import com.intellij.psi.FileTypeFileViewProviders
import com.intellij.psi.compiled.ClassFileDecompilers
import org.jetbrains.kotlin.analysis.decompiler.psi.KotlinBuiltInDecompiler
import org.jetbrains.kotlin.analysis.decompiler.psi.KotlinClassFileDecompiler
import org.jetbrains.kotlin.analysis.test.framework.services.disposableProvider
import org.jetbrains.kotlin.analysis.decompiler.stub.file.ClsKotlinBinaryClassCache
import org.jetbrains.kotlin.analysis.decompiler.stub.file.FileAttributeService
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestServiceRegistrar
import org.jetbrains.kotlin.test.TestInfrastructureInternals
import org.jetbrains.kotlin.test.services.TestServices
import org.jetbrains.kotlin.analysis.test.framework.services.disposableProvider
object AnalysisApiLibraryBaseTestServiceRegistrar : AnalysisApiTestServiceRegistrar() {
override fun registerProjectExtensionPoints(project: MockProject, testServices: TestServices) {