diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/ReferenceVariantsCollector.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/ReferenceVariantsCollector.kt index 607a4df1fb1..35e747d9053 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/ReferenceVariantsCollector.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/ReferenceVariantsCollector.kt @@ -25,7 +25,9 @@ import org.jetbrains.kotlin.idea.resolve.ResolutionFacade import org.jetbrains.kotlin.idea.util.CallTypeAndReceiver import org.jetbrains.kotlin.idea.util.ShadowedDeclarationsFilter import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.psi.KtCodeFragment import org.jetbrains.kotlin.psi.KtSimpleNameExpression +import org.jetbrains.kotlin.psi.externalDescriptors import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DataClassDescriptorResolver import org.jetbrains.kotlin.resolve.scopes.DescriptorKindExclude @@ -141,13 +143,30 @@ class ReferenceVariantsCollector( useReceiverType = runtimeReceiver?.type) } + val basicNameFilter = descriptorNameFilter.toNameFilter() val (descriptorKindFilter, additionalPropertyNameFilter) = filterConfiguration - var basicVariants = getReferenceVariants(descriptorKindFilter, descriptorNameFilter.toNameFilter()) + var runDistinct = false + + var basicVariants = getReferenceVariants(descriptorKindFilter, basicNameFilter) if (additionalPropertyNameFilter != null) { basicVariants += getReferenceVariants(descriptorKindFilter.intersect(DescriptorKindFilter.VARIABLES), additionalPropertyNameFilter.toNameFilter()) + runDistinct = true + } + + val containingCodeFragment = nameExpression.containingKtFile as? KtCodeFragment + if (containingCodeFragment != null) { + val externalDescriptors = containingCodeFragment.externalDescriptors + if (externalDescriptors != null) { + basicVariants += externalDescriptors + .filter { descriptorKindFilter.accepts(it) && basicNameFilter(it.name) } + } + } + + if (runDistinct) { basicVariants = basicVariants.distinct() } + return ReferenceVariants(filterConfiguration.filterVariants(basicVariants).toHashSet(), emptyList()) } 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 f849ecb0f16..e01dbb7f0ed 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 @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.idea.debugger.evaluate import com.intellij.debugger.DebuggerManagerEx +import com.intellij.debugger.engine.DebugProcessImpl import com.intellij.debugger.engine.evaluation.CodeFragmentFactory import com.intellij.debugger.engine.evaluation.CodeFragmentKind import com.intellij.debugger.engine.evaluation.TextWithImports @@ -39,8 +40,10 @@ 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 import org.jetbrains.kotlin.idea.j2k.J2kPostProcessor import org.jetbrains.kotlin.idea.refactoring.j2k import org.jetbrains.kotlin.idea.refactoring.j2kText @@ -68,6 +71,12 @@ 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() + } + codeFragment.putCopyableUserData(KtCodeFragment.RUNTIME_TYPE_EVALUATOR, { expression: KtExpression -> val debuggerContext = DebuggerManagerEx.getInstanceEx(project).context val debuggerSession = debuggerContext.debuggerSession @@ -137,6 +146,14 @@ class KotlinCodeFragmentFactory : CodeFragmentFactory() { return codeFragment } + private fun getDebugProcess(project: Project, context: PsiElement?): DebugProcessImpl? { + return if (ApplicationManager.getApplication().isUnitTestMode) { + context?.getCopyableUserData(DEBUG_CONTEXT_FOR_TESTS)?.debugProcess + } else { + DebuggerManagerEx.getInstanceEx(project).context.debugProcess + } + } + private fun getFrameInfo(contextElement: PsiElement?, debuggerContext: DebuggerContextImpl): FrameInfo? { val semaphore = Semaphore() semaphore.down()