AA: refactor service registrations

such that AA standalone mode doesn't need to unregister services that
were already registered by pre-analysis handlers
This commit is contained in:
Jinseong Jeon
2022-02-03 20:32:06 -08:00
committed by Ilya Kirillov
parent 26e923e3ae
commit a986aff429
18 changed files with 211 additions and 112 deletions
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.analysis.api.standalone;
import com.intellij.mock.MockProject;
import org.jetbrains.annotations.TestOnly;
import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirResolveStateService;
class RegisterComponentService {
@@ -16,9 +15,4 @@ class RegisterComponentService {
new LLFirResolveStateService(project)
);
}
@TestOnly
static void unregisterLLFirResolveStateService(MockProject project) {
project.getPicoContainer().unregisterComponent(LLFirResolveStateService.class.getName());
}
}
@@ -5,48 +5,22 @@
package org.jetbrains.kotlin.analysis.api.standalone
import com.intellij.mock.MockProject
import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.kotlin.analysis.api.InvalidWayOfUsingAnalysisSession
import org.jetbrains.kotlin.analysis.api.KtAnalysisSessionProvider
import org.jetbrains.kotlin.analysis.api.components.KtDeclarationRendererOptions
import org.jetbrains.kotlin.analysis.api.components.RendererModifier
import org.jetbrains.kotlin.analysis.api.impl.barebone.test.expressionMarkerProvider
import org.jetbrains.kotlin.analysis.api.impl.base.test.TestReferenceResolveResultRenderer.renderResolvedTo
import org.jetbrains.kotlin.analysis.api.impl.base.test.findReferencesAtCaret
import org.jetbrains.kotlin.analysis.api.impl.base.test.test.framework.AbstractHLApiSingleModuleTest
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.services.FirSealedClassInheritorsProcessorFactory
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.services.PackagePartProviderFactory
import org.jetbrains.kotlin.analysis.project.structure.KtModuleScopeProvider
import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider
import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProviderFactory
import org.jetbrains.kotlin.analysis.providers.KotlinModificationTrackerFactory
import org.jetbrains.kotlin.analysis.providers.KotlinPackageProviderFactory
import org.jetbrains.kotlin.cli.jvm.config.addJavaSourceRoots
import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.test.model.TestModule
import org.jetbrains.kotlin.test.services.TestServices
import org.jetbrains.kotlin.test.services.assertions
import org.jetbrains.kotlin.test.services.compilerConfigurationProvider
import java.io.File
abstract class AbstractStandaloneModeSingleModuleTest : AbstractHLApiSingleModuleTest() {
override fun doTestByFileStructure(ktFiles: List<KtFile>, module: TestModule, testServices: TestServices) {
val project = testServices.compilerConfigurationProvider.getProject(module) as MockProject
// (project.picoContainer as DefaultPicoContainer).release() // is way too strong :( even PsiManager is gone
unregisterServices(project)
// TODO: better to be part of `StandaloneModeUtilsConfiguratorService`
val compilerConfiguration = testServices.compilerConfigurationProvider.getCompilerConfiguration(module)
compilerConfiguration.addJavaSourceRoots(ktFiles.map { File(it.virtualFilePath) })
configureProjectEnvironment(
project,
compilerConfiguration,
ktFiles,
testServices.compilerConfigurationProvider.getPackagePartProviderFactory(module)
)
val mainKtFile = ktFiles.singleOrNull() ?: ktFiles.first { it.name == "main.kt" }
val caretPosition = testServices.expressionMarkerProvider.getCaretPosition(mainKtFile)
val ktReferences = findReferencesAtCaret(mainKtFile, caretPosition)
@@ -70,17 +44,4 @@ abstract class AbstractStandaloneModeSingleModuleTest : AbstractHLApiSingleModul
modifiers = RendererModifier.DEFAULT - RendererModifier.ANNOTATIONS,
sortNestedDeclarations = true
)
@OptIn(InvalidWayOfUsingAnalysisSession::class)
private fun unregisterServices(project: MockProject) {
project.picoContainer.unregisterComponent(KtAnalysisSessionProvider::class.qualifiedName)
project.picoContainer.unregisterComponent(KotlinModificationTrackerFactory::class.qualifiedName)
RegisterComponentService.unregisterLLFirResolveStateService(project)
project.picoContainer.unregisterComponent(FirSealedClassInheritorsProcessorFactory::class.qualifiedName)
project.picoContainer.unregisterComponent(KtModuleScopeProvider::class.qualifiedName)
project.picoContainer.unregisterComponent(ProjectStructureProvider::class.qualifiedName)
project.picoContainer.unregisterComponent(KotlinDeclarationProviderFactory::class.qualifiedName)
project.picoContainer.unregisterComponent(KotlinPackageProviderFactory::class.qualifiedName)
project.picoContainer.unregisterComponent(PackagePartProviderFactory::class.qualifiedName)
}
}
@@ -8,8 +8,12 @@ package org.jetbrains.kotlin.analysis.api.standalone
import com.intellij.mock.MockApplication
import com.intellij.mock.MockProject
import com.intellij.openapi.Disposable
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analysis.api.fir.FirFrontendApiTestConfiguratorService
import org.jetbrains.kotlin.analysis.api.impl.barebone.test.FrontendApiTestConfiguratorService
import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.load.kotlin.PackagePartProvider
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
@@ -21,9 +25,14 @@ object StandaloneModeConfiguratorService : FrontendApiTestConfiguratorService {
with(FirFrontendApiTestConfiguratorService) { configureTest(disposable) }
}
// TODO: other variant to register project services by compiler configuration?
override fun registerProjectServices(project: MockProject) {
// Will be configured at the test
override fun registerProjectServices(
project: MockProject,
compilerConfig: CompilerConfiguration,
files: List<KtFile>,
packagePartProvider: (GlobalSearchScope) -> PackagePartProvider,
projectStructureProvider: ProjectStructureProvider
) {
configureProjectEnvironment(project, compilerConfig, files, packagePartProvider)
}
override fun registerApplicationServices(application: MockApplication) {