[LL FIR] rewrote in-block modifications logic

Now we will invalidate bodies for FIR declarations
immediately after in-block modifications in these declarations
We assume that such in-block modifications can happen
only under write action,
so it should be safe to make changes for FirFile

^KT-59687 Fixed
^KT-59199 Fixed
^KTIJ-26066 Fixed
This commit is contained in:
Dmitrii Gridin
2023-06-30 17:47:58 +02:00
parent a50efd7aa2
commit e354b2a900
108 changed files with 1642 additions and 403 deletions
@@ -0,0 +1,9 @@
import kotlin.contracts.InvocationKind
inline fun f<caret>oo(block: () -> Unit) {
kotlin.contracts.contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
block()
}
@@ -0,0 +1,21 @@
BEFORE MODIFICATION:
public final inline [ResolvedTo(BODY_RESOLVE)] fun foo([ResolvedTo(BODY_RESOLVE)] block: R|() -> kotlin/Unit|): R|kotlin/Unit|
[Contract description] <
Q|kotlin|.<Unresolved name: contracts>#.<Unresolved name: contract>#(<L> = [ResolvedTo(RAW_FIR)] contract@fun <anonymous>(): <ERROR TYPE REF: Unresolved name: callsInPlace> <inline=Unknown> {
^ <Unresolved name: callsInPlace>#(R|<local>/block|, <Unresolved name: InvocationKind>#.<Unresolved name: EXACTLY_ONCE>#)
}
)
>
{
{
kotlin#.contracts#.contract#(<L> = [ResolvedTo(BODY_RESOLVE)] contract@fun <implicit>.<anonymous>(): <implicit> <inline=Unknown> {
callsInPlace#(block#, InvocationKind#.EXACTLY_ONCE#)
}
)
}
R|<local>/block|.R|SubstitutionOverride<kotlin/Function0.invoke: R|kotlin/Unit|>|()
}
AFTER MODIFICATION:
public final inline [ResolvedTo(ARGUMENTS_OF_ANNOTATIONS)] fun foo([ResolvedTo(BODY_RESOLVE)] block: R|() -> kotlin/Unit|): R|kotlin/Unit| { LAZY_BLOCK }
@@ -0,0 +1,19 @@
BEFORE MODIFICATION:
public final inline [ResolvedTo(BODY_RESOLVE)] fun foo([ResolvedTo(BODY_RESOLVE)] block: R|() -> kotlin/Unit|): R|kotlin/Unit|
[R|Contract description]
<
CallsInPlace(block, EXACTLY_ONCE)
>
{
{
Q|kotlin/contracts|.R|kotlin/contracts/contract|(<L> = [ResolvedTo(BODY_RESOLVE)] [MatchingParameterFunctionTypeKey=@ExtensionFunctionType kotlin/Function1<kotlin/contracts/ContractBuilder, kotlin/Unit>] contract@fun R|kotlin/contracts/ContractBuilder|.<anonymous>(): R|kotlin/Unit| <inline=Inline, kind=UNKNOWN> {
this@R|special/anonymous|.R|kotlin/contracts/ContractBuilder.callsInPlace|<R|kotlin/Unit|>(R|<local>/block|, Q|kotlin/contracts/InvocationKind|.R|kotlin/contracts/InvocationKind.EXACTLY_ONCE|)
}
)
}
R|<local>/block|.R|SubstitutionOverride<kotlin/Function0.invoke: R|kotlin/Unit|>|()
}
AFTER MODIFICATION:
public final inline [ResolvedTo(ARGUMENTS_OF_ANNOTATIONS)] fun foo([ResolvedTo(BODY_RESOLVE)] block: R|() -> kotlin/Unit|): R|kotlin/Unit| { LAZY_BLOCK }
@@ -0,0 +1,7 @@
class MyProducer {
fun produce(): Int = 4
}
fun MyProducer.test<caret>Fun(param1: Int = produce()) {
}
@@ -0,0 +1,6 @@
BEFORE MODIFICATION:
public final [ResolvedTo(BODY_RESOLVE)] fun R|MyProducer|.testFun([ResolvedTo(BODY_RESOLVE)] param1: R|kotlin/Int| = this@R|/testFun|.R|/MyProducer.produce|()): R|kotlin/Unit| {
}
AFTER MODIFICATION:
public final [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] fun R|MyProducer|.testFun([ResolvedTo(BODY_RESOLVE)] param1: R|kotlin/Int| = this@R|/testFun|.R|/MyProducer.produce|()): R|kotlin/Unit| { LAZY_BLOCK }
@@ -0,0 +1,5 @@
fun test<caret>Fun(param1: Int, param2: String = "str", param3: List<Int> = myList()) {
}
fun myList(): List<Int>
@@ -0,0 +1,6 @@
BEFORE MODIFICATION:
public final [ResolvedTo(BODY_RESOLVE)] fun testFun([ResolvedTo(BODY_RESOLVE)] param1: R|kotlin/Int|, [ResolvedTo(BODY_RESOLVE)] param2: R|kotlin/String| = String(str), [ResolvedTo(BODY_RESOLVE)] param3: R|kotlin/collections/List<kotlin/Int>| = R|/myList|()): R|kotlin/Unit| {
}
AFTER MODIFICATION:
public final [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] fun testFun([ResolvedTo(BODY_RESOLVE)] param1: R|kotlin/Int|, [ResolvedTo(BODY_RESOLVE)] param2: R|kotlin/String| = String(str), [ResolvedTo(BODY_RESOLVE)] param3: R|kotlin/collections/List<kotlin/Int>| = R|/myList|()): R|kotlin/Unit| { LAZY_BLOCK }
@@ -0,0 +1,13 @@
import kotlin.contracts.contract
class A {
fun <caret>x() {
contract {
req
}
val a = doSmth("str")
}
}
fun doSmth(i: String) = 4
@@ -0,0 +1,21 @@
BEFORE MODIFICATION:
public final [ResolvedTo(BODY_RESOLVE)] fun x(): R|kotlin/Unit|
[Contract description] <
<Unresolved name: contract>#(<L> = [ResolvedTo(RAW_FIR)] contract@fun <anonymous>(): <ERROR TYPE REF: Unresolved name: req> <inline=Unknown> {
^ <Unresolved name: req>#
}
)
>
{
{
contract#(<L> = [ResolvedTo(BODY_RESOLVE)] contract@fun <implicit>.<anonymous>(): <implicit> <inline=Unknown> {
req#
}
)
}
[ResolvedTo(BODY_RESOLVE)] lval a: R|kotlin/Int| = R|/doSmth|(String(str))
}
AFTER MODIFICATION:
public final [ResolvedTo(ARGUMENTS_OF_ANNOTATIONS)] fun x(): R|kotlin/Unit| { LAZY_BLOCK }
@@ -0,0 +1,18 @@
BEFORE MODIFICATION:
public final [ResolvedTo(BODY_RESOLVE)] fun x(): R|kotlin/Unit|
[R|Contract description]
<
>
{
{
R|kotlin/contracts/contract|(<L> = [ResolvedTo(BODY_RESOLVE)] [MatchingParameterFunctionTypeKey=@ExtensionFunctionType kotlin/Function1<kotlin/contracts/ContractBuilder, kotlin/Unit>] contract@fun R|kotlin/contracts/ContractBuilder|.<anonymous>(): R|kotlin/Unit| <inline=Inline, kind=UNKNOWN> {
<Unresolved name: req>#
}
)
}
[ResolvedTo(BODY_RESOLVE)] lval a: R|kotlin/Int| = R|/doSmth|(String(str))
}
AFTER MODIFICATION:
public final [ResolvedTo(ARGUMENTS_OF_ANNOTATIONS)] fun x(): R|kotlin/Unit| { LAZY_BLOCK }
@@ -0,0 +1,9 @@
import kotlin.contracts.*
class A {
fun passLa<caret>mbdaValue(l: ContractBuilder.() -> Unit) {
contract(l)
}
}
fun doSmth(i: String) = 4
@@ -0,0 +1,14 @@
BEFORE MODIFICATION:
public final [ResolvedTo(BODY_RESOLVE)] fun passLambdaValue([ResolvedTo(BODY_RESOLVE)] l: R|ERROR CLASS: Symbol not found for ContractBuilder.() -> kotlin/Unit|): R|kotlin/Unit|
[Contract description] <
<Unresolved name: contract>#(R|<local>/l|)
>
{
{
contract#(l#)
}
}
AFTER MODIFICATION:
public final [ResolvedTo(ARGUMENTS_OF_ANNOTATIONS)] fun passLambdaValue([ResolvedTo(BODY_RESOLVE)] l: R|ERROR CLASS: Symbol not found for ContractBuilder.() -> kotlin/Unit|): R|kotlin/Unit| { LAZY_BLOCK }
@@ -0,0 +1,14 @@
BEFORE MODIFICATION:
public final [ResolvedTo(BODY_RESOLVE)] fun passLambdaValue([ResolvedTo(BODY_RESOLVE)] l: R|kotlin/contracts/ContractBuilder.() -> kotlin/Unit|): R|kotlin/Unit|
[Contract description] <
R|kotlin/contracts/contract|(R|<local>/l|)
>
{
{
R|kotlin/contracts/contract|(R|<local>/l|)
}
}
AFTER MODIFICATION:
public final [ResolvedTo(ARGUMENTS_OF_ANNOTATIONS)] fun passLambdaValue([ResolvedTo(BODY_RESOLVE)] l: R|kotlin/contracts/ContractBuilder.() -> kotlin/Unit|): R|kotlin/Unit| { LAZY_BLOCK }
@@ -0,0 +1,11 @@
class A {
fun <caret>x() {
contract {
req
}
val a = doSmth("str")
}
}
fun doSmth(i: String) = 4
@@ -0,0 +1,21 @@
BEFORE MODIFICATION:
public final [ResolvedTo(BODY_RESOLVE)] fun x(): R|kotlin/Unit|
[Contract description] <
<Unresolved name: contract>#(<L> = [ResolvedTo(RAW_FIR)] contract@fun <anonymous>(): <ERROR TYPE REF: Unresolved name: req> <inline=Unknown> {
^ <Unresolved name: req>#
}
)
>
{
{
contract#(<L> = [ResolvedTo(BODY_RESOLVE)] contract@fun <implicit>.<anonymous>(): <implicit> <inline=Unknown> {
req#
}
)
}
[ResolvedTo(BODY_RESOLVE)] lval a: R|kotlin/Int| = R|/doSmth|(String(str))
}
AFTER MODIFICATION:
public final [ResolvedTo(ARGUMENTS_OF_ANNOTATIONS)] fun x(): R|kotlin/Unit| { LAZY_BLOCK }
@@ -0,0 +1,7 @@
class A {
fun <caret>x(): Int {
return doSmth("str")
}
}
fun doSmth(i: String) = 4
@@ -0,0 +1,7 @@
BEFORE MODIFICATION:
public final [ResolvedTo(BODY_RESOLVE)] fun x(): R|kotlin/Int| {
^x R|/doSmth|(String(str))
}
AFTER MODIFICATION:
public final [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] fun x(): R|kotlin/Int| { LAZY_BLOCK }
@@ -0,0 +1,7 @@
class A {
fun <caret>x() {
val a = doSmth("str")
}
}
fun doSmth(i: String) = 4
@@ -0,0 +1,7 @@
BEFORE MODIFICATION:
public final [ResolvedTo(BODY_RESOLVE)] fun x(): R|kotlin/Unit| {
[ResolvedTo(BODY_RESOLVE)] lval a: R|kotlin/Int| = R|/doSmth|(String(str))
}
AFTER MODIFICATION:
public final [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] fun x(): R|kotlin/Unit| { LAZY_BLOCK }
@@ -0,0 +1,5 @@
class A {
fun <caret>x(): Int = doSmth("str")
}
fun doSmth(i: String) = 4
@@ -0,0 +1,7 @@
BEFORE MODIFICATION:
public final [ResolvedTo(BODY_RESOLVE)] fun x(): R|kotlin/Int| {
^x R|/doSmth|(String(str))
}
AFTER MODIFICATION:
public final [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] fun x(): R|kotlin/Int| { LAZY_BLOCK }
@@ -0,0 +1,5 @@
class A {
fun <caret>x() = doSmth("str")
}
fun doSmth(i: String) = 4
@@ -0,0 +1 @@
IN-BLOCK MODIFICATION IS NOT APPLICABLE FOR THIS KtNamedFunction DECLARATION
@@ -0,0 +1,14 @@
import kotlin.contracts.contract
class A {
var x: Int
ge<caret>t() {
contract {
req
}
fun doSmth(i: String) = 4
return doSmth("str")
}
set(value) = Unit
}
@@ -0,0 +1,33 @@
BEFORE MODIFICATION:
public final [ResolvedTo(BODY_RESOLVE)] var x: R|kotlin/Int|
public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=A] get(): R|kotlin/Int|
[Contract description] <
<Unresolved name: contract>#(<L> = [ResolvedTo(RAW_FIR)] contract@fun <anonymous>(): <ERROR TYPE REF: Unresolved name: req> <inline=Unknown> {
^ <Unresolved name: req>#
}
)
>
{
{
contract#(<L> = [ResolvedTo(BODY_RESOLVE)] contract@fun <implicit>.<anonymous>(): <implicit> <inline=Unknown> {
req#
}
)
}
local final [ResolvedTo(BODY_RESOLVE)] fun doSmth([ResolvedTo(BODY_RESOLVE)] i: R|kotlin/String|): R|kotlin/Int| {
^doSmth Int(4)
}
^ R|<local>/doSmth|(String(str))
}
public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=A] set([ResolvedTo(BODY_RESOLVE)] value: R|kotlin/Int|): R|kotlin/Unit| {
^ Q|kotlin/Unit|
}
AFTER MODIFICATION:
public final [ResolvedTo(ARGUMENTS_OF_ANNOTATIONS)] var x: R|kotlin/Int|
public [ResolvedTo(ARGUMENTS_OF_ANNOTATIONS)] [ContainingClassKey=A] get(): R|kotlin/Int| { LAZY_BLOCK }
public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=A] set([ResolvedTo(BODY_RESOLVE)] value: R|kotlin/Int|): R|kotlin/Unit| {
^ Q|kotlin/Unit|
}
@@ -0,0 +1,30 @@
BEFORE MODIFICATION:
public final [ResolvedTo(BODY_RESOLVE)] var x: R|kotlin/Int|
public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=A] get(): R|kotlin/Int|
[R|Contract description]
<
>
{
{
R|kotlin/contracts/contract|(<L> = [ResolvedTo(BODY_RESOLVE)] [MatchingParameterFunctionTypeKey=@ExtensionFunctionType kotlin/Function1<kotlin/contracts/ContractBuilder, kotlin/Unit>] contract@fun R|kotlin/contracts/ContractBuilder|.<anonymous>(): R|kotlin/Unit| <inline=Inline, kind=UNKNOWN> {
<Unresolved name: req>#
}
)
}
local final [ResolvedTo(BODY_RESOLVE)] fun doSmth([ResolvedTo(BODY_RESOLVE)] i: R|kotlin/String|): R|kotlin/Int| {
^doSmth Int(4)
}
^ R|<local>/doSmth|(String(str))
}
public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=A] set([ResolvedTo(BODY_RESOLVE)] value: R|kotlin/Int|): R|kotlin/Unit| {
^ Q|kotlin/Unit|
}
AFTER MODIFICATION:
public final [ResolvedTo(ARGUMENTS_OF_ANNOTATIONS)] var x: R|kotlin/Int|
public [ResolvedTo(ARGUMENTS_OF_ANNOTATIONS)] [ContainingClassKey=A] get(): R|kotlin/Int| { LAZY_BLOCK }
public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=A] set([ResolvedTo(BODY_RESOLVE)] value: R|kotlin/Int|): R|kotlin/Unit| {
^ Q|kotlin/Unit|
}
@@ -0,0 +1,7 @@
class A {
val x: Int
ge<caret>t() {
fun doSmth(i: String) = 4
return doSmth("str")
}
}
@@ -0,0 +1,13 @@
BEFORE MODIFICATION:
public final [ResolvedTo(BODY_RESOLVE)] val x: R|kotlin/Int|
public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=A] get(): R|kotlin/Int| {
local final [ResolvedTo(BODY_RESOLVE)] fun doSmth([ResolvedTo(BODY_RESOLVE)] i: R|kotlin/String|): R|kotlin/Int| {
^doSmth Int(4)
}
^ R|<local>/doSmth|(String(str))
}
AFTER MODIFICATION:
public final [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] val x: R|kotlin/Int|
public [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] [ContainingClassKey=A] get(): R|kotlin/Int| { LAZY_BLOCK }
@@ -0,0 +1,5 @@
class A {
val x: Int ge<caret>t() = doSmth("str")
}
fun doSmth(i: String) = 4
@@ -0,0 +1,9 @@
BEFORE MODIFICATION:
public final [ResolvedTo(BODY_RESOLVE)] val x: R|kotlin/Int|
public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=A] get(): R|kotlin/Int| {
^ R|/doSmth|(String(str))
}
AFTER MODIFICATION:
public final [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] val x: R|kotlin/Int|
public [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] [ContainingClassKey=A] get(): R|kotlin/Int| { LAZY_BLOCK }
@@ -0,0 +1,8 @@
class A {
val x
g<caret>et() {
return doSmth("str")
}
}
fun doSmth(i: String) = 4
@@ -0,0 +1,9 @@
BEFORE MODIFICATION:
public final [ResolvedTo(BODY_RESOLVE)] val x: R|kotlin/Int|
public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=A] get(): R|kotlin/Int| {
^ R|/doSmth|(String(str))
}
AFTER MODIFICATION:
public final [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] val x: R|kotlin/Int|
public [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] [ContainingClassKey=A] get(): R|kotlin/Int| { LAZY_BLOCK }
@@ -0,0 +1,5 @@
class A {
val x ge<caret>t() = doSmth("str")
}
fun doSmth(i: String) = 4
@@ -0,0 +1 @@
IN-BLOCK MODIFICATION IS NOT APPLICABLE FOR THIS KtPropertyAccessor DECLARATION
@@ -0,0 +1,6 @@
class A {
val <caret>x: Int by lazy {
fun doSmth(i: String) = 4
doSmth("str")
}
}
@@ -0,0 +1 @@
IN-BLOCK MODIFICATION IS NOT APPLICABLE FOR THIS KtProperty DECLARATION
@@ -0,0 +1,3 @@
class A {
val <caret>x: Int by ErrorDelegate()
}
@@ -0,0 +1 @@
IN-BLOCK MODIFICATION IS NOT APPLICABLE FOR THIS KtProperty DECLARATION
@@ -0,0 +1,6 @@
class A {
val x<caret>: Int = run {
fun doSmth(i: String) = 4
doSmth("str")
}
}
@@ -0,0 +1 @@
IN-BLOCK MODIFICATION IS NOT APPLICABLE FOR THIS KtProperty DECLARATION
@@ -0,0 +1,6 @@
class A {
val <caret>x by lazy {
fun doSmth(i: String) = 4
doSmth("str")
}
}
@@ -0,0 +1 @@
IN-BLOCK MODIFICATION IS NOT APPLICABLE FOR THIS KtProperty DECLARATION
@@ -0,0 +1,3 @@
class A {
val <caret>x by ErrorDelegate()
}
@@ -0,0 +1 @@
IN-BLOCK MODIFICATION IS NOT APPLICABLE FOR THIS KtProperty DECLARATION
@@ -0,0 +1,5 @@
class A {
val x<caret> = run {
doSmth("str")
}
}
@@ -0,0 +1 @@
IN-BLOCK MODIFICATION IS NOT APPLICABLE FOR THIS KtProperty DECLARATION
@@ -0,0 +1,8 @@
class A {
var x: Int = 1
se<caret>t(value) {
doSmth(value)
}
}
fun doSmth(i: String) = 4
@@ -0,0 +1,11 @@
BEFORE MODIFICATION:
public final [ResolvedTo(BODY_RESOLVE)] var x: R|kotlin/Int| = Int(1)
public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=A] get(): R|kotlin/Int|
public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=A] set([ResolvedTo(BODY_RESOLVE)] value: R|kotlin/Int|): R|kotlin/Unit| {
R|/doSmth<Inapplicable(INAPPLICABLE): /doSmth>#|(R|<local>/value|)
}
AFTER MODIFICATION:
public final [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] var x: R|kotlin/Int| = Int(1)
public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=A] get(): R|kotlin/Int|
public [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] [ContainingClassKey=A] set([ResolvedTo(BODY_RESOLVE)] value: R|kotlin/Int|): R|kotlin/Unit| { LAZY_BLOCK }
@@ -0,0 +1,6 @@
class A {
var x: Int = 1
se<caret>t(value) = doSmth(value)
}
fun doSmth(i: String) = 4
@@ -0,0 +1,11 @@
BEFORE MODIFICATION:
public final [ResolvedTo(BODY_RESOLVE)] var x: R|kotlin/Int| = Int(1)
public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=A] get(): R|kotlin/Int|
public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=A] set([ResolvedTo(BODY_RESOLVE)] value: R|kotlin/Int|): R|kotlin/Unit| {
^ R|/doSmth<Inapplicable(INAPPLICABLE): /doSmth>#|(R|<local>/value|)
}
AFTER MODIFICATION:
public final [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] var x: R|kotlin/Int| = Int(1)
public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=A] get(): R|kotlin/Int|
public [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] [ContainingClassKey=A] set([ResolvedTo(BODY_RESOLVE)] value: R|kotlin/Int|): R|kotlin/Unit| { LAZY_BLOCK }
@@ -0,0 +1,9 @@
class A {
var x
get() = 1
s<caret>et(value) {
doSmth(value)
}
}
fun doSmth(i: String) = 4
@@ -0,0 +1,15 @@
BEFORE MODIFICATION:
public final [ResolvedTo(BODY_RESOLVE)] var x: R|kotlin/Int|
public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=A] get(): R|kotlin/Int| {
^ Int(1)
}
public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=A] set([ResolvedTo(BODY_RESOLVE)] value: R|kotlin/Int|): R|kotlin/Unit| {
R|/doSmth<Inapplicable(INAPPLICABLE): /doSmth>#|(R|<local>/value|)
}
AFTER MODIFICATION:
public final [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] var x: R|kotlin/Int|
public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=A] get(): R|kotlin/Int| {
^ Int(1)
}
public [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] [ContainingClassKey=A] set([ResolvedTo(BODY_RESOLVE)] value: R|kotlin/Int|): R|kotlin/Unit| { LAZY_BLOCK }
@@ -0,0 +1,7 @@
class A {
var x
get() = 1
s<caret>et(value) = doSmth(value)
}
fun doSmth(i: String) = 4
@@ -0,0 +1,15 @@
BEFORE MODIFICATION:
public final [ResolvedTo(BODY_RESOLVE)] var x: R|kotlin/Int|
public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=A] get(): R|kotlin/Int| {
^ Int(1)
}
public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=A] set([ResolvedTo(BODY_RESOLVE)] value: R|kotlin/Int|): R|kotlin/Unit| {
^ R|/doSmth<Inapplicable(INAPPLICABLE): /doSmth>#|(R|<local>/value|)
}
AFTER MODIFICATION:
public final [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] var x: R|kotlin/Int|
public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=A] get(): R|kotlin/Int| {
^ Int(1)
}
public [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] [ContainingClassKey=A] set([ResolvedTo(BODY_RESOLVE)] value: R|kotlin/Int|): R|kotlin/Unit| { LAZY_BLOCK }
@@ -0,0 +1,9 @@
fun fo<caret>o(arg: Any?, num: Int?, block: () -> Unit) contract [
returns() implies (arg is String),
returns() implies (num != null),
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
] {
require(arg is String)
require(num != null)
block()
}
@@ -0,0 +1,15 @@
BEFORE MODIFICATION:
public final [ResolvedTo(BODY_RESOLVE)] fun foo([ResolvedTo(BODY_RESOLVE)] arg: R|kotlin/Any?|, [ResolvedTo(BODY_RESOLVE)] num: R|kotlin/Int?|, [ResolvedTo(BODY_RESOLVE)] block: R|() -> kotlin/Unit|): R|kotlin/Unit|
[Contract description] <
<Unresolved name: returns>#().<Unresolved name: implies>#((R|<local>/arg| is R|kotlin/String|)),
<Unresolved name: returns>#().<Unresolved name: implies>#(!=(R|<local>/num|, Null(null))),
<Unresolved name: callsInPlace>#(R|<local>/block|, <Unresolved name: InvocationKind>#.<Unresolved name: EXACTLY_ONCE>#)
>
{
<Unresolved name: require>#((R|<local>/arg| is R|kotlin/String|))
<Unresolved name: require>#(!=(R|<local>/num|, Null(null)))
R|<local>/block|.R|SubstitutionOverride<kotlin/Function0.invoke: R|kotlin/Unit|>|()
}
AFTER MODIFICATION:
public final [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] fun foo([ResolvedTo(BODY_RESOLVE)] arg: R|kotlin/Any?|, [ResolvedTo(BODY_RESOLVE)] num: R|kotlin/Int?|, [ResolvedTo(BODY_RESOLVE)] block: R|() -> kotlin/Unit|): R|kotlin/Unit| { LAZY_BLOCK }
@@ -0,0 +1,5 @@
fun fo<caret>o(): Int {
return doSmth("str")
}
fun doSmth(i: String) = 4
@@ -0,0 +1,7 @@
BEFORE MODIFICATION:
public final [ResolvedTo(BODY_RESOLVE)] fun foo(): R|kotlin/Int| {
^foo R|/doSmth|(String(str))
}
AFTER MODIFICATION:
public final [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] fun foo(): R|kotlin/Int| { LAZY_BLOCK }
@@ -0,0 +1,3 @@
fun f<caret>oo(): Int = doSmth("str")
fun doSmth(i: String) = 4
@@ -0,0 +1,7 @@
BEFORE MODIFICATION:
public final [ResolvedTo(BODY_RESOLVE)] fun foo(): R|kotlin/Int| {
^foo R|/doSmth|(String(str))
}
AFTER MODIFICATION:
public final [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] fun foo(): R|kotlin/Int| { LAZY_BLOCK }
@@ -0,0 +1,5 @@
fun f<caret>oo() {
doSmth("str")
}
fun doSmth(i: String) = 4
@@ -0,0 +1,7 @@
BEFORE MODIFICATION:
public final [ResolvedTo(BODY_RESOLVE)] fun foo(): R|kotlin/Unit| {
R|/doSmth|(String(str))
}
AFTER MODIFICATION:
public final [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] fun foo(): R|kotlin/Unit| { LAZY_BLOCK }
@@ -0,0 +1,3 @@
fun fo<caret>o() = doSmth("str")
fun doSmth(i: String) = 4
@@ -0,0 +1 @@
IN-BLOCK MODIFICATION IS NOT APPLICABLE FOR THIS KtNamedFunction DECLARATION
@@ -0,0 +1,5 @@
val x: Int
ge<caret>t() {
fun doSmth(i: String) = 4
return doSmth("str")
}
@@ -0,0 +1,13 @@
BEFORE MODIFICATION:
public final [ResolvedTo(BODY_RESOLVE)] val x: R|kotlin/Int|
public [ResolvedTo(BODY_RESOLVE)] get(): R|kotlin/Int| {
local final [ResolvedTo(BODY_RESOLVE)] fun doSmth([ResolvedTo(BODY_RESOLVE)] i: R|kotlin/String|): R|kotlin/Int| {
^doSmth Int(4)
}
^ R|<local>/doSmth|(String(str))
}
AFTER MODIFICATION:
public final [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] val x: R|kotlin/Int|
public [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] get(): R|kotlin/Int| { LAZY_BLOCK }
@@ -0,0 +1,3 @@
val x: Int g<caret>et() = doSmth("str")
fun doSmth(i: String) = 4
@@ -0,0 +1,9 @@
BEFORE MODIFICATION:
public final [ResolvedTo(BODY_RESOLVE)] val x: R|kotlin/Int|
public [ResolvedTo(BODY_RESOLVE)] get(): R|kotlin/Int| {
^ R|/doSmth|(String(str))
}
AFTER MODIFICATION:
public final [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] val x: R|kotlin/Int|
public [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] get(): R|kotlin/Int| { LAZY_BLOCK }
@@ -0,0 +1,6 @@
val x
g<caret>et() {
return doSmth("str")
}
fun doSmth(i: String) = 4
@@ -0,0 +1,9 @@
BEFORE MODIFICATION:
public final [ResolvedTo(BODY_RESOLVE)] val x: R|kotlin/Int|
public [ResolvedTo(BODY_RESOLVE)] get(): R|kotlin/Int| {
^ R|/doSmth|(String(str))
}
AFTER MODIFICATION:
public final [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] val x: R|kotlin/Int|
public [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] get(): R|kotlin/Int| { LAZY_BLOCK }
@@ -0,0 +1,3 @@
val x get<caret>() = doSmth("str")
fun doSmth(i: String) = 4
@@ -0,0 +1 @@
IN-BLOCK MODIFICATION IS NOT APPLICABLE FOR THIS KtPropertyAccessor DECLARATION
@@ -0,0 +1,4 @@
val x<caret>: Int by lazy {
fun doSmth(i: String) = 4
doSmth("str")
}
@@ -0,0 +1,18 @@
BEFORE MODIFICATION:
public final [ResolvedTo(BODY_RESOLVE)] val x: R|kotlin/Int|by <Unresolved name: lazy>#(<L> = [ResolvedTo(RAW_FIR)] lazy@fun <anonymous>(): R|kotlin/Int| <inline=Unknown> {
local final [ResolvedTo(RAW_FIR)] fun doSmth([ResolvedTo(RAW_FIR)] i: R|kotlin/String|): R|kotlin/Int| {
^doSmth Int(4)
}
^ R|<local>/doSmth|(String(str))
}
)
public [ResolvedTo(BODY_RESOLVE)] get(): R|kotlin/Int| {
^ D|/x|.<Unresolved name: getValue>#(Null(null), ::R|/x|)
}
AFTER MODIFICATION:
public final [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] val x: R|kotlin/Int|by LAZY_EXPRESSION
public [ResolvedTo(BODY_RESOLVE)] get(): R|kotlin/Int| {
^ D|/x|.<Unresolved name: getValue>#(Null(null), ::R|/x|)
}
@@ -0,0 +1 @@
val x<caret>: Int by ErrorDelegate()
@@ -0,0 +1,11 @@
BEFORE MODIFICATION:
public final [ResolvedTo(BODY_RESOLVE)] val x: R|kotlin/Int|by <Unresolved name: ErrorDelegate>#()
public [ResolvedTo(BODY_RESOLVE)] get(): R|kotlin/Int| {
^ D|/x|.<Unresolved name: getValue>#(Null(null), ::R|/x|)
}
AFTER MODIFICATION:
public final [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] val x: R|kotlin/Int|by LAZY_EXPRESSION
public [ResolvedTo(BODY_RESOLVE)] get(): R|kotlin/Int| {
^ D|/x|.<Unresolved name: getValue>#(Null(null), ::R|/x|)
}
@@ -0,0 +1,3 @@
val <caret>x: Int = doSmth("str")
fun doSmth(i: String) = 4
@@ -0,0 +1,7 @@
BEFORE MODIFICATION:
public final [ResolvedTo(BODY_RESOLVE)] val x: R|kotlin/Int| = R|/doSmth|(String(str))
public [ResolvedTo(BODY_RESOLVE)] get(): R|kotlin/Int|
AFTER MODIFICATION:
public final [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] val x: R|kotlin/Int| = LAZY_EXPRESSION
public [ResolvedTo(BODY_RESOLVE)] get(): R|kotlin/Int|
@@ -0,0 +1,4 @@
val x<caret> by lazy {
fun doSmth(i: String) = 4
doSmth("str")
}
@@ -0,0 +1 @@
IN-BLOCK MODIFICATION IS NOT APPLICABLE FOR THIS KtProperty DECLARATION
@@ -0,0 +1 @@
val x<caret> by ErrorDelegate()
@@ -0,0 +1 @@
IN-BLOCK MODIFICATION IS NOT APPLICABLE FOR THIS KtProperty DECLARATION
@@ -0,0 +1,3 @@
val x<caret> = doSmth("str")
fun doSmth(i: String) = 4
@@ -0,0 +1 @@
IN-BLOCK MODIFICATION IS NOT APPLICABLE FOR THIS KtProperty DECLARATION
@@ -0,0 +1,6 @@
var x: Int = 1
se<caret>t(value) {
doSmth(value)
}
fun doSmth(i: String): Unit = 4
@@ -0,0 +1,11 @@
BEFORE MODIFICATION:
public final [ResolvedTo(BODY_RESOLVE)] var x: R|kotlin/Int| = Int(1)
public [ResolvedTo(BODY_RESOLVE)] get(): R|kotlin/Int|
public [ResolvedTo(BODY_RESOLVE)] set([ResolvedTo(BODY_RESOLVE)] value: R|kotlin/Int|): R|kotlin/Unit| {
R|/doSmth<Inapplicable(INAPPLICABLE): /doSmth>#|(R|<local>/value|)
}
AFTER MODIFICATION:
public final [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] var x: R|kotlin/Int| = Int(1)
public [ResolvedTo(BODY_RESOLVE)] get(): R|kotlin/Int|
public [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] set([ResolvedTo(BODY_RESOLVE)] value: R|kotlin/Int|): R|kotlin/Unit| { LAZY_BLOCK }
@@ -0,0 +1,4 @@
var x: Int = 1
se<caret>t(value) = doSmth(value)
fun doSmth(i: String): Unit = 4
@@ -0,0 +1,11 @@
BEFORE MODIFICATION:
public final [ResolvedTo(BODY_RESOLVE)] var x: R|kotlin/Int| = Int(1)
public [ResolvedTo(BODY_RESOLVE)] get(): R|kotlin/Int|
public [ResolvedTo(BODY_RESOLVE)] set([ResolvedTo(BODY_RESOLVE)] value: R|kotlin/Int|): R|kotlin/Unit| {
^ R|/doSmth<Inapplicable(INAPPLICABLE): /doSmth>#|(R|<local>/value|)
}
AFTER MODIFICATION:
public final [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] var x: R|kotlin/Int| = Int(1)
public [ResolvedTo(BODY_RESOLVE)] get(): R|kotlin/Int|
public [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] set([ResolvedTo(BODY_RESOLVE)] value: R|kotlin/Int|): R|kotlin/Unit| { LAZY_BLOCK }
@@ -0,0 +1,7 @@
val x
get() = 1
se<caret>t(value) {
doSmth(value)
}
fun doSmth(i: String) = 4
@@ -0,0 +1,11 @@
BEFORE MODIFICATION:
public final [ResolvedTo(BODY_RESOLVE)] val x: R|kotlin/Int|
public [ResolvedTo(BODY_RESOLVE)] get(): R|kotlin/Int| {
^ Int(1)
}
AFTER MODIFICATION:
public final [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] val x: R|kotlin/Int|
public [ResolvedTo(BODY_RESOLVE)] get(): R|kotlin/Int| {
^ Int(1)
}
@@ -0,0 +1,5 @@
val x
get() = 1
se<caret>t(value) = doSmth(value)
fun doSmth(i: String) = 4
@@ -0,0 +1,11 @@
BEFORE MODIFICATION:
public final [ResolvedTo(BODY_RESOLVE)] val x: R|kotlin/Int|
public [ResolvedTo(BODY_RESOLVE)] get(): R|kotlin/Int| {
^ Int(1)
}
AFTER MODIFICATION:
public final [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] val x: R|kotlin/Int|
public [ResolvedTo(BODY_RESOLVE)] get(): R|kotlin/Int| {
^ Int(1)
}