FIR2IR: Fix line number differences in try block
This commit is contained in:
committed by
Mikhail Glukhikh
parent
5aa8e2d0d1
commit
e5bff514b6
@@ -948,13 +948,14 @@ class Fir2IrVisitor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun visitTryExpression(tryExpression: FirTryExpression, data: Any?): IrElement {
|
override fun visitTryExpression(tryExpression: FirTryExpression, data: Any?): IrElement {
|
||||||
|
// Always generate a block for try, catch and finally blocks. When leaving the finally block in the debugger
|
||||||
|
// for both Java and Kotlin there is a step on the end brace. For that to happen we need the block with
|
||||||
|
// that line number for the finally block.
|
||||||
return tryExpression.convertWithOffsets { startOffset, endOffset ->
|
return tryExpression.convertWithOffsets { startOffset, endOffset ->
|
||||||
IrTryImpl(
|
IrTryImpl(
|
||||||
startOffset, endOffset, tryExpression.typeRef.toIrType(),
|
startOffset, endOffset, tryExpression.typeRef.toIrType(),
|
||||||
tryExpression.tryBlock.convertToIrExpressionOrBlock(),
|
tryExpression.tryBlock.convertToIrBlock(),
|
||||||
tryExpression.catches.map { it.accept(this, data) as IrCatch },
|
tryExpression.catches.map { it.accept(this, data) as IrCatch },
|
||||||
// Always generate a block for the finally block. When leaving the finally block in the debugger for both
|
|
||||||
// Java and Kotlin there is a step on the end brace. For that to happen we need the block with that line number.
|
|
||||||
tryExpression.finallyBlock?.convertToIrBlock()
|
tryExpression.finallyBlock?.convertToIrBlock()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -963,7 +964,7 @@ class Fir2IrVisitor(
|
|||||||
override fun visitCatch(catch: FirCatch, data: Any?): IrElement {
|
override fun visitCatch(catch: FirCatch, data: Any?): IrElement {
|
||||||
return catch.convertWithOffsets { startOffset, endOffset ->
|
return catch.convertWithOffsets { startOffset, endOffset ->
|
||||||
val catchParameter = declarationStorage.createIrVariable(catch.parameter, conversionScope.parentFromStack())
|
val catchParameter = declarationStorage.createIrVariable(catch.parameter, conversionScope.parentFromStack())
|
||||||
IrCatchImpl(startOffset, endOffset, catchParameter, catch.block.convertToIrExpressionOrBlock())
|
IrCatchImpl(startOffset, endOffset, catchParameter, catch.block.convertToIrBlock())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -25,7 +25,8 @@ FILE fqName:<root> fileName:/useNextParamInLambda.kt
|
|||||||
CONST String type=kotlin.String value="fail"
|
CONST String type=kotlin.String value="fail"
|
||||||
TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit
|
TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit
|
||||||
TRY type=kotlin.Any
|
TRY type=kotlin.Any
|
||||||
try: CALL 'public final fun f (f1: kotlin.Function0<kotlin.String>, f2: kotlin.Function0<kotlin.String>): kotlin.String declared in <root>' type=kotlin.String origin=null
|
try: BLOCK type=kotlin.String origin=null
|
||||||
|
CALL 'public final fun f (f1: kotlin.Function0<kotlin.String>, f2: kotlin.Function0<kotlin.String>): kotlin.String declared in <root>' type=kotlin.String origin=null
|
||||||
CATCH parameter=val e: java.lang.Exception [val] declared in <root>.box
|
CATCH parameter=val e: java.lang.Exception [val] declared in <root>.box
|
||||||
VAR name:e type:java.lang.Exception [val]
|
VAR name:e type:java.lang.Exception [val]
|
||||||
BLOCK type=kotlin.Unit origin=null
|
BLOCK type=kotlin.Unit origin=null
|
||||||
|
|||||||
+4
-1
@@ -10,7 +10,9 @@ fun f(f1: Function0<String> = local fun <anonymous>(): String {
|
|||||||
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
var result: String = "fail"
|
var result: String = "fail"
|
||||||
try f()
|
try { // BLOCK
|
||||||
|
f()
|
||||||
|
}
|
||||||
catch (e: Exception){ // BLOCK
|
catch (e: Exception){ // BLOCK
|
||||||
result = "OK"
|
result = "OK"
|
||||||
}
|
}
|
||||||
@@ -23,3 +25,4 @@ fun box(): String {
|
|||||||
}
|
}
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,9 +4,11 @@ FILE fqName:<root> fileName:/catchParameterAccess.kt
|
|||||||
BLOCK_BODY
|
BLOCK_BODY
|
||||||
RETURN type=kotlin.Nothing from='public final fun test (f: kotlin.Function0<kotlin.Unit>): kotlin.Unit declared in <root>'
|
RETURN type=kotlin.Nothing from='public final fun test (f: kotlin.Function0<kotlin.Unit>): kotlin.Unit declared in <root>'
|
||||||
TRY type=kotlin.Unit
|
TRY type=kotlin.Unit
|
||||||
try: CALL 'public abstract fun invoke (): R of kotlin.Function0 [operator] declared in kotlin.Function0' type=kotlin.Unit origin=INVOKE
|
try: BLOCK type=kotlin.Unit origin=null
|
||||||
$this: GET_VAR 'f: kotlin.Function0<kotlin.Unit> declared in <root>.test' type=kotlin.Function0<kotlin.Unit> origin=VARIABLE_AS_FUNCTION
|
CALL 'public abstract fun invoke (): R of kotlin.Function0 [operator] declared in kotlin.Function0' type=kotlin.Unit origin=INVOKE
|
||||||
|
$this: GET_VAR 'f: kotlin.Function0<kotlin.Unit> declared in <root>.test' type=kotlin.Function0<kotlin.Unit> origin=VARIABLE_AS_FUNCTION
|
||||||
CATCH parameter=val e: java.lang.Exception [val] declared in <root>.test
|
CATCH parameter=val e: java.lang.Exception [val] declared in <root>.test
|
||||||
VAR name:e type:java.lang.Exception [val]
|
VAR name:e type:java.lang.Exception [val]
|
||||||
THROW type=kotlin.Nothing
|
BLOCK type=kotlin.Nothing origin=null
|
||||||
GET_VAR 'val e: java.lang.Exception [val] declared in <root>.test' type=java.lang.Exception origin=null
|
THROW type=kotlin.Nothing
|
||||||
|
GET_VAR 'val e: java.lang.Exception [val] declared in <root>.test' type=java.lang.Exception origin=null
|
||||||
|
|||||||
@@ -1,5 +1,10 @@
|
|||||||
fun test(f: Function0<Unit>) {
|
fun test(f: Function0<Unit>) {
|
||||||
return try f.invoke()
|
return try { // BLOCK
|
||||||
catch (e: Exception)throw e
|
f.invoke()
|
||||||
|
}
|
||||||
|
catch (e: Exception){ // BLOCK
|
||||||
|
throw e
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+10
-6
@@ -9,11 +9,13 @@ FILE fqName:<root> fileName:/kt48806.kt
|
|||||||
FIELD PROPERTY_BACKING_FIELD name:test_1 type:kotlin.Int visibility:private [final]
|
FIELD PROPERTY_BACKING_FIELD name:test_1 type:kotlin.Int visibility:private [final]
|
||||||
EXPRESSION_BODY
|
EXPRESSION_BODY
|
||||||
TRY type=kotlin.Int
|
TRY type=kotlin.Int
|
||||||
try: THROW type=kotlin.Nothing
|
try: BLOCK type=kotlin.Nothing origin=null
|
||||||
CONSTRUCTOR_CALL 'public constructor <init> () declared in java.lang.RuntimeException' type=java.lang.RuntimeException origin=null
|
THROW type=kotlin.Nothing
|
||||||
|
CONSTRUCTOR_CALL 'public constructor <init> () declared in java.lang.RuntimeException' type=java.lang.RuntimeException origin=null
|
||||||
CATCH parameter=val e: java.lang.Exception [val] declared in <root>.A.test_1
|
CATCH parameter=val e: java.lang.Exception [val] declared in <root>.A.test_1
|
||||||
VAR name:e type:java.lang.Exception [val]
|
VAR name:e type:java.lang.Exception [val]
|
||||||
CONST Int type=kotlin.Int value=1
|
BLOCK type=kotlin.Int origin=null
|
||||||
|
CONST Int type=kotlin.Int value=1
|
||||||
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-test_1> visibility:public modality:FINAL <> ($this:<root>.A) returnType:kotlin.Int
|
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-test_1> visibility:public modality:FINAL <> ($this:<root>.A) returnType:kotlin.Int
|
||||||
correspondingProperty: PROPERTY name:test_1 visibility:public modality:FINAL [val]
|
correspondingProperty: PROPERTY name:test_1 visibility:public modality:FINAL [val]
|
||||||
$this: VALUE_PARAMETER name:<this> type:<root>.A
|
$this: VALUE_PARAMETER name:<this> type:<root>.A
|
||||||
@@ -25,11 +27,13 @@ FILE fqName:<root> fileName:/kt48806.kt
|
|||||||
FIELD PROPERTY_BACKING_FIELD name:test_2 type:kotlin.Int visibility:private [final]
|
FIELD PROPERTY_BACKING_FIELD name:test_2 type:kotlin.Int visibility:private [final]
|
||||||
EXPRESSION_BODY
|
EXPRESSION_BODY
|
||||||
TRY type=kotlin.Int
|
TRY type=kotlin.Int
|
||||||
try: CONST Int type=kotlin.Int value=1
|
try: BLOCK type=kotlin.Int origin=null
|
||||||
|
CONST Int type=kotlin.Int value=1
|
||||||
CATCH parameter=val e: java.lang.Exception [val] declared in <root>.A.test_2
|
CATCH parameter=val e: java.lang.Exception [val] declared in <root>.A.test_2
|
||||||
VAR name:e type:java.lang.Exception [val]
|
VAR name:e type:java.lang.Exception [val]
|
||||||
THROW type=kotlin.Nothing
|
BLOCK type=kotlin.Nothing origin=null
|
||||||
CONSTRUCTOR_CALL 'public constructor <init> () declared in java.lang.RuntimeException' type=java.lang.RuntimeException origin=null
|
THROW type=kotlin.Nothing
|
||||||
|
CONSTRUCTOR_CALL 'public constructor <init> () declared in java.lang.RuntimeException' type=java.lang.RuntimeException origin=null
|
||||||
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-test_2> visibility:public modality:FINAL <> ($this:<root>.A) returnType:kotlin.Int
|
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-test_2> visibility:public modality:FINAL <> ($this:<root>.A) returnType:kotlin.Int
|
||||||
correspondingProperty: PROPERTY name:test_2 visibility:public modality:FINAL [val]
|
correspondingProperty: PROPERTY name:test_2 visibility:public modality:FINAL [val]
|
||||||
$this: VALUE_PARAMETER name:<this> type:<root>.A
|
$this: VALUE_PARAMETER name:<this> type:<root>.A
|
||||||
|
|||||||
+13
-4
@@ -6,15 +6,24 @@ class A {
|
|||||||
}
|
}
|
||||||
|
|
||||||
val test_1: Int
|
val test_1: Int
|
||||||
field = try throw RuntimeException()
|
field = try { // BLOCK
|
||||||
catch (e: Exception)1
|
throw RuntimeException()
|
||||||
|
}
|
||||||
|
catch (e: Exception){ // BLOCK
|
||||||
|
1
|
||||||
|
}
|
||||||
|
|
||||||
get
|
get
|
||||||
|
|
||||||
val test_2: Int
|
val test_2: Int
|
||||||
field = try 1
|
field = try { // BLOCK
|
||||||
catch (e: Exception)throw RuntimeException()
|
1
|
||||||
|
}
|
||||||
|
catch (e: Exception){ // BLOCK
|
||||||
|
throw RuntimeException()
|
||||||
|
}
|
||||||
|
|
||||||
get
|
get
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,10 +2,12 @@ FILE fqName:<root> fileName:/tryCatch.kt
|
|||||||
FUN name:test1 visibility:public modality:FINAL <> () returnType:kotlin.Unit
|
FUN name:test1 visibility:public modality:FINAL <> () returnType:kotlin.Unit
|
||||||
BLOCK_BODY
|
BLOCK_BODY
|
||||||
TRY type=kotlin.Unit
|
TRY type=kotlin.Unit
|
||||||
try: CALL 'public final fun println (): kotlin.Unit [inline] declared in kotlin.io.ConsoleKt' type=kotlin.Unit origin=null
|
try: BLOCK type=kotlin.Unit origin=null
|
||||||
|
CALL 'public final fun println (): kotlin.Unit [inline] declared in kotlin.io.ConsoleKt' type=kotlin.Unit origin=null
|
||||||
CATCH parameter=val e: kotlin.Throwable [val] declared in <root>.test1
|
CATCH parameter=val e: kotlin.Throwable [val] declared in <root>.test1
|
||||||
VAR name:e type:kotlin.Throwable [val]
|
VAR name:e type:kotlin.Throwable [val]
|
||||||
CALL 'public final fun println (): kotlin.Unit [inline] declared in kotlin.io.ConsoleKt' type=kotlin.Unit origin=null
|
BLOCK type=kotlin.Unit origin=null
|
||||||
|
CALL 'public final fun println (): kotlin.Unit [inline] declared in kotlin.io.ConsoleKt' type=kotlin.Unit origin=null
|
||||||
finally: BLOCK type=kotlin.Unit origin=null
|
finally: BLOCK type=kotlin.Unit origin=null
|
||||||
CALL 'public final fun println (): kotlin.Unit [inline] declared in kotlin.io.ConsoleKt' type=kotlin.Unit origin=null
|
CALL 'public final fun println (): kotlin.Unit [inline] declared in kotlin.io.ConsoleKt' type=kotlin.Unit origin=null
|
||||||
FUN name:test2 visibility:public modality:FINAL <> () returnType:kotlin.Int
|
FUN name:test2 visibility:public modality:FINAL <> () returnType:kotlin.Int
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
fun test1() {
|
fun test1() {
|
||||||
try println()
|
try { // BLOCK
|
||||||
catch (e: Throwable)println()
|
println()
|
||||||
|
}
|
||||||
|
catch (e: Throwable){ // BLOCK
|
||||||
|
println()
|
||||||
|
}
|
||||||
finally { // BLOCK
|
finally { // BLOCK
|
||||||
println()
|
println()
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-3
@@ -10,8 +10,10 @@ FILE fqName:<root> fileName:/tryCatchWithImplicitCast.kt
|
|||||||
GET_OBJECT 'CLASS IR_EXTERNAL_DECLARATION_STUB OBJECT name:Unit modality:FINAL visibility:public superTypes:[kotlin.Any]' type=kotlin.Unit
|
GET_OBJECT 'CLASS IR_EXTERNAL_DECLARATION_STUB OBJECT name:Unit modality:FINAL visibility:public superTypes:[kotlin.Any]' type=kotlin.Unit
|
||||||
VAR name:t type:kotlin.String [val]
|
VAR name:t type:kotlin.String [val]
|
||||||
TRY type=kotlin.String
|
TRY type=kotlin.String
|
||||||
try: TYPE_OP type=kotlin.String origin=IMPLICIT_CAST typeOperand=kotlin.String
|
try: BLOCK type=kotlin.String origin=null
|
||||||
GET_VAR 'a: kotlin.Any declared in <root>.testImplicitCast' type=kotlin.Any origin=null
|
TYPE_OP type=kotlin.String origin=IMPLICIT_CAST typeOperand=kotlin.String
|
||||||
|
GET_VAR 'a: kotlin.Any declared in <root>.testImplicitCast' type=kotlin.Any origin=null
|
||||||
CATCH parameter=val e: kotlin.Throwable [val] declared in <root>.testImplicitCast
|
CATCH parameter=val e: kotlin.Throwable [val] declared in <root>.testImplicitCast
|
||||||
VAR name:e type:kotlin.Throwable [val]
|
VAR name:e type:kotlin.Throwable [val]
|
||||||
CONST String type=kotlin.String value=""
|
BLOCK type=kotlin.String origin=null
|
||||||
|
CONST String type=kotlin.String value=""
|
||||||
|
|||||||
+7
-2
@@ -2,7 +2,12 @@ fun testImplicitCast(a: Any) {
|
|||||||
when {
|
when {
|
||||||
a !is String -> return Unit
|
a !is String -> return Unit
|
||||||
}
|
}
|
||||||
val t: String = try a /*as String */
|
val t: String = try { // BLOCK
|
||||||
catch (e: Throwable)""
|
a /*as String */
|
||||||
|
}
|
||||||
|
catch (e: Throwable){ // BLOCK
|
||||||
|
""
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user