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 org.jetbrains.kotlin.analysis.project.structure.*
import org.jetbrains.kotlin.psi.psiUtil.contains
import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerializerProtocol
class KtStaticModuleProvider(
private val builtinsModule: KtBuiltinsModule,
val projectStructure: KtModuleProjectStructure,
) : ProjectStructureProvider() {
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
.first { module ->
module.ktModule.contentScope.contains(element)
element in module.ktModule.contentScope
}.ktModule
}
}
@@ -5,9 +5,11 @@
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.ProjectStructureProvider
import org.jetbrains.kotlin.analysis.project.structure.impl.KtModuleProviderImpl
import org.jetbrains.kotlin.platform.TargetPlatform
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.InvocationKind
import kotlin.contracts.contract
@@ -20,8 +22,13 @@ public class KtModuleProviderBuilder {
mainModules.add(module)
}
public lateinit var platform: TargetPlatform
public lateinit var project: Project
public fun build(): ProjectStructureProvider {
return KtModuleProviderImpl(
platform,
project,
mainModules,
)
}
@@ -5,15 +5,21 @@
package org.jetbrains.kotlin.analysis.project.structure.impl
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
import com.intellij.psi.PsiFileSystemItem
import com.intellij.psi.PsiJavaFile
import com.intellij.util.containers.ContainerUtil
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.platform.TargetPlatform
import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerializerProtocol
internal class KtModuleProviderImpl(
private val platform: TargetPlatform,
private val project: Project,
internal val mainModules: List<KtModule>,
) : ProjectStructureProvider() {
private val ktNotUnderContentRootModuleWithoutPsiFile by lazy {
@@ -24,6 +30,10 @@ internal class KtModuleProviderImpl(
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 {
val containingFileAsPsiFile = element.containingFile
?: return ktNotUnderContentRootModuleWithoutPsiFile
@@ -38,6 +48,10 @@ internal class KtModuleProviderImpl(
)
}
if (containingFileAsVirtualFile.extension == BuiltInSerializerProtocol.BUILTINS_FILE_EXTENSION) {
return builtinsModule
}
return mainModules.first { module ->
containingFileAsVirtualFile in module.contentScope
}
@@ -151,9 +151,9 @@ internal fun buildKtModuleProviderByCompilerConfiguration(
project: Project,
ktFiles: List<KtFile>,
): ProjectStructureProvider = buildProjectStructureProvider {
val platform = JvmPlatforms.defaultJvmPlatform
addModule(
buildKtSourceModule {
val platform = JvmPlatforms.defaultJvmPlatform
val moduleName = compilerConfig.get(CommonConfigurationKeys.MODULE_NAME) ?: "<no module name provided>"
val libraryRoots = compilerConfig.jvmModularRoots + compilerConfig.jvmClasspathRoots
@@ -196,4 +196,6 @@ internal fun buildKtModuleProviderByCompilerConfiguration(
)
}
)
this.platform = platform
this.project = project
}