AA: look up built-ins module for deserialized declarations from built-ins

This commit is contained in:
Jinseong Jeon
2022-09-06 13:43:31 -07:00
committed by Ilya Kirillov
parent df95602e06
commit 5bf333f6f5
5 changed files with 41 additions and 3 deletions
@@ -8,14 +8,22 @@ package org.jetbrains.kotlin.analysis.api.standalone.base.project.structure
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.analysis.project.structure.* import org.jetbrains.kotlin.analysis.project.structure.*
import org.jetbrains.kotlin.psi.psiUtil.contains import org.jetbrains.kotlin.psi.psiUtil.contains
import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerializerProtocol
class KtStaticModuleProvider( class KtStaticModuleProvider(
private val builtinsModule: KtBuiltinsModule,
val projectStructure: KtModuleProjectStructure, val projectStructure: KtModuleProjectStructure,
) : ProjectStructureProvider() { ) : ProjectStructureProvider() {
override fun getKtModuleForKtElement(element: PsiElement): KtModule { override fun getKtModuleForKtElement(element: PsiElement): KtModule {
val containingFileAsPsiFile = element.containingFile
val containingFileAsVirtualFile = containingFileAsPsiFile.virtualFile
if (containingFileAsVirtualFile.extension == BuiltInSerializerProtocol.BUILTINS_FILE_EXTENSION) {
return builtinsModule
}
return projectStructure.mainModules return projectStructure.mainModules
.first { module -> .first { module ->
module.ktModule.contentScope.contains(element) element in module.ktModule.contentScope
}.ktModule }.ktModule
} }
} }
@@ -5,9 +5,11 @@
package org.jetbrains.kotlin.analysis.project.structure.builder package org.jetbrains.kotlin.analysis.project.structure.builder
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.analysis.project.structure.KtModule import org.jetbrains.kotlin.analysis.project.structure.KtModule
import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider
import org.jetbrains.kotlin.analysis.project.structure.impl.KtModuleProviderImpl import org.jetbrains.kotlin.analysis.project.structure.impl.KtModuleProviderImpl
import org.jetbrains.kotlin.platform.TargetPlatform
import kotlin.contracts.ExperimentalContracts import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.InvocationKind import kotlin.contracts.InvocationKind
import kotlin.contracts.contract import kotlin.contracts.contract
@@ -20,8 +22,13 @@ public class KtModuleProviderBuilder {
mainModules.add(module) mainModules.add(module)
} }
public lateinit var platform: TargetPlatform
public lateinit var project: Project
public fun build(): ProjectStructureProvider { public fun build(): ProjectStructureProvider {
return KtModuleProviderImpl( return KtModuleProviderImpl(
platform,
project,
mainModules, mainModules,
) )
} }
@@ -5,15 +5,21 @@
package org.jetbrains.kotlin.analysis.project.structure.impl package org.jetbrains.kotlin.analysis.project.structure.impl
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile import com.intellij.psi.PsiFile
import com.intellij.psi.PsiFileSystemItem import com.intellij.psi.PsiFileSystemItem
import com.intellij.psi.PsiJavaFile import com.intellij.psi.PsiJavaFile
import com.intellij.util.containers.ContainerUtil import com.intellij.util.containers.ContainerUtil
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.low.level.api.fir.project.structure.LLFirBuiltinsSessionFactory
import org.jetbrains.kotlin.analysis.project.structure.* import org.jetbrains.kotlin.analysis.project.structure.*
import org.jetbrains.kotlin.platform.TargetPlatform
import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerializerProtocol
internal class KtModuleProviderImpl( internal class KtModuleProviderImpl(
private val platform: TargetPlatform,
private val project: Project,
internal val mainModules: List<KtModule>, internal val mainModules: List<KtModule>,
) : ProjectStructureProvider() { ) : ProjectStructureProvider() {
private val ktNotUnderContentRootModuleWithoutPsiFile by lazy { private val ktNotUnderContentRootModuleWithoutPsiFile by lazy {
@@ -24,6 +30,10 @@ internal class KtModuleProviderImpl(
private val notUnderContentRootModuleCache = ContainerUtil.createConcurrentWeakMap<PsiFile, KtNotUnderContentRootModule>() private val notUnderContentRootModuleCache = ContainerUtil.createConcurrentWeakMap<PsiFile, KtNotUnderContentRootModule>()
private val builtinsModule: KtBuiltinsModule by lazy {
LLFirBuiltinsSessionFactory.getInstance(project).getBuiltinsSession(platform).ktModule as KtBuiltinsModule
}
override fun getKtModuleForKtElement(element: PsiElement): KtModule { override fun getKtModuleForKtElement(element: PsiElement): KtModule {
val containingFileAsPsiFile = element.containingFile val containingFileAsPsiFile = element.containingFile
?: return ktNotUnderContentRootModuleWithoutPsiFile ?: return ktNotUnderContentRootModuleWithoutPsiFile
@@ -38,6 +48,10 @@ internal class KtModuleProviderImpl(
) )
} }
if (containingFileAsVirtualFile.extension == BuiltInSerializerProtocol.BUILTINS_FILE_EXTENSION) {
return builtinsModule
}
return mainModules.first { module -> return mainModules.first { module ->
containingFileAsVirtualFile in module.contentScope containingFileAsVirtualFile in module.contentScope
} }
@@ -151,9 +151,9 @@ internal fun buildKtModuleProviderByCompilerConfiguration(
project: Project, project: Project,
ktFiles: List<KtFile>, ktFiles: List<KtFile>,
): ProjectStructureProvider = buildProjectStructureProvider { ): ProjectStructureProvider = buildProjectStructureProvider {
val platform = JvmPlatforms.defaultJvmPlatform
addModule( addModule(
buildKtSourceModule { buildKtSourceModule {
val platform = JvmPlatforms.defaultJvmPlatform
val moduleName = compilerConfig.get(CommonConfigurationKeys.MODULE_NAME) ?: "<no module name provided>" val moduleName = compilerConfig.get(CommonConfigurationKeys.MODULE_NAME) ?: "<no module name provided>"
val libraryRoots = compilerConfig.jvmModularRoots + compilerConfig.jvmClasspathRoots val libraryRoots = compilerConfig.jvmModularRoots + compilerConfig.jvmClasspathRoots
@@ -196,4 +196,6 @@ internal fun buildKtModuleProviderByCompilerConfiguration(
) )
} }
) )
this.platform = platform
this.project = project
} }
@@ -10,11 +10,13 @@ import com.intellij.openapi.application.Application
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtStaticModuleProvider import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtStaticModuleProvider
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.project.structure.KtBuiltinsModule
import org.jetbrains.kotlin.analysis.test.framework.project.structure.ktModuleProvider import org.jetbrains.kotlin.analysis.test.framework.project.structure.ktModuleProvider
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreApplicationEnvironment import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreApplicationEnvironment
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreProjectEnvironment import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreProjectEnvironment
import org.jetbrains.kotlin.config.JVMConfigurationKeys import org.jetbrains.kotlin.config.JVMConfigurationKeys
import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.test.frontend.fir.getAnalyzerServices
import org.jetbrains.kotlin.test.services.* import org.jetbrains.kotlin.test.services.*
abstract class AnalysisApiEnvironmentManager : TestService { abstract class AnalysisApiEnvironmentManager : TestService {
@@ -55,10 +57,15 @@ class AnalysisApiEnvironmentManagerImpl(
val ktModuleProjectStructure = testServices.ktModuleProvider.getModuleStructure() val ktModuleProjectStructure = testServices.ktModuleProvider.getModuleStructure()
val useSiteModule = testServices.moduleStructure.modules.first() val useSiteModule = testServices.moduleStructure.modules.first()
val useSiteCompilerConfiguration = testServices.compilerConfigurationProvider.getCompilerConfiguration(useSiteModule) val useSiteCompilerConfiguration = testServices.compilerConfigurationProvider.getCompilerConfiguration(useSiteModule)
val builtinsModule = KtBuiltinsModule(
useSiteModule.targetPlatform,
useSiteModule.targetPlatform.getAnalyzerServices(),
getProject()
)
StandaloneProjectFactory.registerServicesForProjectEnvironment( StandaloneProjectFactory.registerServicesForProjectEnvironment(
_projectEnvironment, _projectEnvironment,
KtStaticModuleProvider(ktModuleProjectStructure), KtStaticModuleProvider(builtinsModule, ktModuleProjectStructure),
ktModuleProjectStructure.allKtModules(), ktModuleProjectStructure.allKtModules(),
ktModuleProjectStructure.allSourceFiles(), ktModuleProjectStructure.allSourceFiles(),
useSiteCompilerConfiguration.languageVersionSettings, useSiteCompilerConfiguration.languageVersionSettings,