From 3d6ac2f277348577fe8841bc46320b02ab1af152 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Mon, 26 Sep 2016 15:22:31 +0300 Subject: [PATCH] Refactoring: create step-over kotlin position and move counting step over specific to create action stage (cherry picked from commit 4b08bbd) --- .../stepping/DebuggerSteppingHelper.java | 14 +---- .../stepping/KotlinSteppingCommandProvider.kt | 56 ++++++++++++++----- 2 files changed, 45 insertions(+), 25 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/debugger/stepping/DebuggerSteppingHelper.java b/idea/src/org/jetbrains/kotlin/idea/debugger/stepping/DebuggerSteppingHelper.java index 5a29581705c..faa295b2a05 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/stepping/DebuggerSteppingHelper.java +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/stepping/DebuggerSteppingHelper.java @@ -24,7 +24,6 @@ import com.intellij.debugger.jdi.StackFrameProxyImpl; import com.intellij.debugger.jdi.ThreadReferenceProxyImpl; import com.intellij.debugger.settings.DebuggerSettings; import com.intellij.openapi.extensions.Extensions; -import com.intellij.psi.PsiElement; import com.intellij.ui.classFilter.ClassFilter; import com.intellij.ui.classFilter.DebuggerClassFilterProvider; import com.sun.jdi.Location; @@ -34,11 +33,8 @@ import com.sun.jdi.ThreadReference; import com.sun.jdi.request.EventRequest; import com.sun.jdi.request.EventRequestManager; import com.sun.jdi.request.StepRequest; -import kotlin.ranges.IntRange; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.kotlin.psi.KtFile; -import org.jetbrains.kotlin.psi.KtFunction; import org.jetbrains.kotlin.psi.KtFunctionLiteral; import org.jetbrains.kotlin.psi.KtNamedFunction; @@ -51,10 +47,7 @@ public class DebuggerSteppingHelper { public static DebugProcessImpl.ResumeCommand createStepOverCommand( final SuspendContextImpl suspendContext, final boolean ignoreBreakpoints, - final KtFile file, - final IntRange linesRange, - final List inlineArguments, - final List additionalElementsToSkip + final KotlinSteppingCommandProvider.KotlinSourcePosition kotlinSourcePosition ) { final DebugProcessImpl debugProcess = suspendContext.getDebugProcess(); return debugProcess.new ResumeCommand(suspendContext) { @@ -65,10 +58,7 @@ public class DebuggerSteppingHelper { if (frameProxy != null) { Action action = KotlinSteppingCommandProviderKt.getStepOverPosition( frameProxy.location(), - file, - linesRange, - inlineArguments, - additionalElementsToSkip + kotlinSourcePosition ); DebugProcessImpl.ResumeCommand command = action.createCommand(debugProcess, suspendContext, ignoreBreakpoints); diff --git a/idea/src/org/jetbrains/kotlin/idea/debugger/stepping/KotlinSteppingCommandProvider.kt b/idea/src/org/jetbrains/kotlin/idea/debugger/stepping/KotlinSteppingCommandProvider.kt index 99e34394717..66835f86e46 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/stepping/KotlinSteppingCommandProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/stepping/KotlinSteppingCommandProvider.kt @@ -68,25 +68,41 @@ class KotlinSteppingCommandProvider: JvmSteppingCommandProvider() { return getStepOverCommand(suspendContext, ignoreBreakpoints, debuggerContext.sourcePosition) } - fun getStepOverCommand(suspendContext: SuspendContextImpl, ignoreBreakpoints: Boolean, sourcePosition: SourcePosition): DebugProcessImpl.ResumeCommand? { - val file = sourcePosition.file as? KtFile ?: return null - if (sourcePosition.line < 0) return null + private fun getStepOverCommand( + suspendContext: SuspendContextImpl, + ignoreBreakpoints: Boolean, + sourcePosition: SourcePosition): DebugProcessImpl.ResumeCommand? { + val kotlinSourcePosition = KotlinSourcePosition.create(sourcePosition) ?: return null - val containingFunction = sourcePosition.elementAt.parents - .filterIsInstance() - .firstOrNull { !it.isLocal } ?: return null + if (!isSpecialStepOverNeeded(kotlinSourcePosition)) return null - val startLineNumber = containingFunction.getLineNumber(true) + 1 - val endLineNumber = containingFunction.getLineNumber(false) + 1 - if (startLineNumber > endLineNumber) return null + return DebuggerSteppingHelper.createStepOverCommand(suspendContext, ignoreBreakpoints, kotlinSourcePosition) + } - val linesRange = startLineNumber..endLineNumber + data class KotlinSourcePosition(val file: KtFile, val function: KtNamedFunction, + val linesRange: IntRange, val sourcePosition: SourcePosition) { + companion object { + fun create(sourcePosition: SourcePosition): KotlinSourcePosition? { + val file = sourcePosition.file as? KtFile ?: return null + if (sourcePosition.line < 0) return null - val inlineArgumentsToSkip = getElementsToSkip(containingFunction as KtNamedFunction, sourcePosition) ?: return null + val containingFunction = sourcePosition.elementAt.parents + .filterIsInstance() + .firstOrNull { !it.isLocal } ?: return null - val additionalElementsToSkip = sourcePosition.elementAt.getAdditionalElementsToSkip() + val startLineNumber = containingFunction.getLineNumber(true) + 1 + val endLineNumber = containingFunction.getLineNumber(false) + 1 + if (startLineNumber > endLineNumber) return null - return DebuggerSteppingHelper.createStepOverCommand(suspendContext, ignoreBreakpoints, file, linesRange, inlineArgumentsToSkip, additionalElementsToSkip) + val linesRange = startLineNumber..endLineNumber + + return KotlinSourcePosition(file, containingFunction, linesRange, sourcePosition) + } + } + } + + private fun isSpecialStepOverNeeded(kotlinSourcePosition: KotlinSourcePosition): Boolean { + return getElementsToSkip(kotlinSourcePosition.function, kotlinSourcePosition.sourcePosition) != null } @TestOnly @@ -328,6 +344,20 @@ sealed class Action(val position: XSourcePositionImpl?) { } } +fun getStepOverPosition( + location: Location, + kotlinSourcePosition: KotlinSteppingCommandProvider.KotlinSourcePosition +): Action { + val (inlineArgumentsToSkip, additionalElementsToSkip) = runReadAction { + val inlineArgumentsToSkip = getElementsToSkip(kotlinSourcePosition.function, kotlinSourcePosition.sourcePosition)!! + val additionalElementsToSkip = kotlinSourcePosition.sourcePosition.elementAt.getAdditionalElementsToSkip() + + Pair(inlineArgumentsToSkip, additionalElementsToSkip) + } + + return getStepOverPosition(location, kotlinSourcePosition.file, kotlinSourcePosition.linesRange, inlineArgumentsToSkip, additionalElementsToSkip) +} + fun getStepOverPosition( location: Location, file: KtFile,