From f664ffb06b879446dbc9bb57b75784a1de5c8240 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Wed, 12 Jul 2017 19:09:48 +0300 Subject: [PATCH] Check correspondent call on end token for better step over (KT-18949) #KT-18949 Fixed --- .../idea/codeInsight/CodeInsightUtils.java | 21 +++++++++++ .../kotlin/idea/debugger/debuggerUtil.kt | 23 ++++++++++-- .../stepping/KotlinSteppingCommandProvider.kt | 13 ++++++- ...nLastStatementInInlineFunctionArgument.out | 1 - ...astStatementInInlineFunctionArgumentDex.kt | 2 +- ...stStatementInInlineFunctionArgumentDex.out | 1 - ...nlineFunctionArgumenBeforeOtherArgument.kt | 17 +++++++++ ...lineFunctionArgumenBeforeOtherArgument.out | 9 +++++ ...mentInInlineFunctionArgumentAsAnonymous.kt | 17 +++++++++ ...entInInlineFunctionArgumentAsAnonymous.out | 9 +++++ ...eFunctionArgumentAsAnonymousParNextLine.kt | 18 ++++++++++ ...FunctionArgumentAsAnonymousParNextLine.out | 9 +++++ ...ntInInlineFunctionArgumentInGetOperator.kt | 17 +++++++++ ...tInInlineFunctionArgumentInGetOperator.out | 9 +++++ ...InInlineFunctionArgumentInNonInlineCall.kt | 22 ++++++++++++ ...nInlineFunctionArgumentInNonInlineCall.out | 9 +++++ ...StatementInInlineFunctionArgumentInPars.kt | 17 +++++++++ ...tatementInInlineFunctionArgumentInPars.out | 9 +++++ .../debugger/KotlinSteppingTestGenerated.java | 36 +++++++++++++++++++ 19 files changed, 252 insertions(+), 7 deletions(-) create mode 100644 idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumenBeforeOtherArgument.kt create mode 100644 idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumenBeforeOtherArgument.out create mode 100644 idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentAsAnonymous.kt create mode 100644 idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentAsAnonymous.out create mode 100644 idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentAsAnonymousParNextLine.kt create mode 100644 idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentAsAnonymousParNextLine.out create mode 100644 idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentInGetOperator.kt create mode 100644 idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentInGetOperator.out create mode 100644 idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentInNonInlineCall.kt create mode 100644 idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentInNonInlineCall.out create mode 100644 idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentInPars.kt create mode 100644 idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentInPars.out diff --git a/idea/src/org/jetbrains/kotlin/idea/codeInsight/CodeInsightUtils.java b/idea/src/org/jetbrains/kotlin/idea/codeInsight/CodeInsightUtils.java index 45cb7e05715..24f47c1c8ba 100644 --- a/idea/src/org/jetbrains/kotlin/idea/codeInsight/CodeInsightUtils.java +++ b/idea/src/org/jetbrains/kotlin/idea/codeInsight/CodeInsightUtils.java @@ -339,6 +339,27 @@ public class CodeInsightUtils { return element; } + @NotNull + public static PsiElement getTopParentWithEndOffset(@NotNull PsiElement element, @NotNull Class stopAt) { + int endOffset = element.getTextOffset() + element.getTextLength(); + + do { + PsiElement parent = element.getParent(); + if (parent == null || (parent.getTextOffset() + parent.getTextLength()) != endOffset) { + break; + } + element = parent; + + if (stopAt.isInstance(element)) { + break; + } + } + while(true); + + return element; + } + + @Nullable public static T getTopmostElementAtOffset(@NotNull PsiElement element, int offset, @NotNull Class klass) { T lastElementOfType = null; diff --git a/idea/src/org/jetbrains/kotlin/idea/debugger/debuggerUtil.kt b/idea/src/org/jetbrains/kotlin/idea/debugger/debuggerUtil.kt index bac4ec5674e..5f9b94b0c67 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/debuggerUtil.kt +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/debuggerUtil.kt @@ -32,10 +32,9 @@ import org.jetbrains.kotlin.idea.debugger.evaluate.KotlinDebuggerCaches import org.jetbrains.kotlin.idea.refactoring.getLineEndOffset import org.jetbrains.kotlin.idea.refactoring.getLineStartOffset import org.jetbrains.kotlin.idea.util.application.runReadAction +import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.load.java.JvmAbi -import org.jetbrains.kotlin.psi.KtElement -import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.psi.KtFunction +import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.inline.InlineUtil import java.util.* @@ -218,3 +217,21 @@ fun findElementAtLine(file: KtFile, line: Int): PsiElement? { return topMostElement } + +fun findCallByEndToken(element: PsiElement): KtCallExpression? { + if (element is KtElement) return null + + return when (element.node.elementType) { + KtTokens.RPAR -> (element.parent as? KtValueArgumentList)?.parent as? KtCallExpression + KtTokens.RBRACE -> { + val braceParent = CodeInsightUtils.getTopParentWithEndOffset(element, KtCallExpression::class.java) + when (braceParent) { + is KtCallExpression -> braceParent + is KtLambdaArgument -> braceParent.parent as? KtCallExpression + is KtValueArgument -> (braceParent.parent as? KtValueArgumentList)?.parent as? KtCallExpression + else -> null + } + } + else -> null + } +} 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 1e0956aed9b..f09ba317f78 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/stepping/KotlinSteppingCommandProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/stepping/KotlinSteppingCommandProvider.kt @@ -235,7 +235,18 @@ private fun findCallsOnPosition(sourcePosition: SourcePosition, filter: (KtCallE val file = sourcePosition.file as? KtFile ?: return emptyList() val lineNumber = sourcePosition.line - val lineElement = findElementAtLine(file, lineNumber) as? KtElement ?: return emptyList() + val lineElement = findElementAtLine(file, lineNumber) + + if (lineElement !is KtElement) { + if (lineElement != null) { + val call = findCallByEndToken(lineElement) + if (call != null && filter(call)) { + return listOf(call) + } + } + + return emptyList() + } val start = lineElement.startOffset val end = lineElement.endOffset diff --git a/idea/testData/debugger/tinyApp/src/stepping/stepOver/soInlineCallInLastStatementInInlineFunctionArgument.out b/idea/testData/debugger/tinyApp/src/stepping/stepOver/soInlineCallInLastStatementInInlineFunctionArgument.out index 22445529a83..b41b510fe09 100644 --- a/idea/testData/debugger/tinyApp/src/stepping/stepOver/soInlineCallInLastStatementInInlineFunctionArgument.out +++ b/idea/testData/debugger/tinyApp/src/stepping/stepOver/soInlineCallInLastStatementInInlineFunctionArgument.out @@ -3,7 +3,6 @@ Run Java Connected to the target VM soInlineCallInLastStatementInInlineFunctionArgument.kt:7 soInlineCallInLastStatementInInlineFunctionArgument.kt:8 -soInlineCallInLastStatementInInlineFunctionArgument.kt:14 soInlineCallInLastStatementInInlineFunctionArgument.kt:9 Disconnected from the target VM diff --git a/idea/testData/debugger/tinyApp/src/stepping/stepOver/soInlineCallInLastStatementInInlineFunctionArgumentDex.kt b/idea/testData/debugger/tinyApp/src/stepping/stepOver/soInlineCallInLastStatementInInlineFunctionArgumentDex.kt index f4d5908e979..0abd108a9ae 100644 --- a/idea/testData/debugger/tinyApp/src/stepping/stepOver/soInlineCallInLastStatementInInlineFunctionArgumentDex.kt +++ b/idea/testData/debugger/tinyApp/src/stepping/stepOver/soInlineCallInLastStatementInInlineFunctionArgumentDex.kt @@ -4,7 +4,7 @@ fun main(args: Array) { bar { nop() //Breakpoint! - foo() // <-- Should not stop here twice + foo() } } diff --git a/idea/testData/debugger/tinyApp/src/stepping/stepOver/soInlineCallInLastStatementInInlineFunctionArgumentDex.out b/idea/testData/debugger/tinyApp/src/stepping/stepOver/soInlineCallInLastStatementInInlineFunctionArgumentDex.out index cead4959e33..c1599ff8e1d 100644 --- a/idea/testData/debugger/tinyApp/src/stepping/stepOver/soInlineCallInLastStatementInInlineFunctionArgumentDex.out +++ b/idea/testData/debugger/tinyApp/src/stepping/stepOver/soInlineCallInLastStatementInInlineFunctionArgumentDex.out @@ -3,7 +3,6 @@ Run Java Connected to the target VM soInlineCallInLastStatementInInlineFunctionArgumentDex.kt:7 soInlineCallInLastStatementInInlineFunctionArgumentDex.kt:8 -soInlineCallInLastStatementInInlineFunctionArgumentDex.kt:14 soInlineCallInLastStatementInInlineFunctionArgumentDex.kt:9 Disconnected from the target VM diff --git a/idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumenBeforeOtherArgument.kt b/idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumenBeforeOtherArgument.kt new file mode 100644 index 00000000000..9e2abbcae33 --- /dev/null +++ b/idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumenBeforeOtherArgument.kt @@ -0,0 +1,17 @@ +package soLastStatementInInlineFunctionArgumenBeforeOtherArgument + +fun main(args: Array) { + bar({ + //Breakpoint! + nop() + }, 12) +} + +inline fun bar(f: () -> Unit, a: Any) { + nop() + f() +} // <-- Ideally this line should not be visited + +fun nop() {} + +// STEP_OVER: 2 \ No newline at end of file diff --git a/idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumenBeforeOtherArgument.out b/idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumenBeforeOtherArgument.out new file mode 100644 index 00000000000..ff6cde7caff --- /dev/null +++ b/idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumenBeforeOtherArgument.out @@ -0,0 +1,9 @@ +LineBreakpoint created at soLastStatementInInlineFunctionArgumenBeforeOtherArgument.kt:6 +Run Java +Connected to the target VM +soLastStatementInInlineFunctionArgumenBeforeOtherArgument.kt:6 +soLastStatementInInlineFunctionArgumenBeforeOtherArgument.kt:7 +soLastStatementInInlineFunctionArgumenBeforeOtherArgument.kt:13 +Disconnected from the target VM + +Process finished with exit code 0 diff --git a/idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentAsAnonymous.kt b/idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentAsAnonymous.kt new file mode 100644 index 00000000000..e466cafcf98 --- /dev/null +++ b/idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentAsAnonymous.kt @@ -0,0 +1,17 @@ +package soLastStatementInInlineFunctionArgumentAsAnonymous + +fun main(args: Array) { + bar(fun() { + //Breakpoint! + nop() + }) +} + +inline fun bar(f: () -> Unit) { + nop() + f() +} + +fun nop() {} + +// STEP_OVER: 2 \ No newline at end of file diff --git a/idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentAsAnonymous.out b/idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentAsAnonymous.out new file mode 100644 index 00000000000..302b4e6f864 --- /dev/null +++ b/idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentAsAnonymous.out @@ -0,0 +1,9 @@ +LineBreakpoint created at soLastStatementInInlineFunctionArgumentAsAnonymous.kt:6 +Run Java +Connected to the target VM +soLastStatementInInlineFunctionArgumentAsAnonymous.kt:6 +soLastStatementInInlineFunctionArgumentAsAnonymous.kt:7 +soLastStatementInInlineFunctionArgumentAsAnonymous.kt:8 +Disconnected from the target VM + +Process finished with exit code 0 diff --git a/idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentAsAnonymousParNextLine.kt b/idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentAsAnonymousParNextLine.kt new file mode 100644 index 00000000000..8ecd52af253 --- /dev/null +++ b/idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentAsAnonymousParNextLine.kt @@ -0,0 +1,18 @@ +package soLastStatementInInlineFunctionArgumentAsAnonymousParNextLine + +fun main(args: Array) { + bar(fun() { + //Breakpoint! + nop() + } + ) +} + +inline fun bar(f: () -> Unit) { + nop() + f() +} + +fun nop() {} + +// STEP_OVER: 2 \ No newline at end of file diff --git a/idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentAsAnonymousParNextLine.out b/idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentAsAnonymousParNextLine.out new file mode 100644 index 00000000000..2d20bef6e92 --- /dev/null +++ b/idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentAsAnonymousParNextLine.out @@ -0,0 +1,9 @@ +LineBreakpoint created at soLastStatementInInlineFunctionArgumentAsAnonymousParNextLine.kt:6 +Run Java +Connected to the target VM +soLastStatementInInlineFunctionArgumentAsAnonymousParNextLine.kt:6 +soLastStatementInInlineFunctionArgumentAsAnonymousParNextLine.kt:7 +soLastStatementInInlineFunctionArgumentAsAnonymousParNextLine.kt:9 +Disconnected from the target VM + +Process finished with exit code 0 diff --git a/idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentInGetOperator.kt b/idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentInGetOperator.kt new file mode 100644 index 00000000000..fed1185a4b9 --- /dev/null +++ b/idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentInGetOperator.kt @@ -0,0 +1,17 @@ +package soLastStatementInInlineFunctionArgumentInGetOperator + +fun main(args: Array) { + 12[{ + //Breakpoint! + nop() + }] +} + +inline operator fun Int.get(f: () -> Unit) { + nop() + f() +} // <-- Ideally this line should not be visited + +fun nop() {} + +// STEP_OVER: 2 \ No newline at end of file diff --git a/idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentInGetOperator.out b/idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentInGetOperator.out new file mode 100644 index 00000000000..f5ab5db82aa --- /dev/null +++ b/idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentInGetOperator.out @@ -0,0 +1,9 @@ +LineBreakpoint created at soLastStatementInInlineFunctionArgumentInGetOperator.kt:6 +Run Java +Connected to the target VM +soLastStatementInInlineFunctionArgumentInGetOperator.kt:6 +soLastStatementInInlineFunctionArgumentInGetOperator.kt:7 +soLastStatementInInlineFunctionArgumentInGetOperator.kt:13 +Disconnected from the target VM + +Process finished with exit code 0 diff --git a/idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentInNonInlineCall.kt b/idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentInNonInlineCall.kt new file mode 100644 index 00000000000..10e186ae23f --- /dev/null +++ b/idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentInNonInlineCall.kt @@ -0,0 +1,22 @@ +package soLastStatementInInlineFunctionArgumentInNonInlineCall + +fun main(args: Array) { + nonInline { bar { + //Breakpoint! + nop() + } } +} + +fun nonInline(f: () -> Unit) { + f() +} + +inline fun bar(f: () -> Unit) { + nop() + f() +} // <-- Ideally this line should not be visited + +fun nop() {} + + +// STEP_OVER: 2 \ No newline at end of file diff --git a/idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentInNonInlineCall.out b/idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentInNonInlineCall.out new file mode 100644 index 00000000000..07129853e74 --- /dev/null +++ b/idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentInNonInlineCall.out @@ -0,0 +1,9 @@ +LineBreakpoint created at soLastStatementInInlineFunctionArgumentInNonInlineCall.kt:6 +Run Java +Connected to the target VM +soLastStatementInInlineFunctionArgumentInNonInlineCall.kt:6 +soLastStatementInInlineFunctionArgumentInNonInlineCall.kt:7 +soLastStatementInInlineFunctionArgumentInNonInlineCall.kt:17 +Disconnected from the target VM + +Process finished with exit code 0 diff --git a/idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentInPars.kt b/idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentInPars.kt new file mode 100644 index 00000000000..87f75250ebc --- /dev/null +++ b/idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentInPars.kt @@ -0,0 +1,17 @@ +package soLastStatementInInlineFunctionArgumentInPars + +fun main(args: Array) { + bar({ + //Breakpoint! + nop() + }) +} + +inline fun bar(f: () -> Unit) { + nop() + f() +} + +fun nop() {} + +// STEP_OVER: 2 \ No newline at end of file diff --git a/idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentInPars.out b/idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentInPars.out new file mode 100644 index 00000000000..e93173ec172 --- /dev/null +++ b/idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentInPars.out @@ -0,0 +1,9 @@ +LineBreakpoint created at soLastStatementInInlineFunctionArgumentInPars.kt:6 +Run Java +Connected to the target VM +soLastStatementInInlineFunctionArgumentInPars.kt:6 +soLastStatementInInlineFunctionArgumentInPars.kt:7 +soLastStatementInInlineFunctionArgumentInPars.kt:8 +Disconnected from the target VM + +Process finished with exit code 0 diff --git a/idea/tests/org/jetbrains/kotlin/idea/debugger/KotlinSteppingTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/debugger/KotlinSteppingTestGenerated.java index d48702a8fa3..b6068e0d375 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/debugger/KotlinSteppingTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/debugger/KotlinSteppingTestGenerated.java @@ -620,6 +620,42 @@ public class KotlinSteppingTestGenerated extends AbstractKotlinSteppingTest { doStepOverTest(fileName); } + @TestMetadata("soLastStatementInInlineFunctionArgumenBeforeOtherArgument.kt") + public void testSoLastStatementInInlineFunctionArgumenBeforeOtherArgument() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumenBeforeOtherArgument.kt"); + doStepOverTest(fileName); + } + + @TestMetadata("soLastStatementInInlineFunctionArgumentAsAnonymous.kt") + public void testSoLastStatementInInlineFunctionArgumentAsAnonymous() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentAsAnonymous.kt"); + doStepOverTest(fileName); + } + + @TestMetadata("soLastStatementInInlineFunctionArgumentAsAnonymousParNextLine.kt") + public void testSoLastStatementInInlineFunctionArgumentAsAnonymousParNextLine() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentAsAnonymousParNextLine.kt"); + doStepOverTest(fileName); + } + + @TestMetadata("soLastStatementInInlineFunctionArgumentInGetOperator.kt") + public void testSoLastStatementInInlineFunctionArgumentInGetOperator() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentInGetOperator.kt"); + doStepOverTest(fileName); + } + + @TestMetadata("soLastStatementInInlineFunctionArgumentInNonInlineCall.kt") + public void testSoLastStatementInInlineFunctionArgumentInNonInlineCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentInNonInlineCall.kt"); + doStepOverTest(fileName); + } + + @TestMetadata("soLastStatementInInlineFunctionArgumentInPars.kt") + public void testSoLastStatementInInlineFunctionArgumentInPars() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/soLastStatementInInlineFunctionArgumentInPars.kt"); + doStepOverTest(fileName); + } + @TestMetadata("soNonSuspendableSuspendCall.kt") public void testSoNonSuspendableSuspendCall() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/soNonSuspendableSuspendCall.kt");