From 5596c3ae80ed760907d8b64b9f9ccc735e01333c Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Fri, 30 Jun 2023 22:26:03 -0700 Subject: [PATCH] AA: better error message for file w/o containing module ...instead of throwing NoSuchElementException --- .../project/structure/KtStaticModuleProvider.kt | 12 +++++++++--- .../project/structure/impl/KtModuleProviderImpl.kt | 11 ++++++++++- .../project/structure/ktModuleInternalUtils.kt | 14 ++++++++++++++ 3 files changed, 33 insertions(+), 4 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 485a44a9d8b..3778ed7eb27 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 @@ -9,6 +9,7 @@ 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 +import org.jetbrains.kotlin.utils.KotlinExceptionWithAttachments class KtStaticModuleProvider( private val builtinsModule: KtBuiltinsModule, @@ -31,8 +32,13 @@ class KtStaticModuleProvider( containingFileAsVirtualFile in binaryModule.contentScope }?.let { return it } - return projectStructure.mainModules - .first { module -> element in module.ktModule.contentScope } - .ktModule + return projectStructure.mainModules.firstOrNull { module -> + element in module.ktModule.contentScope + }?.ktModule + ?: throw KotlinExceptionWithAttachments("Cannot find KtModule; see the attachment for more details.") + .withAttachment( + containingFileAsVirtualFile.path, + allModules.joinToString(separator = System.lineSeparator()) { it.asDebugString() } + ) } } \ No newline at end of file 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 8da4e57a825..d9f965a3bb3 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 @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.LLFirBu import org.jetbrains.kotlin.analysis.project.structure.* import org.jetbrains.kotlin.platform.TargetPlatform import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerializerProtocol +import org.jetbrains.kotlin.utils.KotlinExceptionWithAttachments internal class KtModuleProviderImpl( private val platform: TargetPlatform, @@ -36,6 +37,7 @@ internal class KtModuleProviderImpl( LLFirBuiltinsSessionFactory.getInstance(project).getBuiltinsSession(platform).ktModule as KtBuiltinsModule } + @OptIn(KtModuleStructureInternals::class) override fun getModule(element: PsiElement, contextualModule: KtModule?): KtModule { val containingFileAsPsiFile = element.containingFile ?: return ktNotUnderContentRootModuleWithoutPsiFile @@ -56,9 +58,16 @@ internal class KtModuleProviderImpl( return builtinsModule } - return mainModules.first { module -> + containingFileAsVirtualFile.analysisExtensionFileContextModule?.let { return it } + + return mainModules.firstOrNull { module -> containingFileAsVirtualFile in module.contentScope } + ?: throw KotlinExceptionWithAttachments("Cannot find KtModule; see the attachment for more details.") + .withAttachment( + containingFileAsVirtualFile.path, + mainModules.joinToString(separator = System.lineSeparator()) { it.asDebugString() } + ) } internal val binaryModules: List by lazy { diff --git a/analysis/project-structure/src/org/jetbrains/kotlin/analysis/project/structure/ktModuleInternalUtils.kt b/analysis/project-structure/src/org/jetbrains/kotlin/analysis/project/structure/ktModuleInternalUtils.kt index f2b909cd99d..5e3b642104e 100644 --- a/analysis/project-structure/src/org/jetbrains/kotlin/analysis/project/structure/ktModuleInternalUtils.kt +++ b/analysis/project-structure/src/org/jetbrains/kotlin/analysis/project/structure/ktModuleInternalUtils.kt @@ -18,3 +18,17 @@ public var VirtualFile.analysisExtensionFileContextModule: KtModule? by UserData @RequiresOptIn("Internal KtModule structure API component which should not be used outside the Analysis API implementation modules as it does not have any compatibility guarantees") public annotation class KtModuleStructureInternals + +public fun KtModule.asDebugString(indent: Int = 0): String = buildString { + appendLine("$moduleDescription {") + appendLine("contentScope: $contentScope") + appendLine("directRegularDependencies:${System.lineSeparator()}") + directRegularDependencies.joinTo(this, separator = System.lineSeparator()) { dep -> + dep.asDebugString(indent + 1) + } + appendLine("directDependsOnDependencies:${System.lineSeparator()}") + directDependsOnDependencies.joinTo(this, separator = System.lineSeparator()) { dep -> + dep.asDebugString(indent + 1) + } + append("}") +}.prependIndent(" ".repeat(indent))