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:
committed by
Nikolay Krasko
parent
60fbcb7e38
commit
3d6ac2f277
@@ -24,7 +24,6 @@ import com.intellij.debugger.jdi.StackFrameProxyImpl;
|
|||||||
import com.intellij.debugger.jdi.ThreadReferenceProxyImpl;
|
import com.intellij.debugger.jdi.ThreadReferenceProxyImpl;
|
||||||
import com.intellij.debugger.settings.DebuggerSettings;
|
import com.intellij.debugger.settings.DebuggerSettings;
|
||||||
import com.intellij.openapi.extensions.Extensions;
|
import com.intellij.openapi.extensions.Extensions;
|
||||||
import com.intellij.psi.PsiElement;
|
|
||||||
import com.intellij.ui.classFilter.ClassFilter;
|
import com.intellij.ui.classFilter.ClassFilter;
|
||||||
import com.intellij.ui.classFilter.DebuggerClassFilterProvider;
|
import com.intellij.ui.classFilter.DebuggerClassFilterProvider;
|
||||||
import com.sun.jdi.Location;
|
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.EventRequest;
|
||||||
import com.sun.jdi.request.EventRequestManager;
|
import com.sun.jdi.request.EventRequestManager;
|
||||||
import com.sun.jdi.request.StepRequest;
|
import com.sun.jdi.request.StepRequest;
|
||||||
import kotlin.ranges.IntRange;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
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.KtFunctionLiteral;
|
||||||
import org.jetbrains.kotlin.psi.KtNamedFunction;
|
import org.jetbrains.kotlin.psi.KtNamedFunction;
|
||||||
|
|
||||||
@@ -51,10 +47,7 @@ public class DebuggerSteppingHelper {
|
|||||||
public static DebugProcessImpl.ResumeCommand createStepOverCommand(
|
public static DebugProcessImpl.ResumeCommand createStepOverCommand(
|
||||||
final SuspendContextImpl suspendContext,
|
final SuspendContextImpl suspendContext,
|
||||||
final boolean ignoreBreakpoints,
|
final boolean ignoreBreakpoints,
|
||||||
final KtFile file,
|
final KotlinSteppingCommandProvider.KotlinSourcePosition kotlinSourcePosition
|
||||||
final IntRange linesRange,
|
|
||||||
final List<KtFunction> inlineArguments,
|
|
||||||
final List<PsiElement> additionalElementsToSkip
|
|
||||||
) {
|
) {
|
||||||
final DebugProcessImpl debugProcess = suspendContext.getDebugProcess();
|
final DebugProcessImpl debugProcess = suspendContext.getDebugProcess();
|
||||||
return debugProcess.new ResumeCommand(suspendContext) {
|
return debugProcess.new ResumeCommand(suspendContext) {
|
||||||
@@ -65,10 +58,7 @@ public class DebuggerSteppingHelper {
|
|||||||
if (frameProxy != null) {
|
if (frameProxy != null) {
|
||||||
Action action = KotlinSteppingCommandProviderKt.getStepOverPosition(
|
Action action = KotlinSteppingCommandProviderKt.getStepOverPosition(
|
||||||
frameProxy.location(),
|
frameProxy.location(),
|
||||||
file,
|
kotlinSourcePosition
|
||||||
linesRange,
|
|
||||||
inlineArguments,
|
|
||||||
additionalElementsToSkip
|
|
||||||
);
|
);
|
||||||
|
|
||||||
DebugProcessImpl.ResumeCommand command = action.createCommand(debugProcess, suspendContext, ignoreBreakpoints);
|
DebugProcessImpl.ResumeCommand command = action.createCommand(debugProcess, suspendContext, ignoreBreakpoints);
|
||||||
|
|||||||
+43
-13
@@ -68,25 +68,41 @@ class KotlinSteppingCommandProvider: JvmSteppingCommandProvider() {
|
|||||||
return getStepOverCommand(suspendContext, ignoreBreakpoints, debuggerContext.sourcePosition)
|
return getStepOverCommand(suspendContext, ignoreBreakpoints, debuggerContext.sourcePosition)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getStepOverCommand(suspendContext: SuspendContextImpl, ignoreBreakpoints: Boolean, sourcePosition: SourcePosition): DebugProcessImpl.ResumeCommand? {
|
private fun getStepOverCommand(
|
||||||
val file = sourcePosition.file as? KtFile ?: return null
|
suspendContext: SuspendContextImpl,
|
||||||
if (sourcePosition.line < 0) return null
|
ignoreBreakpoints: Boolean,
|
||||||
|
sourcePosition: SourcePosition): DebugProcessImpl.ResumeCommand? {
|
||||||
|
val kotlinSourcePosition = KotlinSourcePosition.create(sourcePosition) ?: return null
|
||||||
|
|
||||||
val containingFunction = sourcePosition.elementAt.parents
|
if (!isSpecialStepOverNeeded(kotlinSourcePosition)) return null
|
||||||
.filterIsInstance<KtNamedFunction>()
|
|
||||||
.firstOrNull { !it.isLocal } ?: return null
|
|
||||||
|
|
||||||
val startLineNumber = containingFunction.getLineNumber(true) + 1
|
return DebuggerSteppingHelper.createStepOverCommand(suspendContext, ignoreBreakpoints, kotlinSourcePosition)
|
||||||
val endLineNumber = containingFunction.getLineNumber(false) + 1
|
}
|
||||||
if (startLineNumber > endLineNumber) return null
|
|
||||||
|
|
||||||
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
|
@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(
|
fun getStepOverPosition(
|
||||||
location: Location,
|
location: Location,
|
||||||
file: KtFile,
|
file: KtFile,
|
||||||
|
|||||||
Reference in New Issue
Block a user