Do an ordinal step over while stepping over inlined calls in dex
(cherry picked from commit d741895)
This commit is contained in:
committed by
Nikolay Krasko
parent
b6460e6280
commit
06b72e608e
@@ -35,6 +35,7 @@ import com.sun.jdi.request.EventRequestManager;
|
|||||||
import com.sun.jdi.request.StepRequest;
|
import com.sun.jdi.request.StepRequest;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.jetbrains.kotlin.idea.debugger.NoStrataPositionManagerHelperKt;
|
||||||
import org.jetbrains.kotlin.psi.KtFunctionLiteral;
|
import org.jetbrains.kotlin.psi.KtFunctionLiteral;
|
||||||
import org.jetbrains.kotlin.psi.KtNamedFunction;
|
import org.jetbrains.kotlin.psi.KtNamedFunction;
|
||||||
|
|
||||||
@@ -50,9 +51,17 @@ public class DebuggerSteppingHelper {
|
|||||||
final KotlinSteppingCommandProvider.KotlinSourcePosition kotlinSourcePosition
|
final KotlinSteppingCommandProvider.KotlinSourcePosition kotlinSourcePosition
|
||||||
) {
|
) {
|
||||||
final DebugProcessImpl debugProcess = suspendContext.getDebugProcess();
|
final DebugProcessImpl debugProcess = suspendContext.getDebugProcess();
|
||||||
|
|
||||||
return debugProcess.new ResumeCommand(suspendContext) {
|
return debugProcess.new ResumeCommand(suspendContext) {
|
||||||
@Override
|
@Override
|
||||||
public void contextAction() {
|
public void contextAction() {
|
||||||
|
// In DEX there's no strata for trying to understand what lines were inlined and no local variables attributes are
|
||||||
|
// preserved that can be used for fine tuning. So do an ordinal 'step over' instead.
|
||||||
|
if (NoStrataPositionManagerHelperKt.isDexDebug(suspendContext.getDebugProcess())) {
|
||||||
|
debugProcess.createStepOverCommand(suspendContext, true).contextAction();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
StackFrameProxyImpl frameProxy = suspendContext.getFrameProxy();
|
StackFrameProxyImpl frameProxy = suspendContext.getFrameProxy();
|
||||||
if (frameProxy != null) {
|
if (frameProxy != null) {
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
LineBreakpoint created at inlineInIfFalseDex.kt:6
|
||||||
|
!JDK_HOME!\bin\java -agentlib:jdwp=transport=dt_socket,address=!HOST_NAME!:!HOST_PORT!,suspend=y,server=n -Dfile.encoding=!FILE_ENCODING! -classpath !OUTPUT_PATH!;!KOTLIN_RUNTIME!;!CUSTOM_LIBRARY!;!RT_JAR! inlineInIfFalseDex.InlineInIfFalseDexKt
|
||||||
|
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||||
|
inlineInIfFalseDex.kt:6
|
||||||
|
inlineInIfFalseDex.kt:15
|
||||||
|
inlineInIfFalseDex.kt:9
|
||||||
|
inlineInIfFalseDex.kt:10
|
||||||
|
Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||||
|
|
||||||
|
Process finished with exit code 0
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
LineBreakpoint created at inlineInIfTrueDex.kt:6
|
||||||
|
!JDK_HOME!\bin\java -agentlib:jdwp=transport=dt_socket,address=!HOST_NAME!:!HOST_PORT!,suspend=y,server=n -Dfile.encoding=!FILE_ENCODING! -classpath !OUTPUT_PATH!;!KOTLIN_RUNTIME!;!CUSTOM_LIBRARY!;!RT_JAR! inlineInIfTrueDex.InlineInIfTrueDexKt
|
||||||
|
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||||
|
inlineInIfTrueDex.kt:6
|
||||||
|
inlineInIfTrueDex.kt:14
|
||||||
|
inlineInIfTrueDex.kt:7
|
||||||
|
inlineInIfTrueDex.kt:9
|
||||||
|
Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||||
|
|
||||||
|
Process finished with exit code 0
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
LineBreakpoint created at soInlineAnonymousFunctionArgumentDex.kt:5
|
||||||
|
!JDK_HOME!\bin\java -agentlib:jdwp=transport=dt_socket,address=!HOST_NAME!:!HOST_PORT!,suspend=y,server=n -Dfile.encoding=!FILE_ENCODING! -classpath !OUTPUT_PATH!;!KOTLIN_RUNTIME!;!CUSTOM_LIBRARY!;!RT_JAR! soInlineAnonymousFunctionArgumentDex.SoInlineAnonymousFunctionArgumentDexKt
|
||||||
|
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||||
|
soInlineAnonymousFunctionArgumentDex.kt:5
|
||||||
|
soInlineAnonymousFunctionArgumentDex.kt:7
|
||||||
|
soInlineAnonymousFunctionArgumentDex.kt:15
|
||||||
|
soInlineAnonymousFunctionArgumentDex.kt:8
|
||||||
|
soInlineAnonymousFunctionArgumentDex.kt:16
|
||||||
|
soInlineAnonymousFunctionArgumentDex.kt:15
|
||||||
|
soInlineAnonymousFunctionArgumentDex.kt:11
|
||||||
|
soInlineAnonymousFunctionArgumentDex.kt:16
|
||||||
|
Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||||
|
|
||||||
|
Process finished with exit code 0
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
LineBreakpoint created at soInlineCallInLastStatementInInlineDex.kt:10
|
||||||
|
!JDK_HOME!\bin\java -agentlib:jdwp=transport=dt_socket,address=!HOST_NAME!:!HOST_PORT!,suspend=y,server=n -Dfile.encoding=!FILE_ENCODING! -classpath !OUTPUT_PATH!;!KOTLIN_RUNTIME!;!CUSTOM_LIBRARY!;!RT_JAR! soInlineCallInLastStatementInInlineDex.SoInlineCallInLastStatementInInlineDexKt
|
||||||
|
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||||
|
soInlineCallInLastStatementInInlineDex.kt:10
|
||||||
|
soInlineCallInLastStatementInInlineDex.kt:11
|
||||||
|
soInlineCallInLastStatementInInlineDex.kt:15
|
||||||
|
soInlineCallInLastStatementInInlineDex.kt:11
|
||||||
|
soInlineCallInLastStatementInInlineDex.kt:16
|
||||||
|
soInlineCallInLastStatementInInlineDex.kt:6
|
||||||
|
Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||||
|
|
||||||
|
Process finished with exit code 0
|
||||||
Vendored
+9
@@ -0,0 +1,9 @@
|
|||||||
|
LineBreakpoint created at soInlineCallInLastStatementInInlineFunctionArgument.kt:7
|
||||||
|
!JDK_HOME!\bin\java -agentlib:jdwp=transport=dt_socket,address=!HOST_NAME!:!HOST_PORT!,suspend=y,server=n -Dfile.encoding=!FILE_ENCODING! -classpath !OUTPUT_PATH!;!KOTLIN_RUNTIME!;!CUSTOM_LIBRARY!;!RT_JAR! soInlineCallInLastStatementInInlineFunctionArgument.SoInlineCallInLastStatementInInlineFunctionArgumentKt
|
||||||
|
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||||
|
soInlineCallInLastStatementInInlineFunctionArgument.kt:7
|
||||||
|
soInlineCallInLastStatementInInlineFunctionArgument.kt:8
|
||||||
|
soInlineCallInLastStatementInInlineFunctionArgument.kt:9
|
||||||
|
Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||||
|
|
||||||
|
Process finished with exit code 0
|
||||||
Vendored
+10
@@ -0,0 +1,10 @@
|
|||||||
|
LineBreakpoint created at soInlineCallInLastStatementInInlineFunctionArgumentDex.kt:7
|
||||||
|
!JDK_HOME!\bin\java -agentlib:jdwp=transport=dt_socket,address=!HOST_NAME!:!HOST_PORT!,suspend=y,server=n -Dfile.encoding=!FILE_ENCODING! -classpath !OUTPUT_PATH!;!KOTLIN_RUNTIME!;!CUSTOM_LIBRARY!;!RT_JAR! soInlineCallInLastStatementInInlineFunctionArgumentDex.SoInlineCallInLastStatementInInlineFunctionArgumentDexKt
|
||||||
|
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||||
|
soInlineCallInLastStatementInInlineFunctionArgumentDex.kt:7
|
||||||
|
soInlineCallInLastStatementInInlineFunctionArgumentDex.kt:17
|
||||||
|
soInlineCallInLastStatementInInlineFunctionArgumentDex.kt:18
|
||||||
|
soInlineCallInLastStatementInInlineFunctionArgumentDex.kt:14
|
||||||
|
Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||||
|
|
||||||
|
Process finished with exit code 0
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
LineBreakpoint created at soInlineWhileConditionDex.kt:5
|
||||||
|
!JDK_HOME!\bin\java -agentlib:jdwp=transport=dt_socket,address=!HOST_NAME!:!HOST_PORT!,suspend=y,server=n -Dfile.encoding=!FILE_ENCODING! -classpath !OUTPUT_PATH!;!KOTLIN_RUNTIME!;!CUSTOM_LIBRARY!;!RT_JAR! soInlineWhileConditionDex.SoInlineWhileConditionDexKt
|
||||||
|
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||||
|
soInlineWhileConditionDex.kt:5
|
||||||
|
soInlineWhileConditionDex.kt:7
|
||||||
|
soInlineWhileConditionDex.kt:18
|
||||||
|
soInlineWhileConditionDex.kt:7
|
||||||
|
soInlineWhileConditionDex.kt:8
|
||||||
|
soInlineWhileConditionDex.kt:7
|
||||||
|
soInlineWhileConditionDex.kt:18
|
||||||
|
soInlineWhileConditionDex.kt:7
|
||||||
|
soInlineWhileConditionDex.kt:12
|
||||||
|
soInlineWhileConditionDex.kt:18
|
||||||
|
soInlineWhileConditionDex.kt:12
|
||||||
|
soInlineWhileConditionDex.kt:15
|
||||||
|
Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||||
|
|
||||||
|
Process finished with exit code 0
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package inlineInIfFalseDex
|
||||||
|
|
||||||
|
fun main(args: Array<String>) {
|
||||||
|
val bar = ""
|
||||||
|
//Breakpoint!
|
||||||
|
if (inlineCall { true }) {
|
||||||
|
foo()
|
||||||
|
}
|
||||||
|
foo()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo() {}
|
||||||
|
|
||||||
|
inline fun inlineCall(predicate: (String?) -> Boolean): Boolean {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// STEP_OVER: 8
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package inlineInIfTrueDex
|
||||||
|
|
||||||
|
fun main(args: Array<String>) {
|
||||||
|
val bar = ""
|
||||||
|
//Breakpoint!
|
||||||
|
if (inlineCall { true }) {
|
||||||
|
foo()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo() {}
|
||||||
|
|
||||||
|
inline fun inlineCall(predicate: (String?) -> Boolean): Boolean {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// STEP_OVER: 6
|
||||||
Vendored
+20
@@ -0,0 +1,20 @@
|
|||||||
|
package soInlineAnonymousFunctionArgumentDex
|
||||||
|
|
||||||
|
fun main(args: Array<String>) {
|
||||||
|
//Breakpoint!
|
||||||
|
val b = 1
|
||||||
|
|
||||||
|
foo(
|
||||||
|
fun (){ test(1) }
|
||||||
|
)
|
||||||
|
|
||||||
|
foo(fun (){ test(1) })
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun foo(f: () -> Unit) {
|
||||||
|
f()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun test(i: Int) = 1
|
||||||
|
|
||||||
|
// STEP_OVER: 10
|
||||||
Vendored
+20
@@ -0,0 +1,20 @@
|
|||||||
|
package soInlineCallInLastStatementInInlineDex
|
||||||
|
|
||||||
|
fun main(args: Array<String>) {
|
||||||
|
bar()
|
||||||
|
nop()
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun bar() {
|
||||||
|
//Breakpoint!
|
||||||
|
nop()
|
||||||
|
foo { 42 }
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun foo(f: () -> Unit) {
|
||||||
|
f()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun nop() {}
|
||||||
|
|
||||||
|
// STEP_OVER: 8
|
||||||
+22
@@ -0,0 +1,22 @@
|
|||||||
|
package soInlineCallInLastStatementInInlineFunctionArgument
|
||||||
|
|
||||||
|
fun main(args: Array<String>) {
|
||||||
|
bar {
|
||||||
|
nop()
|
||||||
|
//Breakpoint!
|
||||||
|
foo()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun bar(f: () -> Unit) {
|
||||||
|
nop()
|
||||||
|
f()
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun foo() {
|
||||||
|
nop()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun nop() {}
|
||||||
|
|
||||||
|
// STEP_OVER: 3
|
||||||
+22
@@ -0,0 +1,22 @@
|
|||||||
|
package soInlineCallInLastStatementInInlineFunctionArgumentDex
|
||||||
|
|
||||||
|
fun main(args: Array<String>) {
|
||||||
|
bar {
|
||||||
|
nop()
|
||||||
|
//Breakpoint!
|
||||||
|
foo()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun bar(f: () -> Unit) {
|
||||||
|
nop()
|
||||||
|
f()
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun foo() {
|
||||||
|
nop()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun nop() {}
|
||||||
|
|
||||||
|
// STEP_OVER: 5
|
||||||
+23
@@ -0,0 +1,23 @@
|
|||||||
|
package soInlineWhileConditionDex
|
||||||
|
|
||||||
|
fun main(args: Array<String>) {
|
||||||
|
//Breakpoint!
|
||||||
|
var i = 1
|
||||||
|
// inline in while condition (true)
|
||||||
|
while (id { i < 2 }) {
|
||||||
|
i++
|
||||||
|
}
|
||||||
|
|
||||||
|
// inline in while condition (false)
|
||||||
|
while (id { false }) {
|
||||||
|
bar()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun id(f: () -> Boolean): Boolean {
|
||||||
|
return f()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun bar() {}
|
||||||
|
|
||||||
|
// STEP_OVER: 12
|
||||||
@@ -421,12 +421,24 @@ public class KotlinSteppingTestGenerated extends AbstractKotlinSteppingTest {
|
|||||||
doStepOverTest(fileName);
|
doStepOverTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("inlineInIfFalseDex.kt")
|
||||||
|
public void testInlineInIfFalseDex() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/inlineInIfFalseDex.kt");
|
||||||
|
doStepOverTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("inlineInIfTrue.kt")
|
@TestMetadata("inlineInIfTrue.kt")
|
||||||
public void testInlineInIfTrue() throws Exception {
|
public void testInlineInIfTrue() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/inlineInIfTrue.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/inlineInIfTrue.kt");
|
||||||
doStepOverTest(fileName);
|
doStepOverTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("inlineInIfTrueDex.kt")
|
||||||
|
public void testInlineInIfTrueDex() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/inlineInIfTrueDex.kt");
|
||||||
|
doStepOverTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("inlineInObjectDex.kt")
|
@TestMetadata("inlineInObjectDex.kt")
|
||||||
public void testInlineInObjectDex() throws Exception {
|
public void testInlineInObjectDex() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/inlineInObjectDex.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/inlineInObjectDex.kt");
|
||||||
@@ -451,12 +463,36 @@ public class KotlinSteppingTestGenerated extends AbstractKotlinSteppingTest {
|
|||||||
doStepOverTest(fileName);
|
doStepOverTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("soInlineAnonymousFunctionArgumentDex.kt")
|
||||||
|
public void testSoInlineAnonymousFunctionArgumentDex() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/soInlineAnonymousFunctionArgumentDex.kt");
|
||||||
|
doStepOverTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("soInlineCallInLastStatementInInline.kt")
|
@TestMetadata("soInlineCallInLastStatementInInline.kt")
|
||||||
public void testSoInlineCallInLastStatementInInline() throws Exception {
|
public void testSoInlineCallInLastStatementInInline() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/soInlineCallInLastStatementInInline.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/soInlineCallInLastStatementInInline.kt");
|
||||||
doStepOverTest(fileName);
|
doStepOverTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("soInlineCallInLastStatementInInlineDex.kt")
|
||||||
|
public void testSoInlineCallInLastStatementInInlineDex() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/soInlineCallInLastStatementInInlineDex.kt");
|
||||||
|
doStepOverTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("soInlineCallInLastStatementInInlineFunctionArgument.kt")
|
||||||
|
public void testSoInlineCallInLastStatementInInlineFunctionArgument() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/soInlineCallInLastStatementInInlineFunctionArgument.kt");
|
||||||
|
doStepOverTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("soInlineCallInLastStatementInInlineFunctionArgumentDex.kt")
|
||||||
|
public void testSoInlineCallInLastStatementInInlineFunctionArgumentDex() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/soInlineCallInLastStatementInInlineFunctionArgumentDex.kt");
|
||||||
|
doStepOverTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("soInlineCallInLastStatementInInlineInInline.kt")
|
@TestMetadata("soInlineCallInLastStatementInInlineInInline.kt")
|
||||||
public void testSoInlineCallInLastStatementInInlineInInline() throws Exception {
|
public void testSoInlineCallInLastStatementInInlineInInline() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/soInlineCallInLastStatementInInlineInInline.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/soInlineCallInLastStatementInInlineInInline.kt");
|
||||||
@@ -505,6 +541,12 @@ public class KotlinSteppingTestGenerated extends AbstractKotlinSteppingTest {
|
|||||||
doStepOverTest(fileName);
|
doStepOverTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("soInlineWhileConditionDex.kt")
|
||||||
|
public void testSoInlineWhileConditionDex() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/soInlineWhileConditionDex.kt");
|
||||||
|
doStepOverTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("soReifiedInlineIfConditionFalse.kt")
|
@TestMetadata("soReifiedInlineIfConditionFalse.kt")
|
||||||
public void testSoReifiedInlineIfConditionFalse() throws Exception {
|
public void testSoReifiedInlineIfConditionFalse() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/soReifiedInlineIfConditionFalse.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/soReifiedInlineIfConditionFalse.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user