diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/test/configurators/library/AnalysisApiLibrarySourceTestConfigurator.kt b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/test/configurators/library/AnalysisApiLibrarySourceTestConfigurator.kt new file mode 100644 index 00000000000..71a2368da2a --- /dev/null +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/test/configurators/library/AnalysisApiLibrarySourceTestConfigurator.kt @@ -0,0 +1,108 @@ +/* + * Copyright 2010-2022 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.api.fir.test.configurators.library + +import com.intellij.openapi.Disposable +import com.intellij.openapi.project.Project +import com.intellij.psi.PsiManager +import com.intellij.psi.search.GlobalSearchScope +import org.jetbrains.kotlin.analysis.api.fir.test.configurators.source.AnalysisApiFirSourceTestConfigurator +import org.jetbrains.kotlin.analysis.api.impl.base.test.configurators.AnalysisApiBaseTestServiceRegistrar +import org.jetbrains.kotlin.analysis.api.impl.base.test.configurators.AnalysisApiLibraryBaseTestServiceRegistrar +import org.jetbrains.kotlin.analysis.api.impl.base.util.LibraryUtils +import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleWithFiles +import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.AnalysisApiFirTestServiceRegistrar +import org.jetbrains.kotlin.analysis.project.structure.KtLibraryModule +import org.jetbrains.kotlin.analysis.project.structure.KtLibrarySourceModule +import org.jetbrains.kotlin.analysis.project.structure.KtModule +import org.jetbrains.kotlin.analysis.test.framework.project.structure.TestKtLibrarySourceModule +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.AnalysisApiTestConfigurator +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestServiceRegistrar +import org.jetbrains.kotlin.platform.TargetPlatform +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.resolve.PlatformDependentAnalyzerServices +import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder +import org.jetbrains.kotlin.test.frontend.fir.getAnalyzerServices +import org.jetbrains.kotlin.test.model.TestModule +import org.jetbrains.kotlin.test.services.ServiceRegistrationData +import org.jetbrains.kotlin.test.services.TestModuleStructure +import org.jetbrains.kotlin.test.services.TestServices +import java.nio.file.Path + +object AnalysisApiLibrarySourceTestConfigurator : AnalysisApiTestConfigurator() { + override val analyseInDependentSession: Boolean get() = false + + override fun configureTest( + builder: TestConfigurationBuilder, + disposable: Disposable + ) { + builder.useAdditionalServices(ServiceRegistrationData(CompiledLibraryProvider::class, ::CompiledLibraryProvider)) + } + + override fun createModules( + moduleStructure: TestModuleStructure, + testServices: TestServices, + project: Project + ): List { + val testModule = moduleStructure.modules.single() + val (libraryJar, librarySourcesJar) = testServices.compiledLibraryProvider.compileToLibrary(testModule) + + val libraryKtModule = KtTestLibraryModule(project, testModule, libraryJar) + + val librarySourceFiles = LibraryUtils + .getAllPsiFilesFromTheJar(librarySourcesJar, project) + + val sourcesKtModule = TestKtLibrarySourceModule( + project, + testModule, + librarySourceFiles, + testServices, + libraryKtModule + ) + libraryKtModule.librarySources = sourcesKtModule + + return listOf( + KtModuleWithFiles(sourcesKtModule, librarySourceFiles), + ) + } + + override val serviceRegistrars: List = + listOf( + AnalysisApiBaseTestServiceRegistrar, + AnalysisApiFirTestServiceRegistrar, + AnalysisApiLibraryBaseTestServiceRegistrar, + ) + + + override fun doOutOfBlockModification(file: KtFile) { + AnalysisApiFirSourceTestConfigurator(analyseInDependentSession = false).doOutOfBlockModification(file) + } +} + +private class KtTestLibraryModule( + override val project: Project, + private val testModule: TestModule, + private val jar: Path +) : KtLibraryModule { + override val directRegularDependencies: List get() = emptyList() + override val directRefinementDependencies: List get() = emptyList() + override val directFriendDependencies: List get() = emptyList() + + override val contentScope: GlobalSearchScope by lazy { + GlobalSearchScope.filesScope(project, LibraryUtils.getAllVirtualFilesFromJar(jar)) + } + + override fun getBinaryRoots(): Collection = listOf(jar) + override val libraryName: String get() = testModule.name + + override lateinit var librarySources: KtLibrarySourceModule + + override val platform: TargetPlatform get() = testModule.targetPlatform + override val analyzerServices: PlatformDependentAnalyzerServices get() = testModule.targetPlatform.getAnalyzerServices() +} + diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/callResolver/importOptimizer/AbstractAnalysisApiImportOptimizerTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/callResolver/importOptimizer/AbstractAnalysisApiImportOptimizerTest.kt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/callResolver/psiTypeProvider/AbstractAnalysisApiExpressionPsiTypeProviderTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/callResolver/psiTypeProvider/AbstractAnalysisApiExpressionPsiTypeProviderTest.kt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/callResolver/psiTypeProvider/AbstractAnalysisApiPsiTypeProviderTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/callResolver/psiTypeProvider/AbstractAnalysisApiPsiTypeProviderTest.kt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/callResolver/typeProvider/AbstractAnalysisApiGetSuperTypesTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/callResolver/typeProvider/AbstractAnalysisApiGetSuperTypesTest.kt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/StandaloneModeConfigurator.kt b/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/StandaloneModeConfigurator.kt new file mode 100644 index 00000000000..9c4680c514d --- /dev/null +++ b/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/StandaloneModeConfigurator.kt @@ -0,0 +1,40 @@ +/* + * Copyright 2010-2022 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.api.standalone + +import com.intellij.openapi.Disposable +import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.analysis.api.fir.test.configurators.source.AnalysisApiFirSourceTestConfigurator +import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleWithFiles +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestServiceRegistrar +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder +import org.jetbrains.kotlin.test.services.TestModuleStructure +import org.jetbrains.kotlin.test.services.TestServices + +object StandaloneModeConfigurator : AnalysisApiTestConfigurator() { + override val analyseInDependentSession: Boolean get() = false + + override fun configureTest(builder: TestConfigurationBuilder, disposable: Disposable) { + AnalysisApiFirSourceTestConfigurator(analyseInDependentSession = false).configureTest(builder, disposable) + } + + override val serviceRegistrars: List + get() = AnalysisApiFirSourceTestConfigurator(analyseInDependentSession = false).serviceRegistrars + + override fun createModules( + moduleStructure: TestModuleStructure, + testServices: TestServices, + project: Project + ): List { + return AnalysisApiFirSourceTestConfigurator(analyseInDependentSession = false).createModules(moduleStructure, testServices, project) + } + + override fun doOutOfBlockModification(file: KtFile) { + AnalysisApiFirSourceTestConfigurator(analyseInDependentSession = false).doOutOfBlockModification(file) + } +} diff --git a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/base/AbstractAnalysisApiBasedTest.kt b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/base/AbstractAnalysisApiBasedTest.kt index 865275f3eae..dd14194dcf8 100644 --- a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/base/AbstractAnalysisApiBasedTest.kt +++ b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/base/AbstractAnalysisApiBasedTest.kt @@ -10,12 +10,16 @@ import com.intellij.openapi.util.Disposer import com.intellij.psi.util.PsiTreeUtil import com.intellij.testFramework.TestDataFile import junit.framework.ComparisonFailure +import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.analyse +import org.jetbrains.kotlin.analysis.api.analyseInDependedAnalysisSession import org.jetbrains.kotlin.analysis.api.* import org.jetbrains.kotlin.analysis.test.framework.AnalysisApiTestDirectives import org.jetbrains.kotlin.analysis.test.framework.TestWithDisposable import org.jetbrains.kotlin.analysis.test.framework.project.structure.ktModuleProvider import org.jetbrains.kotlin.analysis.test.framework.services.ExpressionMarkerProvider import org.jetbrains.kotlin.analysis.test.framework.services.ExpressionMarkersSourceFilePreprocessor +import org.jetbrains.kotlin.analysis.test.framework.services.libraries.LibraryWasNotCompiledDueToExpectedCompilationError import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator import org.jetbrains.kotlin.analysis.test.framework.utils.SkipTestException import org.jetbrains.kotlin.platform.jvm.JvmPlatforms @@ -114,12 +118,6 @@ abstract class AbstractAnalysisApiBasedTest : TestWithDisposable() { useAdditionalService { ExpressionMarkerProvider() } registerAnalysisApiBaseTestServices(disposable, configurator) - - useAdditionalService(::TestKtModuleProvider) - useAdditionalService { ExecutionListenerBasedDisposableProvider() } - useAdditionalService { StandardLibrariesPathProviderForKotlinProject } - useDirectives(AnalysisApiTestDirectives) - configureTest(this) startingArtifactFactory = { ResultingArtifact.Source() } diff --git a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/base/registerBaseTestServices.kt b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/base/registerBaseTestServices.kt index 77a7c710ff6..396617a8692 100644 --- a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/base/registerBaseTestServices.kt +++ b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/base/registerBaseTestServices.kt @@ -6,13 +6,18 @@ package org.jetbrains.kotlin.analysis.test.framework.base import com.intellij.openapi.Disposable +import org.jetbrains.kotlin.analysis.test.framework.AnalysisApiTestDirectives import org.jetbrains.kotlin.analysis.test.framework.project.structure.AnalysisApiKtModuleProvider import org.jetbrains.kotlin.analysis.test.framework.project.structure.AnalysisApiKtModuleProviderImpl import org.jetbrains.kotlin.analysis.test.framework.services.* import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator +import org.jetbrains.kotlin.test.ExecutionListenerBasedDisposableProvider import org.jetbrains.kotlin.test.TestInfrastructureInternals import org.jetbrains.kotlin.test.bind import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder +import org.jetbrains.kotlin.test.services.ApplicationDisposableProvider +import org.jetbrains.kotlin.test.services.KotlinStandardLibrariesPathProvider +import org.jetbrains.kotlin.test.services.StandardLibrariesPathProviderForKotlinProject @OptIn(TestInfrastructureInternals::class) fun TestConfigurationBuilder.registerAnalysisApiBaseTestServices( @@ -22,7 +27,10 @@ fun TestConfigurationBuilder.registerAnalysisApiBaseTestServices( useAdditionalService(::TestDisposableProviderImpl) useAdditionalService(::AnalysisApiKtModuleProviderImpl) useAdditionalService(::AnalysisApiEnvironmentManagerImpl.bind(testDisposable)) + useAdditionalService { ExecutionListenerBasedDisposableProvider() } + useAdditionalService { StandardLibrariesPathProviderForKotlinProject } useCustomCompilerConfigurationProvider(::AnalysisApiTestCompilerConfiguratorProvider) usePreAnalysisHandlers(::ProjectStructureInitialisationPreAnalysisHandler.bind(configurator)) + useDirectives(AnalysisApiTestDirectives) } \ No newline at end of file diff --git a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/project/structure/KotlinKtModuleProviderTestImpl.kt b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/project/structure/KotlinKtModuleProviderTestImpl.kt deleted file mode 100644 index eee84b48e21..00000000000 --- a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/project/structure/KotlinKtModuleProviderTestImpl.kt +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Copyright 2010-2022 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.test.framework.project.structure - diff --git a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/services/AnalysisApiEnvironmentManager.kt b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/services/AnalysisApiEnvironmentManager.kt index b22839e1362..e9d1b96562f 100644 --- a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/services/AnalysisApiEnvironmentManager.kt +++ b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/services/AnalysisApiEnvironmentManager.kt @@ -15,10 +15,7 @@ import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreProjectEnvironment import org.jetbrains.kotlin.config.JVMConfigurationKeys import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.test.ApplicationEnvironmentDisposer -import org.jetbrains.kotlin.test.services.TestService -import org.jetbrains.kotlin.test.services.TestServices -import org.jetbrains.kotlin.test.services.compilerConfigurationProvider -import org.jetbrains.kotlin.test.services.moduleStructure +import org.jetbrains.kotlin.test.services.* abstract class AnalysisApiEnvironmentManager : TestService { abstract val testServices: TestServices @@ -43,7 +40,7 @@ class AnalysisApiEnvironmentManagerImpl( private val _projectEnvironment: KotlinCoreProjectEnvironment by lazy { StandaloneProjectFactory.createProjectEnvironment( testRootDisposable, - ApplicationEnvironmentDisposer.ROOT_DISPOSABLE + testServices.applicationDisposableProvider.getApplicationRootDisposable(), ) } @@ -66,7 +63,7 @@ class AnalysisApiEnvironmentManagerImpl( useSiteCompilerConfiguration.get(JVMConfigurationKeys.JDK_HOME)?.toPath(), ) - testServices.compilerConfigurationProvider.registerCompilerExtensions(getProject(), useSiteModule) + testServices.compilerConfigurationProvider.registerCompilerExtensions(getProject(), useSiteModule, useSiteCompilerConfiguration) } override fun getProjectEnvironment(): KotlinCoreProjectEnvironment = diff --git a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/services/AnalysisApiTestCompilerConfiguratorProvider.kt b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/services/AnalysisApiTestCompilerConfiguratorProvider.kt index ecbbe0a27e3..17f8090f480 100644 --- a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/services/AnalysisApiTestCompilerConfiguratorProvider.kt +++ b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/services/AnalysisApiTestCompilerConfiguratorProvider.kt @@ -21,10 +21,10 @@ import org.jetbrains.kotlin.test.model.TestModule import org.jetbrains.kotlin.test.services.* class AnalysisApiTestCompilerConfiguratorProvider( - override val testServices: TestServices, + testServices: TestServices, override val testRootDisposable: Disposable, override val configurators: List -) : CompilerConfigurationProvider() { +) : CompilerConfigurationProvider(testServices) { private val configurationCache: MutableMap = mutableMapOf() private val allProjectBinaryRoots by lazy { diff --git a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/services/libraries/TestModuleCompiler.kt b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/services/libraries/TestModuleCompiler.kt index 6da54ee8756..5bcdeaf4da9 100644 --- a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/services/libraries/TestModuleCompiler.kt +++ b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/services/libraries/TestModuleCompiler.kt @@ -43,7 +43,7 @@ internal object TestModuleCompiler { JarOutputStream(librarySourcesPath.outputStream(), manifest).use { jarOutputStream -> for (testFile in module.files) { val text = testServices.sourceFileProvider.getContentOfSourceFile(testFile) - addFileToJar(testFile.name, text, jarOutputStream) + addFileToJar(testFile.relativePath, text, jarOutputStream) } } return librarySourcesPath diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/AbstractCompilerBasedTestForFir.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/AbstractCompilerBasedTestForFir.kt index 96f33538055..2d11f821fda 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/AbstractCompilerBasedTestForFir.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/AbstractCompilerBasedTestForFir.kt @@ -46,14 +46,7 @@ abstract class AbstractCompilerBasedTestForFir : AbstractCompilerBasedTest() { configureTest() defaultConfiguration(this) - registerAnalysisApiBaseTestServices(disposable, FirLowLevelAnalysisApiTestConfigurator) - - useAdditionalService { ExecutionListenerBasedDisposableProvider() } - useAdditionalService { StandardLibrariesPathProviderForKotlinProject } - useAdditionalService(::TestKtModuleProvider) - usePreAnalysisHandlers(::ModuleRegistrarPreAnalysisHandler.bind(disposable, true)) - usePreAnalysisHandlers(::SealedClassesInheritorsCaclulatorPreAnalysisHandler) - + registerAnalysisApiBaseTestServices(disposable, FirLowLevelCompilerBasedTestConfigurator) firHandlersStep { useHandlers(::LLDiagnosticParameterChecker) diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/CompilerConfigurationProvider.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/CompilerConfigurationProvider.kt index ac366d9ec90..29c62251379 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/CompilerConfigurationProvider.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/CompilerConfigurationProvider.kt @@ -36,7 +36,6 @@ import org.jetbrains.kotlin.test.model.TestModule import java.io.File abstract class CompilerConfigurationProvider(val testServices: TestServices) : TestService { - abstract val testServices: TestServices abstract val testRootDisposable: Disposable abstract val configurators: List @@ -46,8 +45,8 @@ abstract class CompilerConfigurationProvider(val testServices: TestServices) : T return getKotlinCoreEnvironment(module).project } - fun registerCompilerExtensions(project: Project, module: TestModule) { - configurators.forEach { it.registerCompilerExtensions(project, module) } + fun registerCompilerExtensions(project: Project, module: TestModule, configuration: CompilerConfiguration) { + configurators.forEach { it.registerCompilerExtensions(project, module, configuration) } } open fun getPackagePartProviderFactory(module: TestModule): (GlobalSearchScope) -> JvmPackagePartProvider { @@ -72,7 +71,7 @@ abstract class CompilerConfigurationProvider(val testServices: TestServices) : T val TestServices.compilerConfigurationProvider: CompilerConfigurationProvider by TestServices.testServiceAccessor() open class CompilerConfigurationProviderImpl( - override val testServices: TestServices, + testServices: TestServices, override val testRootDisposable: Disposable, override val configurators: List ) : CompilerConfigurationProvider(testServices) { @@ -101,6 +100,7 @@ open class CompilerConfigurationProviderImpl( ).also { registerCompilerExtensions(projectEnv.project, module, configuration) } } + @OptIn(TestInfrastructureInternals::class) fun createCompilerConfiguration(module: TestModule): CompilerConfiguration { return createCompilerConfiguration(module, configurators)