Debugger: Support DebugLabel descriptors in completion

This commit is contained in:
Yan Zhulanow
2019-02-15 03:55:37 +03:00
parent bff3f28a72
commit 592083bc5b
2 changed files with 37 additions and 1 deletions
@@ -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())
}
@@ -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()