Debugger, stepping: first check that source position is in kotlin file

This commit is contained in:
Natalia Ukhorskaya
2015-10-05 17:16:45 +03:00
parent 6fb329c1cd
commit a303c8a2f6
@@ -51,13 +51,7 @@ public class KotlinSteppingCommandProvider: JvmSteppingCommandProvider() {
): DebugProcessImpl.ResumeCommand? { ): DebugProcessImpl.ResumeCommand? {
if (suspendContext == null || suspendContext.isResumed) return null if (suspendContext == null || suspendContext.isResumed) return null
val location = computeInManagerThread(suspendContext) { val sourcePosition = suspendContext.debugProcess.debuggerContext.sourcePosition ?: return null
it.safeFrameProxy?.location()
} ?: return null
val sourcePosition = suspendContext.debugProcess.positionManager.getSourcePosition(location) ?: return null
val computedReferenceType = location.declaringType() ?: return null
val file = sourcePosition.file as? JetFile ?: return null val file = sourcePosition.file as? JetFile ?: return null
val inlineFunctionCalls = getInlineFunctionCallsIfAny(sourcePosition) val inlineFunctionCalls = getInlineFunctionCallsIfAny(sourcePosition)
@@ -69,6 +63,12 @@ public class KotlinSteppingCommandProvider: JvmSteppingCommandProvider() {
return null return null
} }
val location = computeInManagerThread(suspendContext) {
it.safeFrameProxy?.location()
} ?: return null
val computedReferenceType = location.declaringType() ?: return null
val additionalElementsToSkip = sourcePosition.elementAt.getAdditionalElementsToSkip() val additionalElementsToSkip = sourcePosition.elementAt.getAdditionalElementsToSkip()
val containingFunction = sourcePosition.elementAt.getParentOfType<JetNamedFunction>(false) val containingFunction = sourcePosition.elementAt.getParentOfType<JetNamedFunction>(false)
@@ -184,26 +184,30 @@ public class KotlinSteppingCommandProvider: JvmSteppingCommandProvider() {
override fun getStepOutCommand(suspendContext: SuspendContextImpl?, stepSize: Int): DebugProcessImpl.ResumeCommand? { override fun getStepOutCommand(suspendContext: SuspendContextImpl?, stepSize: Int): DebugProcessImpl.ResumeCommand? {
if (suspendContext == null || suspendContext.isResumed) return null if (suspendContext == null || suspendContext.isResumed) return null
val sourcePosition = suspendContext.debugProcess.debuggerContext.sourcePosition ?: return null
val file = sourcePosition.file as? JetFile ?: return null
val lineStartOffset = file.getLineStartOffset(sourcePosition.line) ?: return null
val inlineFunctions = getInlineFunctionsIfAny(file, lineStartOffset)
val inlinedArgument = getInlineArgumentIfAny(file, lineStartOffset)
if (inlineFunctions.isEmpty() && inlinedArgument == null) return null
val location = computeInManagerThread(suspendContext) { val location = computeInManagerThread(suspendContext) {
it.safeFrameProxy?.location() it.safeFrameProxy?.location()
} ?: return null } ?: return null
val sourcePosition = suspendContext.debugProcess.positionManager.getSourcePosition(location) ?: return null
val computedReferenceType = location.declaringType() ?: return null val computedReferenceType = location.declaringType() ?: return null
val locations = computedReferenceType.allLineLocations() val locations = computedReferenceType.allLineLocations()
val file = sourcePosition.file as? JetFile ?: return null
val lineStartOffset = file.getLineStartOffset(sourcePosition.line) ?: return null
val nextLineLocations = locations.dropWhile { it.lineNumber() != location.lineNumber() }.filter { it.method() == location.method() } val nextLineLocations = locations.dropWhile { it.lineNumber() != location.lineNumber() }.filter { it.method() == location.method() }
val inlineFunction = getInlineFunctionsIfAny(file, lineStartOffset) if (inlineFunctions.isNotEmpty()) {
if (inlineFunction.isNotEmpty()) { val xPosition = suspendContext.getXPositionForStepOutFromInlineFunction(nextLineLocations, inlineFunctions) ?: return null
val xPosition = suspendContext.getXPositionForStepOutFromInlineFunction(nextLineLocations, inlineFunction) ?: return null
return suspendContext.debugProcess.createRunToCursorCommand(suspendContext, xPosition, true) return suspendContext.debugProcess.createRunToCursorCommand(suspendContext, xPosition, true)
} }
val inlinedArgument = getInlineArgumentIfAny(file, lineStartOffset)
if (inlinedArgument != null) { if (inlinedArgument != null) {
val xPosition = suspendContext.getXPositionForStepOutFromInlinedArgument(nextLineLocations, inlinedArgument) ?: return null val xPosition = suspendContext.getXPositionForStepOutFromInlinedArgument(nextLineLocations, inlinedArgument) ?: return null
return suspendContext.debugProcess.createRunToCursorCommand(suspendContext, xPosition, true) return suspendContext.debugProcess.createRunToCursorCommand(suspendContext, xPosition, true)