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,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,