[Analysis API FE1.0] support multimodule tests for FE1.0 Analysis API
This commit is contained in:
committed by
Space Team
parent
803c3b88ac
commit
b05a6e6e02
+26
-13
@@ -9,6 +9,9 @@ import com.intellij.openapi.extensions.AreaInstance
|
|||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import com.intellij.openapi.vfs.VirtualFile
|
import com.intellij.openapi.vfs.VirtualFile
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin
|
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin
|
||||||
|
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
||||||
|
import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule
|
||||||
|
import org.jetbrains.kotlin.analysis.project.structure.getKtModule
|
||||||
import org.jetbrains.kotlin.analyzer.AnalysisResult
|
import org.jetbrains.kotlin.analyzer.AnalysisResult
|
||||||
import org.jetbrains.kotlin.container.ComponentProvider
|
import org.jetbrains.kotlin.container.ComponentProvider
|
||||||
import org.jetbrains.kotlin.container.get
|
import org.jetbrains.kotlin.container.get
|
||||||
@@ -30,33 +33,30 @@ import org.jetbrains.kotlin.resolve.extensions.AnalysisHandlerExtension
|
|||||||
import org.jetbrains.kotlin.resolve.lazy.ResolveSession
|
import org.jetbrains.kotlin.resolve.lazy.ResolveSession
|
||||||
import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner
|
import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner
|
||||||
import org.jetbrains.kotlin.util.CancellationChecker
|
import org.jetbrains.kotlin.util.CancellationChecker
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
|
|
||||||
|
|
||||||
class CliFe10AnalysisFacade(project: Project) : Fe10AnalysisFacade {
|
|
||||||
private val handler by lazy { KtFe10AnalysisHandlerExtension.getInstance(project) }
|
|
||||||
|
|
||||||
|
class CliFe10AnalysisFacade(private val project: Project) : Fe10AnalysisFacade {
|
||||||
override fun getResolveSession(element: KtElement): ResolveSession {
|
override fun getResolveSession(element: KtElement): ResolveSession {
|
||||||
return handler.resolveSession ?: error("Resolution is not performed")
|
return getHandler(element).resolveSession ?: error("Resolution is not performed")
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getDeprecationResolver(element: KtElement): DeprecationResolver {
|
override fun getDeprecationResolver(element: KtElement): DeprecationResolver {
|
||||||
return handler.deprecationResolver ?: error("Resolution is not performed")
|
return getHandler(element).deprecationResolver ?: error("Resolution is not performed")
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getCallResolver(element: KtElement): CallResolver {
|
override fun getCallResolver(element: KtElement): CallResolver {
|
||||||
return handler.callResolver ?: error("Resolution is not performed")
|
return getHandler(element).callResolver ?: error("Resolution is not performed")
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getKotlinToResolvedCallTransformer(element: KtElement): KotlinToResolvedCallTransformer {
|
override fun getKotlinToResolvedCallTransformer(element: KtElement): KotlinToResolvedCallTransformer {
|
||||||
return handler.kotlinToResolvedCallTransformer ?: error("Resolution is not performed")
|
return getHandler(element).kotlinToResolvedCallTransformer ?: error("Resolution is not performed")
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getOverloadingConflictResolver(element: KtElement): OverloadingConflictResolver<ResolvedCall<*>> {
|
override fun getOverloadingConflictResolver(element: KtElement): OverloadingConflictResolver<ResolvedCall<*>> {
|
||||||
return handler.overloadingConflictResolver ?: error("Resolution is not performed")
|
return getHandler(element).overloadingConflictResolver ?: error("Resolution is not performed")
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getKotlinTypeRefiner(element: KtElement): KotlinTypeRefiner {
|
override fun getKotlinTypeRefiner(element: KtElement): KotlinTypeRefiner {
|
||||||
return handler.kotlinTypeRefiner ?: error("Resolution is not performed")
|
return getHandler(element).kotlinTypeRefiner ?: error("Resolution is not performed")
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun analyze(element: KtElement, mode: Fe10AnalysisFacade.AnalysisMode): BindingContext {
|
override fun analyze(element: KtElement, mode: Fe10AnalysisFacade.AnalysisMode): BindingContext {
|
||||||
@@ -66,12 +66,19 @@ class CliFe10AnalysisFacade(project: Project) : Fe10AnalysisFacade {
|
|||||||
override fun getOrigin(file: VirtualFile): KtSymbolOrigin {
|
override fun getOrigin(file: VirtualFile): KtSymbolOrigin {
|
||||||
return KtSymbolOrigin.SOURCE
|
return KtSymbolOrigin.SOURCE
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun getHandler(useSiteElement: KtElement): KtFe10AnalysisHandlerExtension {
|
||||||
|
val ktModule = useSiteElement.getKtModule(project)
|
||||||
|
return KtFe10AnalysisHandlerExtension.getInstance(ktModule.project, ktModule)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class KtFe10AnalysisHandlerExtension : AnalysisHandlerExtension {
|
class KtFe10AnalysisHandlerExtension(private val useSiteModule: KtSourceModule) : AnalysisHandlerExtension {
|
||||||
internal companion object {
|
internal companion object {
|
||||||
fun getInstance(area: AreaInstance): KtFe10AnalysisHandlerExtension {
|
fun getInstance(area: AreaInstance, module: KtModule): KtFe10AnalysisHandlerExtension {
|
||||||
return AnalysisHandlerExtension.extensionPointName.getExtensions(area).firstIsInstanceOrNull()
|
return AnalysisHandlerExtension.extensionPointName.getExtensions(area)
|
||||||
|
.filterIsInstance<KtFe10AnalysisHandlerExtension>()
|
||||||
|
.firstOrNull { it.useSiteModule == module }
|
||||||
?: error(KtFe10AnalysisHandlerExtension::class.java.name + " should be registered")
|
?: error(KtFe10AnalysisHandlerExtension::class.java.name + " should be registered")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -102,6 +109,12 @@ class KtFe10AnalysisHandlerExtension : AnalysisHandlerExtension {
|
|||||||
bindingTrace: BindingTrace,
|
bindingTrace: BindingTrace,
|
||||||
componentProvider: ComponentProvider
|
componentProvider: ComponentProvider
|
||||||
): AnalysisResult? {
|
): AnalysisResult? {
|
||||||
|
if (module.name.asString().removeSurrounding("<", ">") != useSiteModule.moduleName) {
|
||||||
|
// there is no way to properly map KtModule to ModuleDescriptor,
|
||||||
|
// KtFe10AnalysisHandlerExtension is used only for tests, so just by name comparasion should work as all module names are different
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
resolveSession = componentProvider.get()
|
resolveSession = componentProvider.get()
|
||||||
deprecationResolver = componentProvider.get()
|
deprecationResolver = componentProvider.get()
|
||||||
callResolver = componentProvider.get()
|
callResolver = componentProvider.get()
|
||||||
|
|||||||
+6
-1
@@ -14,6 +14,8 @@ import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisHandlerExtens
|
|||||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSessionProvider
|
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSessionProvider
|
||||||
import org.jetbrains.kotlin.analysis.api.descriptors.references.ReadWriteAccessCheckerDescriptorsImpl
|
import org.jetbrains.kotlin.analysis.api.descriptors.references.ReadWriteAccessCheckerDescriptorsImpl
|
||||||
import org.jetbrains.kotlin.analysis.api.session.KtAnalysisSessionProvider
|
import org.jetbrains.kotlin.analysis.api.session.KtAnalysisSessionProvider
|
||||||
|
import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule
|
||||||
|
import org.jetbrains.kotlin.analysis.test.framework.project.structure.ktModuleProvider
|
||||||
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestServiceRegistrar
|
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestServiceRegistrar
|
||||||
import org.jetbrains.kotlin.cli.common.CliModuleVisibilityManagerImpl
|
import org.jetbrains.kotlin.cli.common.CliModuleVisibilityManagerImpl
|
||||||
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
|
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
|
||||||
@@ -41,7 +43,10 @@ object AnalysisApiFe10TestServiceRegistrar : AnalysisApiTestServiceRegistrar() {
|
|||||||
registerService(ReadWriteAccessChecker::class.java, ReadWriteAccessCheckerDescriptorsImpl())
|
registerService(ReadWriteAccessChecker::class.java, ReadWriteAccessCheckerDescriptorsImpl())
|
||||||
registerService(KotlinReferenceProviderContributor::class.java, KtFe10KotlinReferenceProviderContributor::class.java)
|
registerService(KotlinReferenceProviderContributor::class.java, KtFe10KotlinReferenceProviderContributor::class.java)
|
||||||
}
|
}
|
||||||
AnalysisHandlerExtension.registerExtension(project, KtFe10AnalysisHandlerExtension())
|
testServices.ktModuleProvider.getModuleStructure().mainModules.forEach { module ->
|
||||||
|
val sourceModule = module.ktModule as? KtSourceModule ?: return@forEach
|
||||||
|
AnalysisHandlerExtension.registerExtension(project, KtFe10AnalysisHandlerExtension(sourceModule))
|
||||||
|
}
|
||||||
KotlinCoreEnvironment.registerKotlinLightClassSupport(project)
|
KotlinCoreEnvironment.registerKotlinLightClassSupport(project)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user