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.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);
@@ -68,7 +68,21 @@ 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(
suspendContext: SuspendContextImpl,
ignoreBreakpoints: Boolean,
sourcePosition: SourcePosition): DebugProcessImpl.ResumeCommand? {
val kotlinSourcePosition = KotlinSourcePosition.create(sourcePosition) ?: return null
if (!isSpecialStepOverNeeded(kotlinSourcePosition)) return null
return DebuggerSteppingHelper.createStepOverCommand(suspendContext, ignoreBreakpoints, kotlinSourcePosition)
}
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 val file = sourcePosition.file as? KtFile ?: return null
if (sourcePosition.line < 0) return null if (sourcePosition.line < 0) return null
@@ -82,11 +96,13 @@ class KotlinSteppingCommandProvider: JvmSteppingCommandProvider() {
val linesRange = startLineNumber..endLineNumber val linesRange = startLineNumber..endLineNumber
val inlineArgumentsToSkip = getElementsToSkip(containingFunction as KtNamedFunction, sourcePosition) ?: return null return KotlinSourcePosition(file, containingFunction, linesRange, sourcePosition)
}
}
}
val additionalElementsToSkip = sourcePosition.elementAt.getAdditionalElementsToSkip() private fun isSpecialStepOverNeeded(kotlinSourcePosition: KotlinSourcePosition): Boolean {
return getElementsToSkip(kotlinSourcePosition.function, kotlinSourcePosition.sourcePosition) != null
return DebuggerSteppingHelper.createStepOverCommand(suspendContext, ignoreBreakpoints, file, linesRange, inlineArgumentsToSkip, additionalElementsToSkip)
} }
@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,