Refactoring: create step-over kotlin position and move counting step over specific to create action stage

(cherry picked from commit 4b08bbd)
This commit is contained in:
Nikolay Krasko
2016-09-26 15:22:31 +03:00
committed by Nikolay Krasko
parent 60fbcb7e38
commit 3d6ac2f277
2 changed files with 45 additions and 25 deletions
@@ -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<KtFunction> inlineArguments,
final List<PsiElement> 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);
@@ -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<KtNamedFunction>()
.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<KtNamedFunction>()
.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,