Debugger: Support DebugLabel descriptors in completion
This commit is contained in:
+20
-1
@@ -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
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user