[Analysis API] introduce getKtFiles util

^KT-64805
This commit is contained in:
Dmitrii Gridin
2024-01-09 20:36:48 +01:00
committed by Space Team
parent d828a646cf
commit b67deea21f
3 changed files with 14 additions and 8 deletions
@@ -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.
*/ */
@@ -9,9 +9,11 @@ import com.intellij.psi.PsiFile
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleProjectStructure import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleProjectStructure
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleWithFiles import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleWithFiles
import org.jetbrains.kotlin.analysis.project.structure.* import org.jetbrains.kotlin.analysis.project.structure.*
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.test.model.TestModule import org.jetbrains.kotlin.test.model.TestModule
import org.jetbrains.kotlin.test.services.TestService import org.jetbrains.kotlin.test.services.TestService
import org.jetbrains.kotlin.test.services.TestServices import org.jetbrains.kotlin.test.services.TestServices
import org.jetbrains.kotlin.test.services.moduleStructure
abstract class AnalysisApiKtModuleProvider : TestService { abstract class AnalysisApiKtModuleProvider : TestService {
protected abstract val testServices: TestServices protected abstract val testServices: TestServices
@@ -48,6 +50,8 @@ class AnalysisApiKtModuleProviderImpl(
override fun getModuleStructure(): KtModuleProjectStructure = modulesStructure override fun getModuleStructure(): KtModuleProjectStructure = modulesStructure
} }
fun AnalysisApiKtModuleProvider.getKtFiles(module: TestModule): List<KtFile> = getModuleFiles(module).filterIsInstance<KtFile>()
fun TestServices.allKtFiles(): List<KtFile> = moduleStructure.modules.flatMap(ktModuleProvider::getKtFiles) fun TestServices.allKtFiles(): List<KtFile> = moduleStructure.modules.flatMap(ktModuleProvider::getKtFiles)
val TestServices.ktModuleProvider: AnalysisApiKtModuleProvider by TestServices.testServiceAccessor() val TestServices.ktModuleProvider: AnalysisApiKtModuleProvider by TestServices.testServiceAccessor()
@@ -66,4 +70,4 @@ fun List<KtModuleWithFiles>.associateByName(): Map<String, KtModuleWithFiles> {
else -> error("Unsupported module type: " + ktModule.javaClass.name) else -> error("Unsupported module type: " + ktModule.javaClass.name)
} }
} }
} }
@@ -10,6 +10,7 @@ import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile import com.intellij.psi.PsiFile
import com.intellij.psi.PsiWhiteSpace import com.intellij.psi.PsiWhiteSpace
import com.intellij.psi.util.PsiTreeUtil import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.kotlin.analysis.test.framework.project.structure.getKtFiles
import org.jetbrains.kotlin.analysis.test.framework.project.structure.ktModuleProvider import org.jetbrains.kotlin.analysis.test.framework.project.structure.ktModuleProvider
import org.jetbrains.kotlin.analysis.utils.printer.parentOfType import org.jetbrains.kotlin.analysis.utils.printer.parentOfType
import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtElement
@@ -123,7 +124,7 @@ class ExpressionMarkerProvider : TestService {
@OptIn(PrivateForInline::class) @OptIn(PrivateForInline::class)
inline fun <reified P : KtElement> getElementsOfTypeAtCarets( inline fun <reified P : KtElement> getElementsOfTypeAtCarets(
files: Collection<KtFile>, files: Collection<KtFile>,
caretTag: String? = null caretTag: String? = null,
): Collection<Pair<P, KtFile>> { ): Collection<Pair<P, KtFile>> {
return files.mapNotNull { file -> return files.mapNotNull { file ->
getCaretPositionOrNull(file, caretTag)?.let { offset -> getCaretPositionOrNull(file, caretTag)?.let { offset ->
@@ -137,10 +138,10 @@ class ExpressionMarkerProvider : TestService {
inline fun <reified P : KtElement> getElementsOfTypeAtCarets( inline fun <reified P : KtElement> getElementsOfTypeAtCarets(
moduleStructure: TestModuleStructure, moduleStructure: TestModuleStructure,
testServices: TestServices, testServices: TestServices,
caretTag: String? = null caretTag: String? = null,
): Collection<Pair<P, KtFile>> { ): Collection<Pair<P, KtFile>> {
return moduleStructure.modules.flatMap { module -> return moduleStructure.modules.flatMap { module ->
val ktFiles = testServices.ktModuleProvider.getModuleFiles(module).filterIsInstance<KtFile>() val ktFiles = testServices.ktModuleProvider.getKtFiles(module)
getElementsOfTypeAtCarets<P>(ktFiles, caretTag) getElementsOfTypeAtCarets<P>(ktFiles, caretTag)
} }
@@ -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.
*/ */
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirFile
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.services.FirSealedClassInheritorsProcessorFactory import org.jetbrains.kotlin.analysis.low.level.api.fir.api.services.FirSealedClassInheritorsProcessorFactory
import org.jetbrains.kotlin.analysis.low.level.api.fir.services.LLFirSealedClassInheritorsProcessorFactoryForTests import org.jetbrains.kotlin.analysis.low.level.api.fir.services.LLFirSealedClassInheritorsProcessorFactoryForTests
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.getKtFiles
import org.jetbrains.kotlin.analysis.test.framework.project.structure.ktModuleProvider import org.jetbrains.kotlin.analysis.test.framework.project.structure.ktModuleProvider
import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.FirRegularClass
@@ -42,7 +43,7 @@ class SealedClassesInheritorsCaclulatorPreAnalysisHandler(
} }
val ktFilesByModule = moduleStructure.modules.associateWith { testModule -> val ktFilesByModule = moduleStructure.modules.associateWith { testModule ->
testServices.ktModuleProvider.getModuleFiles(testModule).filterIsInstance<KtFile>() testServices.ktModuleProvider.getKtFiles(testModule)
} }
for ((testModule, ktFiles) in ktFilesByModule) { for ((testModule, ktFiles) in ktFilesByModule) {
@@ -62,7 +63,7 @@ class SealedClassesInheritorsCaclulatorPreAnalysisHandler(
private fun collectSealedClassInheritors( private fun collectSealedClassInheritors(
firFiles: List<FirFile>, firFiles: List<FirFile>,
tmpFirResolveSession: LLFirResolveSession tmpFirResolveSession: LLFirResolveSession,
): Map<ClassId, List<ClassId>> { ): Map<ClassId, List<ClassId>> {
firFiles.forEach { it.lazyResolveToPhaseRecursively(FirResolvePhase.TYPES) } firFiles.forEach { it.lazyResolveToPhaseRecursively(FirResolvePhase.TYPES) }
val inheritorsCollector = FirSealedClassInheritorsProcessor.InheritorsCollector(tmpFirResolveSession.useSiteFirSession) val inheritorsCollector = FirSealedClassInheritorsProcessor.InheritorsCollector(tmpFirResolveSession.useSiteFirSession)