Support MultiRequestPositionManager
This commit is contained in:
@@ -17,7 +17,6 @@
|
|||||||
package org.jetbrains.kotlin.idea.debugger
|
package org.jetbrains.kotlin.idea.debugger
|
||||||
|
|
||||||
import com.intellij.debugger.NoDataException
|
import com.intellij.debugger.NoDataException
|
||||||
import com.intellij.debugger.PositionManager
|
|
||||||
import com.intellij.debugger.SourcePosition
|
import com.intellij.debugger.SourcePosition
|
||||||
import com.intellij.debugger.engine.DebugProcess
|
import com.intellij.debugger.engine.DebugProcess
|
||||||
import com.intellij.debugger.requests.ClassPrepareRequestor
|
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 org.jetbrains.kotlin.idea.stubindex.PackageIndexUtil
|
||||||
import java.util.ArrayList
|
import java.util.ArrayList
|
||||||
import org.jetbrains.kotlin.codegen.binding.CodegenBinding
|
import org.jetbrains.kotlin.codegen.binding.CodegenBinding
|
||||||
|
import com.intellij.debugger.MultiRequestPositionManager
|
||||||
|
import java.util.Collections
|
||||||
|
|
||||||
|
public class JetPositionManager(private val myDebugProcess: DebugProcess) : MultiRequestPositionManager {
|
||||||
public class JetPositionManager(private val myDebugProcess: DebugProcess) : PositionManager {
|
|
||||||
private val myTypeMappers = WeakHashMap<Pair<FqName, IdeaModuleInfo>, CachedValue<JetTypeMapper>>()
|
private val myTypeMappers = WeakHashMap<Pair<FqName, IdeaModuleInfo>, CachedValue<JetTypeMapper>>()
|
||||||
|
|
||||||
override fun getSourcePosition(location: Location?): SourcePosition? {
|
override fun getSourcePosition(location: Location?): SourcePosition? {
|
||||||
@@ -139,19 +139,14 @@ public class JetPositionManager(private val myDebugProcess: DebugProcess) : Posi
|
|||||||
val referenceInternalName: String
|
val referenceInternalName: String
|
||||||
try {
|
try {
|
||||||
if (location.declaringType().availableStrata().contains("Kotlin")) {
|
if (location.declaringType().availableStrata().contains("Kotlin")) {
|
||||||
referenceInternalName = location.sourcePath()
|
//replace is required for windows
|
||||||
|
referenceInternalName = location.sourcePath().replace('\\','/')
|
||||||
} else {
|
} else {
|
||||||
//no stratum or source path => use default one
|
referenceInternalName = defaultInternalName(location)
|
||||||
val referenceFqName = location.declaringType().name()
|
|
||||||
// JDI names are of form "package.Class$InnerClass"
|
|
||||||
referenceInternalName = referenceFqName.replace('.', '/')
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (e: AbsentInformationException) {
|
catch (e: AbsentInformationException) {
|
||||||
//no stratum or source path => use default one
|
referenceInternalName = defaultInternalName(location)
|
||||||
val referenceFqName = location.declaringType().name()
|
|
||||||
// JDI names are of form "package.Class$InnerClass"
|
|
||||||
referenceInternalName = referenceFqName.replace('.', '/')
|
|
||||||
}
|
}
|
||||||
|
|
||||||
val className = JvmClassName.byInternalName(referenceInternalName)
|
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)
|
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<ReferenceType> {
|
override fun getAllClasses(sourcePosition: SourcePosition): List<ReferenceType> {
|
||||||
if (sourcePosition.getFile() !is JetFile) {
|
if (sourcePosition.getFile() !is JetFile) {
|
||||||
throw NoDataException()
|
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? {
|
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<ClassPrepareRequest> {
|
||||||
if (sourcePosition.getFile() !is JetFile) {
|
if (sourcePosition.getFile() !is JetFile) {
|
||||||
throw NoDataException()
|
throw NoDataException()
|
||||||
}
|
}
|
||||||
val classNames = classNameForPositionAndInlinedOnes(sourcePosition)
|
val classNames = classNameForPositionAndInlinedOnes(sourcePosition)
|
||||||
if (classNames.isEmpty()) {
|
if (classNames.isEmpty()) {
|
||||||
return null
|
return Collections.emptyList()
|
||||||
}
|
}
|
||||||
val classPrepareRequest = myDebugProcess.getRequestsManager().createClassPrepareRequest(classPrepareRequestor, classNames.first().replace('/', '.'))
|
val requests = arrayListOf<ClassPrepareRequest>()
|
||||||
// classNames.subList(1, classNames.size()).forEach {
|
for (className in classNames) {
|
||||||
// classPrepareRequest.addClassFilter(it.replace('/', '.'))
|
requests.add(myDebugProcess.getRequestsManager().createClassPrepareRequest(classPrepareRequestor, className.replace('/', '.')))
|
||||||
// }
|
}
|
||||||
|
return requests
|
||||||
return classPrepareRequest
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TestOnly
|
TestOnly
|
||||||
|
|||||||
Reference in New Issue
Block a user