Support MultiRequestPositionManager

This commit is contained in:
Michael Bogdanov
2015-01-14 15:21:48 +03:00
parent a4117360a2
commit acccfcf32e
@@ -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<Pair<FqName, IdeaModuleInfo>, CachedValue<JetTypeMapper>>()
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<ReferenceType> {
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<ClassPrepareRequest> {
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<ClassPrepareRequest>()
for (className in classNames) {
requests.add(myDebugProcess.getRequestsManager().createClassPrepareRequest(classPrepareRequestor, className.replace('/', '.')))
}
return requests
}
TestOnly