[AA] Add KtTestModule.moduleKind

- `TestModule.explicitTestModuleKind` requires a directive to be present
  to get the `TestModuleKind`. But we still want to find out the test
  module kind for test modules without a directive. Hence, we have to
  add this property to `KtTestModule` during its construction.

^KT-65960
This commit is contained in:
Marco Pennekamp
2024-02-20 22:09:48 +01:00
committed by Space Team
parent dc0f498b15
commit 7baaa38b8a
14 changed files with 55 additions and 21 deletions
@@ -36,7 +36,8 @@ object AnalysisApiFe10TestConfiguratorFactory : AnalysisApiTestConfiguratorFacto
TestModuleKind.ScriptSource, TestModuleKind.ScriptSource,
TestModuleKind.LibraryBinary, TestModuleKind.LibraryBinary,
TestModuleKind.LibrarySource, TestModuleKind.LibrarySource,
TestModuleKind.CodeFragment -> { TestModuleKind.CodeFragment,
TestModuleKind.NotUnderContentRoot -> {
false false
} }
} }
@@ -41,6 +41,8 @@ object AnalysisApiFirTestConfiguratorFactory : AnalysisApiTestConfiguratorFactor
AnalysisSessionMode.Normal -> AnalysisApiFirCodeFragmentTestConfigurator(analyseInDependentSession = false) AnalysisSessionMode.Normal -> AnalysisApiFirCodeFragmentTestConfigurator(analyseInDependentSession = false)
AnalysisSessionMode.Dependent -> AnalysisApiFirCodeFragmentTestConfigurator(analyseInDependentSession = true) AnalysisSessionMode.Dependent -> AnalysisApiFirCodeFragmentTestConfigurator(analyseInDependentSession = true)
} }
else -> unsupportedModeError(data)
} }
} }
@@ -59,6 +61,8 @@ object AnalysisApiFirTestConfiguratorFactory : AnalysisApiTestConfiguratorFactor
TestModuleKind.CodeFragment -> { TestModuleKind.CodeFragment -> {
data.analysisSessionMode == AnalysisSessionMode.Normal data.analysisSessionMode == AnalysisSessionMode.Normal
} }
TestModuleKind.NotUnderContentRoot -> false
} }
} }
} }
@@ -41,7 +41,8 @@ object AnalysisApiFirStandaloneModeTestConfiguratorFactory : AnalysisApiTestConf
} }
TestModuleKind.ScriptSource, TestModuleKind.ScriptSource,
TestModuleKind.LibrarySource -> { TestModuleKind.LibrarySource,
TestModuleKind.NotUnderContentRoot -> {
false false
} }
} }
@@ -9,6 +9,7 @@ import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.analysis.project.structure.DanglingFileResolutionMode import org.jetbrains.kotlin.analysis.project.structure.DanglingFileResolutionMode
import org.jetbrains.kotlin.analysis.project.structure.impl.KtDanglingFileModuleImpl import org.jetbrains.kotlin.analysis.project.structure.impl.KtDanglingFileModuleImpl
import org.jetbrains.kotlin.analysis.test.framework.services.expressionMarkerProvider import org.jetbrains.kotlin.analysis.test.framework.services.expressionMarkerProvider
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind
import org.jetbrains.kotlin.psi.KtBlockCodeFragment import org.jetbrains.kotlin.psi.KtBlockCodeFragment
import org.jetbrains.kotlin.psi.KtCodeFragment import org.jetbrains.kotlin.psi.KtCodeFragment
import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtElement
@@ -24,6 +25,9 @@ import org.jetbrains.kotlin.test.services.TestServices
import org.jetbrains.kotlin.test.services.sourceFileProvider import org.jetbrains.kotlin.test.services.sourceFileProvider
import java.nio.file.Path import java.nio.file.Path
/**
* @see TestModuleKind.CodeFragment
*/
object KtCodeFragmentModuleFactory : KtModuleFactory { object KtCodeFragmentModuleFactory : KtModuleFactory {
override fun createModule( override fun createModule(
testModule: TestModule, testModule: TestModule,
@@ -68,7 +72,7 @@ object KtCodeFragmentModuleFactory : KtModuleFactory {
DanglingFileResolutionMode.PREFER_SELF DanglingFileResolutionMode.PREFER_SELF
) )
return KtTestModule(testModule, module, listOf(codeFragment)) return KtTestModule(TestModuleKind.CodeFragment, testModule, module, listOf(codeFragment))
} }
private fun findContextElement(file: KtFile, testServices: TestServices): KtElement? { private fun findContextElement(file: KtFile, testServices: TestServices): KtElement? {
@@ -10,12 +10,13 @@ import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.Stand
import org.jetbrains.kotlin.analysis.test.framework.services.environmentManager import org.jetbrains.kotlin.analysis.test.framework.services.environmentManager
import org.jetbrains.kotlin.analysis.test.framework.services.libraries.compiledLibraryProvider import org.jetbrains.kotlin.analysis.test.framework.services.libraries.compiledLibraryProvider
import org.jetbrains.kotlin.analysis.test.framework.services.libraries.testModuleDecompiler import org.jetbrains.kotlin.analysis.test.framework.services.libraries.testModuleDecompiler
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind
import org.jetbrains.kotlin.test.model.TestModule import org.jetbrains.kotlin.test.model.TestModule
import org.jetbrains.kotlin.test.services.TestServices import org.jetbrains.kotlin.test.services.TestServices
import java.nio.file.Path import java.nio.file.Path
/** /**
* @see org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind.LibraryBinary * @see TestModuleKind.LibraryBinary
*/ */
object KtLibraryBinaryModuleFactory : KtModuleFactory { object KtLibraryBinaryModuleFactory : KtModuleFactory {
override fun createModule( override fun createModule(
@@ -29,6 +30,7 @@ object KtLibraryBinaryModuleFactory : KtModuleFactory {
val decompiledFiles = testServices.testModuleDecompiler.getAllPsiFilesFromLibrary(library, project) val decompiledFiles = testServices.testModuleDecompiler.getAllPsiFilesFromLibrary(library, project)
return KtTestModule( return KtTestModule(
TestModuleKind.LibraryBinary,
testModule, testModule,
KtLibraryModuleImpl( KtLibraryModuleImpl(
testModule.name, testModule.name,
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.analysis.api.impl.base.util.LibraryUtils
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.StandaloneProjectFactory import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.StandaloneProjectFactory
import org.jetbrains.kotlin.analysis.test.framework.services.environmentManager import org.jetbrains.kotlin.analysis.test.framework.services.environmentManager
import org.jetbrains.kotlin.analysis.test.framework.services.libraries.compiledLibraryProvider import org.jetbrains.kotlin.analysis.test.framework.services.libraries.compiledLibraryProvider
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind
import org.jetbrains.kotlin.test.model.TestModule 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.platform.isMultiPlatform import org.jetbrains.kotlin.platform.isMultiPlatform
@@ -18,7 +19,7 @@ import org.junit.Assume
import java.nio.file.Path import java.nio.file.Path
/** /**
* @see org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind.LibrarySource * @see TestModuleKind.LibrarySource
*/ */
object KtLibrarySourceModuleFactory : KtModuleFactory { object KtLibrarySourceModuleFactory : KtModuleFactory {
override fun createModule( override fun createModule(
@@ -73,5 +74,5 @@ fun createKtLibrarySourceModule(
) )
libraryKtModule.librarySources = librarySourceKtModule libraryKtModule.librarySources = librarySourceKtModule
return KtTestModule(testModule, librarySourceKtModule, decompiledPsiFilesFromSourceJar) return KtTestModule(TestModuleKind.LibrarySource, testModule, librarySourceKtModule, decompiledPsiFilesFromSourceJar)
} }
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.analysis.test.framework.project.structure
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.moduleKind import org.jetbrains.kotlin.analysis.test.framework.test.configurators.explicitTestModuleKind
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
@@ -46,11 +46,12 @@ private val TestServices.ktModuleFactory: KtModuleFactory by TestServices.testSe
* *
* @see org.jetbrains.kotlin.analysis.test.framework.services.DependencyKindModuleStructureTransformer * @see org.jetbrains.kotlin.analysis.test.framework.services.DependencyKindModuleStructureTransformer
*/ */
fun TestServices.getKtModuleFactoryForTestModule(testModule: TestModule): KtModuleFactory = when (testModule.moduleKind) { fun TestServices.getKtModuleFactoryForTestModule(testModule: TestModule): KtModuleFactory = when (testModule.explicitTestModuleKind) {
TestModuleKind.Source -> KtSourceModuleFactory TestModuleKind.Source -> KtSourceModuleFactory
TestModuleKind.LibraryBinary -> KtLibraryBinaryModuleFactory TestModuleKind.LibraryBinary -> KtLibraryBinaryModuleFactory
TestModuleKind.LibrarySource -> KtLibrarySourceModuleFactory TestModuleKind.LibrarySource -> KtLibrarySourceModuleFactory
TestModuleKind.ScriptSource -> KtScriptModuleFactory TestModuleKind.ScriptSource -> KtScriptModuleFactory
TestModuleKind.CodeFragment -> KtCodeFragmentModuleFactory TestModuleKind.CodeFragment -> KtCodeFragmentModuleFactory
TestModuleKind.NotUnderContentRoot -> error("Unsupported test module kind: ${TestModuleKind.NotUnderContentRoot}")
else -> ktModuleFactory else -> ktModuleFactory
} }
@@ -6,13 +6,14 @@
package org.jetbrains.kotlin.analysis.test.framework.project.structure package org.jetbrains.kotlin.analysis.test.framework.project.structure
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind
import org.jetbrains.kotlin.psi.KtFile 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.TestServices import org.jetbrains.kotlin.test.services.TestServices
import java.nio.file.Path import java.nio.file.Path
/** /**
* @see org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind.ScriptSource * @see TestModuleKind.ScriptSource
*/ */
object KtScriptModuleFactory : KtModuleFactory { object KtScriptModuleFactory : KtModuleFactory {
override fun createModule( override fun createModule(
@@ -30,6 +31,6 @@ object KtScriptModuleFactory : KtModuleFactory {
project, project,
) )
return KtTestModule(testModule, module, listOf(ktFile)) return KtTestModule(TestModuleKind.ScriptSource, testModule, module, listOf(ktFile))
} }
} }
@@ -7,12 +7,13 @@ package org.jetbrains.kotlin.analysis.test.framework.project.structure
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind
import org.jetbrains.kotlin.test.model.TestModule import org.jetbrains.kotlin.test.model.TestModule
import org.jetbrains.kotlin.test.services.TestServices import org.jetbrains.kotlin.test.services.TestServices
import java.nio.file.Path import java.nio.file.Path
/** /**
* @see org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind.Source * @see TestModuleKind.Source
*/ */
object KtSourceModuleFactory : KtModuleFactory { object KtSourceModuleFactory : KtModuleFactory {
override fun createModule( override fun createModule(
@@ -32,6 +33,6 @@ object KtSourceModuleFactory : KtModuleFactory {
GlobalSearchScope.filesScope(project, psiFiles.mapTo(mutableSetOf()) { it.virtualFile }), GlobalSearchScope.filesScope(project, psiFiles.mapTo(mutableSetOf()) { it.virtualFile }),
) )
return KtTestModule(testModule, module, psiFiles) return KtTestModule(TestModuleKind.Source, testModule, module, psiFiles)
} }
} }
@@ -11,6 +11,7 @@ import com.intellij.psi.PsiJavaFile
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.StandaloneProjectFactory.findJvmRootsForJavaFiles import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.StandaloneProjectFactory.findJvmRootsForJavaFiles
import org.jetbrains.kotlin.analysis.project.structure.KtBinaryModule import org.jetbrains.kotlin.analysis.project.structure.KtBinaryModule
import org.jetbrains.kotlin.analysis.project.structure.KtModule import org.jetbrains.kotlin.analysis.project.structure.KtModule
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind
import org.jetbrains.kotlin.test.model.TestModule import org.jetbrains.kotlin.test.model.TestModule
import kotlin.collections.addAll import kotlin.collections.addAll
import kotlin.collections.filterIsInstance import kotlin.collections.filterIsInstance
@@ -22,6 +23,7 @@ import kotlin.collections.mapTo
* the module structure configured by Analysis API tests. * the module structure configured by Analysis API tests.
*/ */
class KtTestModule( class KtTestModule(
val moduleKind: TestModuleKind,
val testModule: TestModule, val testModule: TestModule,
val ktModule: KtModule, val ktModule: KtModule,
val files: List<PsiFile>, val files: List<PsiFile>,
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.analysis.test.framework.services
import org.jetbrains.kotlin.analysis.test.framework.AnalysisApiTestDirectives import org.jetbrains.kotlin.analysis.test.framework.AnalysisApiTestDirectives
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.moduleKind import org.jetbrains.kotlin.analysis.test.framework.test.configurators.explicitTestModuleKind
import org.jetbrains.kotlin.test.TestInfrastructureInternals import org.jetbrains.kotlin.test.TestInfrastructureInternals
import org.jetbrains.kotlin.test.model.DependencyDescription import org.jetbrains.kotlin.test.model.DependencyDescription
import org.jetbrains.kotlin.test.model.DependencyKind import org.jetbrains.kotlin.test.model.DependencyKind
@@ -46,7 +46,7 @@ object DependencyKindModuleStructureTransformer : ModuleStructureTransformer() {
moduleMapping: Map<String, TestModule>, moduleMapping: Map<String, TestModule>,
): DependencyDescription { ): DependencyDescription {
val dependencyModule = moduleMapping.getValue(dependency.moduleName) val dependencyModule = moduleMapping.getValue(dependency.moduleName)
val newKind = when (dependencyModule.moduleKind) { val newKind = when (dependencyModule.explicitTestModuleKind) {
TestModuleKind.Source, TestModuleKind.Source,
TestModuleKind.LibrarySource, TestModuleKind.LibrarySource,
TestModuleKind.ScriptSource, TestModuleKind.ScriptSource,
@@ -58,6 +58,8 @@ object DependencyKindModuleStructureTransformer : ModuleStructureTransformer() {
DependencyKind.Binary DependencyKind.Binary
} }
TestModuleKind.NotUnderContentRoot -> error("A not-under-content-root module cannot be a dependency.")
null -> { null -> {
// There is no explicit module kind, so the dependency already has the right kind // There is no explicit module kind, so the dependency already has the right kind
return dependency return dependency
@@ -42,8 +42,13 @@ enum class TestModuleKind(val suffix: String) {
/** /**
* @see org.jetbrains.kotlin.analysis.test.framework.project.structure.KtCodeFragmentModuleFactory * @see org.jetbrains.kotlin.analysis.test.framework.project.structure.KtCodeFragmentModuleFactory
*/ */
CodeFragment("CodeFragment") CodeFragment("CodeFragment"),
/**
* This is currently only used in LL FIR tests and not supported by a test framework module factory.
*/
NotUnderContentRoot("NotUnderContentRoot"),
} }
val TestModule.moduleKind: TestModuleKind? val TestModule.explicitTestModuleKind: TestModuleKind?
get() = directives.singleOrZeroValue(AnalysisApiTestDirectives.MODULE_KIND) get() = directives.singleOrZeroValue(AnalysisApiTestDirectives.MODULE_KIND)
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.analysis.test.framework.services.configuration.Analy
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestServiceRegistrar import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestServiceRegistrar
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
import org.jetbrains.kotlin.test.services.TestModuleStructure import org.jetbrains.kotlin.test.services.TestModuleStructure
@@ -52,13 +53,20 @@ object FirLowLevelCompilerBasedTestConfigurator : AnalysisApiTestConfigurator()
val mainModules = moduleStructure.modules.map { testModule -> val mainModules = moduleStructure.modules.map { testModule ->
val files = TestModuleStructureFactory.createSourcePsiFiles(testModule, testServices, project) val files = TestModuleStructureFactory.createSourcePsiFiles(testModule, testServices, project)
val scriptFile = files.singleOrNull() as? KtFile val scriptFile = files.singleOrNull() as? KtFile
val ktModule = if (scriptFile?.isScript() == true) {
KtScriptModuleByCompilerConfiguration(project, testModule, scriptFile, testServices) val (ktModule, testModuleKind) = if (scriptFile?.isScript() == true) {
Pair(
KtScriptModuleByCompilerConfiguration(project, testModule, scriptFile, testServices),
TestModuleKind.ScriptSource,
)
} else { } else {
KtSourceModuleByCompilerConfiguration(project, testModule, files, testServices) Pair(
KtSourceModuleByCompilerConfiguration(project, testModule, files, testServices),
TestModuleKind.Source,
)
} }
KtTestModule(testModule, ktModule, files) KtTestModule(testModuleKind, testModule, ktModule, files)
} }
return KtTestModuleProjectStructure( return KtTestModuleProjectStructure(
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtModuleFa
import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtTestModuleProjectStructure import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtTestModuleProjectStructure
import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtTestModule import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtTestModule
import org.jetbrains.kotlin.analysis.test.framework.project.structure.TestModuleStructureFactory import org.jetbrains.kotlin.analysis.test.framework.project.structure.TestModuleStructureFactory
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind
import org.jetbrains.kotlin.analysis.test.framework.utils.SkipTestException import org.jetbrains.kotlin.analysis.test.framework.utils.SkipTestException
import org.jetbrains.kotlin.platform.TargetPlatform import org.jetbrains.kotlin.platform.TargetPlatform
import org.jetbrains.kotlin.resolve.PlatformDependentAnalyzerServices import org.jetbrains.kotlin.resolve.PlatformDependentAnalyzerServices
@@ -74,7 +75,7 @@ private object KtOutOfContentRootModuleFactory : KtModuleFactory {
val psiFiles = TestModuleStructureFactory.createSourcePsiFiles(testModule, testServices, project) val psiFiles = TestModuleStructureFactory.createSourcePsiFiles(testModule, testServices, project)
val platform = testModule.targetPlatform val platform = testModule.targetPlatform
val ktModule = KtNotUnderContentRootModuleForTest(testModule.name, psiFiles.first(), platform) val ktModule = KtNotUnderContentRootModuleForTest(testModule.name, psiFiles.first(), platform)
return KtTestModule(testModule, ktModule, psiFiles) return KtTestModule(TestModuleKind.NotUnderContentRoot, testModule, ktModule, psiFiles)
} }
} }