From 1edacbbb5ed53c7cbb0620cfd09ad09675053ae0 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Wed, 20 Feb 2019 03:09:48 +0300 Subject: [PATCH] Evaluator: Don't rely on moduleDescriptor presence in DebugLabel descriptor generation The containing moduleDescriptor may not exist for the Java context. --- .../evaluate/KotlinCodeFragmentFactory.kt | 14 ++-- .../evaluate/KotlinEvaluationBuilder.kt | 2 +- .../DebugLabelPropertyDescriptorProvider.kt | 64 +++++++++++++++++-- 3 files changed, 67 insertions(+), 13 deletions(-) diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinCodeFragmentFactory.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinCodeFragmentFactory.kt index e01dbb7f0ed..53644532c87 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinCodeFragmentFactory.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinCodeFragmentFactory.kt @@ -40,7 +40,6 @@ import org.jetbrains.annotations.TestOnly import org.jetbrains.eval4j.jdi.asValue import org.jetbrains.kotlin.asJava.classes.KtLightClass import org.jetbrains.kotlin.idea.KotlinFileType -import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.codeInsight.CodeInsightUtils import org.jetbrains.kotlin.idea.debugger.KotlinEditorTextProvider import org.jetbrains.kotlin.idea.debugger.evaluate.compilation.DebugLabelPropertyDescriptorProvider @@ -70,12 +69,7 @@ class KotlinCodeFragmentFactory : CodeFragmentFactory() { } val codeFragment = constructor(project, "fragment.kt", item.text, initImports(item.imports), contextElement) - - val moduleDescriptor = codeFragment.getResolutionFacade().moduleDescriptor - val debugProcess = getDebugProcess(project, contextElement) - if (debugProcess != null) { - DebugLabelPropertyDescriptorProvider(codeFragment, moduleDescriptor, debugProcess).supplyDebugLabels() - } + supplyDebugLabels(codeFragment, context) codeFragment.putCopyableUserData(KtCodeFragment.RUNTIME_TYPE_EVALUATOR, { expression: KtExpression -> val debuggerContext = DebuggerManagerEx.getInstanceEx(project).context @@ -146,6 +140,12 @@ class KotlinCodeFragmentFactory : CodeFragmentFactory() { return codeFragment } + private fun supplyDebugLabels(codeFragment: KtCodeFragment, context: PsiElement?) { + val project = codeFragment.project + val debugProcess = getDebugProcess(project, context) ?: return + DebugLabelPropertyDescriptorProvider(codeFragment, debugProcess).supplyDebugLabels() + } + private fun getDebugProcess(project: Project, context: PsiElement?): DebugProcessImpl? { return if (ApplicationManager.getApplication().isUnitTestMode) { context?.getCopyableUserData(DEBUG_CONTEXT_FOR_TESTS)?.debugProcess diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluationBuilder.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluationBuilder.kt index 146ddba0c33..cf7a95b82f9 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluationBuilder.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluationBuilder.kt @@ -256,7 +256,7 @@ class KotlinEvaluator(val codeFragment: KtCodeFragment, val sourcePosition: Sour val filesToAnalyze = listOf(codeFragment) val resolutionFacade = KotlinCacheService.getInstance(codeFragment.project).getResolutionFacade(filesToAnalyze) - DebugLabelPropertyDescriptorProvider(codeFragment, resolutionFacade.moduleDescriptor, debugProcess).supplyDebugLabels() + DebugLabelPropertyDescriptorProvider(codeFragment, debugProcess).supplyDebugLabels() val analysisResult = resolutionFacade.analyzeWithAllCompilerChecks(filesToAnalyze) diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/compilation/DebugLabelPropertyDescriptorProvider.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/compilation/DebugLabelPropertyDescriptorProvider.kt index 7ea18d9ab79..d678a5768da 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/compilation/DebugLabelPropertyDescriptorProvider.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/compilation/DebugLabelPropertyDescriptorProvider.kt @@ -15,8 +15,11 @@ import org.jetbrains.kotlin.builtins.PrimitiveType import com.sun.jdi.* import com.sun.jdi.Type as JdiType import org.jetbrains.kotlin.backend.common.lower.SimpleMemberScope +import org.jetbrains.kotlin.builtins.DefaultBuiltIns +import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.Annotations +import org.jetbrains.kotlin.descriptors.impl.DeclarationDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.PackageFragmentDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.PropertyGetterDescriptorImpl @@ -25,15 +28,12 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtCodeFragment import org.jetbrains.kotlin.psi.externalDescriptors +import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.Variance import org.jetbrains.org.objectweb.asm.Type as AsmType -class DebugLabelPropertyDescriptorProvider( - val codeFragment: KtCodeFragment, - val moduleDescriptor: ModuleDescriptor, - val debugProcess: DebugProcessImpl -) { +class DebugLabelPropertyDescriptorProvider(val codeFragment: KtCodeFragment, val debugProcess: DebugProcessImpl) { companion object { fun getMarkupMap(debugProcess: DebugProcessImpl) = doGetMarkupMap(debugProcess) ?: emptyMap() @@ -49,6 +49,8 @@ class DebugLabelPropertyDescriptorProvider( } } + private val moduleDescriptor = DebugLabelModuleDescriptor + fun supplyDebugLabels() { val packageFragment = object : PackageFragmentDescriptorImpl(moduleDescriptor, FqName.ROOT) { val properties = createDebugLabelDescriptors(this) @@ -140,6 +142,58 @@ class DebugLabelPropertyDescriptorProvider( } } +private object DebugLabelModuleDescriptor + : DeclarationDescriptorImpl(Annotations.EMPTY, Name.identifier("DebugLabelExtensions")), + ModuleDescriptor +{ + override val builtIns: KotlinBuiltIns + get() = DefaultBuiltIns.Instance + + override val stableName: Name? + get() = name + + override fun shouldSeeInternalsOf(targetModule: ModuleDescriptor) = false + + override fun getPackage(fqName: FqName): PackageViewDescriptor { + return object : PackageViewDescriptor, DeclarationDescriptorImpl(Annotations.EMPTY, FqName.ROOT.shortNameOrSpecial()) { + override fun getContainingDeclaration(): PackageViewDescriptor? = null + + override val fqName: FqName + get() = FqName.ROOT + + override val memberScope: MemberScope + get() = MemberScope.Empty + + override val module: ModuleDescriptor + get() = this@DebugLabelModuleDescriptor + + override val fragments: List + get() = emptyList() + + override fun accept(visitor: DeclarationDescriptorVisitor, data: D): R { + return visitor.visitPackageViewDescriptor(this, data) + } + } + } + + override fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean): Collection { + return emptyList() + } + + override val allDependencyModules: List + get() = emptyList() + + override val expectedByModules: List + get() = emptyList() + + override fun getCapability(capability: ModuleDescriptor.Capability): T? = null + + override val isValid: Boolean + get() = true + + override fun assertValid() {} +} + internal class DebugLabelPropertyDescriptor( containingDeclaration: DeclarationDescriptor, val labelName: String