From acccfcf32e17f90fe3e843913c6ab6241cd5f81b Mon Sep 17 00:00:00 2001 From: Michael Bogdanov Date: Wed, 14 Jan 2015 15:21:48 +0300 Subject: [PATCH] Support MultiRequestPositionManager --- .../idea/debugger/JetPositionManager.kt | 51 ++++++++++++------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/debugger/JetPositionManager.kt b/idea/src/org/jetbrains/kotlin/idea/debugger/JetPositionManager.kt index 30284f0429a..32d985d55ff 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/JetPositionManager.kt +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/JetPositionManager.kt @@ -17,7 +17,6 @@ package org.jetbrains.kotlin.idea.debugger import com.intellij.debugger.NoDataException -import com.intellij.debugger.PositionManager import com.intellij.debugger.SourcePosition import com.intellij.debugger.engine.DebugProcess import com.intellij.debugger.requests.ClassPrepareRequestor @@ -60,9 +59,10 @@ import org.jetbrains.kotlin.idea.util.application.runReadAction import org.jetbrains.kotlin.idea.stubindex.PackageIndexUtil import java.util.ArrayList import org.jetbrains.kotlin.codegen.binding.CodegenBinding +import com.intellij.debugger.MultiRequestPositionManager +import java.util.Collections - -public class JetPositionManager(private val myDebugProcess: DebugProcess) : PositionManager { +public class JetPositionManager(private val myDebugProcess: DebugProcess) : MultiRequestPositionManager { private val myTypeMappers = WeakHashMap, CachedValue>() override fun getSourcePosition(location: Location?): SourcePosition? { @@ -139,19 +139,14 @@ public class JetPositionManager(private val myDebugProcess: DebugProcess) : Posi val referenceInternalName: String try { if (location.declaringType().availableStrata().contains("Kotlin")) { - referenceInternalName = location.sourcePath() + //replace is required for windows + referenceInternalName = location.sourcePath().replace('\\','/') } else { - //no stratum or source path => use default one - val referenceFqName = location.declaringType().name() - // JDI names are of form "package.Class$InnerClass" - referenceInternalName = referenceFqName.replace('.', '/') + referenceInternalName = defaultInternalName(location) } } catch (e: AbsentInformationException) { - //no stratum or source path => use default one - val referenceFqName = location.declaringType().name() - // JDI names are of form "package.Class$InnerClass" - referenceInternalName = referenceFqName.replace('.', '/') + referenceInternalName = defaultInternalName(location) } val className = JvmClassName.byInternalName(referenceInternalName) @@ -163,6 +158,13 @@ public class JetPositionManager(private val myDebugProcess: DebugProcess) : Posi return DebuggerUtils.findSourceFileForClass(project, GlobalSearchScope.allScope(project), className, sourceName, location.lineNumber() - 1) } + private fun defaultInternalName(location: Location): String { + //no stratum or source path => use default one + val referenceFqName = location.declaringType().name() + // JDI names are of form "package.Class$InnerClass" + return referenceFqName.replace('.', '/') + } + override fun getAllClasses(sourcePosition: SourcePosition): List { if (sourcePosition.getFile() !is JetFile) { throw NoDataException() @@ -239,20 +241,31 @@ public class JetPositionManager(private val myDebugProcess: DebugProcess) : Posi } } + [deprecated("Since Idea 14.0.3 use createPrepareRequests fun")] override fun createPrepareRequest(classPrepareRequestor: ClassPrepareRequestor, sourcePosition: SourcePosition): ClassPrepareRequest? { + if (sourcePosition.getFile() !is JetFile) { + throw NoDataException() + } + val className = classNameForPosition(sourcePosition) + if (className == null) { + return null + } + return myDebugProcess.getRequestsManager().createClassPrepareRequest(classPrepareRequestor, className.replace('/', '.')) + } + + override fun createPrepareRequests(classPrepareRequestor: ClassPrepareRequestor, sourcePosition: SourcePosition): MutableList { if (sourcePosition.getFile() !is JetFile) { throw NoDataException() } val classNames = classNameForPositionAndInlinedOnes(sourcePosition) if (classNames.isEmpty()) { - return null + return Collections.emptyList() } - val classPrepareRequest = myDebugProcess.getRequestsManager().createClassPrepareRequest(classPrepareRequestor, classNames.first().replace('/', '.')) -// classNames.subList(1, classNames.size()).forEach { -// classPrepareRequest.addClassFilter(it.replace('/', '.')) -// } - - return classPrepareRequest + val requests = arrayListOf() + for (className in classNames) { + requests.add(myDebugProcess.getRequestsManager().createClassPrepareRequest(classPrepareRequestor, className.replace('/', '.'))) + } + return requests } TestOnly