From 5bf333f6f517939f3c4f0a0a50a25a1fb4dd96d4 Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Tue, 6 Sep 2022 13:43:31 -0700 Subject: [PATCH] AA: look up built-ins module for deserialized declarations from built-ins --- .../project/structure/KtStaticModuleProvider.kt | 10 +++++++++- .../structure/builder/KtModuleProviderBuilder.kt | 7 +++++++ .../project/structure/impl/KtModuleProviderImpl.kt | 14 ++++++++++++++ .../project/structure/impl/KtModuleUtils.kt | 4 +++- .../services/AnalysisApiEnvironmentManager.kt | 9 ++++++++- 5 files changed, 41 insertions(+), 3 deletions(-) diff --git a/analysis/analysis-api-standalone/analysis-api-standalone-base/src/org/jetbrains/kotlin/analysis/api/standalone/base/project/structure/KtStaticModuleProvider.kt b/analysis/analysis-api-standalone/analysis-api-standalone-base/src/org/jetbrains/kotlin/analysis/api/standalone/base/project/structure/KtStaticModuleProvider.kt index 56c8b5b9ac2..79d42cbc242 100644 --- a/analysis/analysis-api-standalone/analysis-api-standalone-base/src/org/jetbrains/kotlin/analysis/api/standalone/base/project/structure/KtStaticModuleProvider.kt +++ b/analysis/analysis-api-standalone/analysis-api-standalone-base/src/org/jetbrains/kotlin/analysis/api/standalone/base/project/structure/KtStaticModuleProvider.kt @@ -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 } } \ No newline at end of file diff --git a/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/project/structure/builder/KtModuleProviderBuilder.kt b/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/project/structure/builder/KtModuleProviderBuilder.kt index 2f1048b2fa2..f31874b546f 100644 --- a/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/project/structure/builder/KtModuleProviderBuilder.kt +++ b/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/project/structure/builder/KtModuleProviderBuilder.kt @@ -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, ) } diff --git a/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/project/structure/impl/KtModuleProviderImpl.kt b/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/project/structure/impl/KtModuleProviderImpl.kt index 8a427878ee9..f0f5f056735 100644 --- a/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/project/structure/impl/KtModuleProviderImpl.kt +++ b/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/project/structure/impl/KtModuleProviderImpl.kt @@ -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, ) : ProjectStructureProvider() { private val ktNotUnderContentRootModuleWithoutPsiFile by lazy { @@ -24,6 +30,10 @@ internal class KtModuleProviderImpl( private val notUnderContentRootModuleCache = ContainerUtil.createConcurrentWeakMap() + 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 } diff --git a/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/project/structure/impl/KtModuleUtils.kt b/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/project/structure/impl/KtModuleUtils.kt index 08e02baf9c0..527966765db 100644 --- a/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/project/structure/impl/KtModuleUtils.kt +++ b/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/project/structure/impl/KtModuleUtils.kt @@ -151,9 +151,9 @@ internal fun buildKtModuleProviderByCompilerConfiguration( project: Project, ktFiles: List, ): ProjectStructureProvider = buildProjectStructureProvider { + val platform = JvmPlatforms.defaultJvmPlatform addModule( buildKtSourceModule { - val platform = JvmPlatforms.defaultJvmPlatform val moduleName = compilerConfig.get(CommonConfigurationKeys.MODULE_NAME) ?: "" val libraryRoots = compilerConfig.jvmModularRoots + compilerConfig.jvmClasspathRoots @@ -196,4 +196,6 @@ internal fun buildKtModuleProviderByCompilerConfiguration( ) } ) + this.platform = platform + this.project = project } 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 80883777412..499f60fcd35 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 @@ -10,11 +10,13 @@ import com.intellij.openapi.application.Application 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.StandaloneProjectFactory +import org.jetbrains.kotlin.analysis.project.structure.KtBuiltinsModule 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.KotlinCoreProjectEnvironment import org.jetbrains.kotlin.config.JVMConfigurationKeys import org.jetbrains.kotlin.config.languageVersionSettings +import org.jetbrains.kotlin.test.frontend.fir.getAnalyzerServices import org.jetbrains.kotlin.test.services.* abstract class AnalysisApiEnvironmentManager : TestService { @@ -55,10 +57,15 @@ class AnalysisApiEnvironmentManagerImpl( val ktModuleProjectStructure = testServices.ktModuleProvider.getModuleStructure() val useSiteModule = testServices.moduleStructure.modules.first() val useSiteCompilerConfiguration = testServices.compilerConfigurationProvider.getCompilerConfiguration(useSiteModule) + val builtinsModule = KtBuiltinsModule( + useSiteModule.targetPlatform, + useSiteModule.targetPlatform.getAnalyzerServices(), + getProject() + ) StandaloneProjectFactory.registerServicesForProjectEnvironment( _projectEnvironment, - KtStaticModuleProvider(ktModuleProjectStructure), + KtStaticModuleProvider(builtinsModule, ktModuleProjectStructure), ktModuleProjectStructure.allKtModules(), ktModuleProjectStructure.allSourceFiles(), useSiteCompilerConfiguration.languageVersionSettings,