diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirImplicitTypesLazyResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirImplicitTypesLazyResolver.kt index 6e2d03aa469..722dde93381 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirImplicitTypesLazyResolver.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirImplicitTypesLazyResolver.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirImplicitAwa import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirResolveContextCollector import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.ImplicitBodyResolveComputationSession import org.jetbrains.kotlin.fir.scopes.callableCopySubstitutionForTypeUpdater +import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef internal object LLFirImplicitTypesLazyResolver : LLFirLazyResolver(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) { override fun resolve( @@ -68,14 +69,30 @@ internal class LLFirImplicitBodyTargetResolver( override fun doLazyResolveUnderLock(target: FirElementWithResolveState) { when (target) { - is FirFunction -> resolve(target, BodyStateKeepers.FUNCTION) - is FirProperty -> resolve(target, BodyStateKeepers.PROPERTY) - is FirVariable -> resolve(target, BodyStateKeepers.VARIABLE) + is FirFunction -> { + if (target.returnTypeRef is FirImplicitTypeRef) { + resolve(target, BodyStateKeepers.FUNCTION) + } + } + + is FirProperty -> { + if (target.returnTypeRef is FirImplicitTypeRef || target.backingField?.returnTypeRef is FirImplicitTypeRef) { + resolve(target, BodyStateKeepers.PROPERTY) + } + } + + is FirField -> { + if (target.returnTypeRef is FirImplicitTypeRef) { + resolve(target, BodyStateKeepers.FIELD) + } + } + is FirScript -> { if (target.statements.any { it.isScriptDependentDeclaration }) { resolve(target, BodyStateKeepers.SCRIPT) } } + is FirRegularClass, is FirTypeAlias, is FirFile, @@ -83,6 +100,8 @@ internal class LLFirImplicitBodyTargetResolver( is FirAnonymousInitializer, is FirDanglingModifierList, is FirFileAnnotationsContainer, + is FirEnumEntry, + is FirErrorProperty, -> { // No implicit bodies here } diff --git a/analysis/low-level-api-fir/testData/inBlockModification/contract.out_of_src_roots.txt b/analysis/low-level-api-fir/testData/inBlockModification/contract.out_of_src_roots.txt index d0549a4eff8..a8405f0cf64 100644 --- a/analysis/low-level-api-fir/testData/inBlockModification/contract.out_of_src_roots.txt +++ b/analysis/low-level-api-fir/testData/inBlockModification/contract.out_of_src_roots.txt @@ -1,15 +1,15 @@ BEFORE MODIFICATION: public final inline [ResolvedTo(BODY_RESOLVE)] fun foo([ResolvedTo(BODY_RESOLVE)] block: R|() -> kotlin/Unit|): R|kotlin/Unit| [Contract description] < - Q|kotlin|.#.#( = [ResolvedTo(RAW_FIR)] contract@fun (): { + Q|kotlin|.#.#( = [ResolvedTo(BODY_RESOLVE)] contract@fun (): { ^ #(R|/block|, #.#) } ) > { { - kotlin#.contracts#.contract#( = [ResolvedTo(BODY_RESOLVE)] contract@fun .(): { - callsInPlace#(block#, InvocationKind#.EXACTLY_ONCE#) + Q|kotlin|.#.#( = [ResolvedTo(BODY_RESOLVE)] contract@fun (): { + ^ #(R|/block|, #.#) } ) } diff --git a/analysis/low-level-api-fir/testData/inBlockModification/memberFunWithBodyWithContract.out_of_src_roots.txt b/analysis/low-level-api-fir/testData/inBlockModification/memberFunWithBodyWithContract.out_of_src_roots.txt index 0e45a3a00a4..3949d0b8af2 100644 --- a/analysis/low-level-api-fir/testData/inBlockModification/memberFunWithBodyWithContract.out_of_src_roots.txt +++ b/analysis/low-level-api-fir/testData/inBlockModification/memberFunWithBodyWithContract.out_of_src_roots.txt @@ -1,15 +1,15 @@ BEFORE MODIFICATION: public final [ResolvedTo(BODY_RESOLVE)] fun x(): R|kotlin/Unit| [Contract description] < - #( = [ResolvedTo(RAW_FIR)] contract@fun (): { + #( = [ResolvedTo(BODY_RESOLVE)] contract@fun (): { ^ # } ) > { { - contract#( = [ResolvedTo(BODY_RESOLVE)] contract@fun .(): { - req# + #( = [ResolvedTo(BODY_RESOLVE)] contract@fun (): { + ^ # } ) } diff --git a/analysis/low-level-api-fir/testData/inBlockModification/memberFunWithBodyWithErrorContract.out_of_src_roots.txt b/analysis/low-level-api-fir/testData/inBlockModification/memberFunWithBodyWithErrorContract.out_of_src_roots.txt index 7bb12061ddd..c49cac7fc88 100644 --- a/analysis/low-level-api-fir/testData/inBlockModification/memberFunWithBodyWithErrorContract.out_of_src_roots.txt +++ b/analysis/low-level-api-fir/testData/inBlockModification/memberFunWithBodyWithErrorContract.out_of_src_roots.txt @@ -5,7 +5,7 @@ public final [ResolvedTo(BODY_RESOLVE)] fun passLambdaValue([ResolvedTo(BODY_RES > { { - contract#(l#) + #(R|/l|) } Int(42) diff --git a/analysis/low-level-api-fir/testData/inBlockModification/memberFunWithBodyWithFakeContract.txt b/analysis/low-level-api-fir/testData/inBlockModification/memberFunWithBodyWithFakeContract.txt index 0e45a3a00a4..3949d0b8af2 100644 --- a/analysis/low-level-api-fir/testData/inBlockModification/memberFunWithBodyWithFakeContract.txt +++ b/analysis/low-level-api-fir/testData/inBlockModification/memberFunWithBodyWithFakeContract.txt @@ -1,15 +1,15 @@ BEFORE MODIFICATION: public final [ResolvedTo(BODY_RESOLVE)] fun x(): R|kotlin/Unit| [Contract description] < - #( = [ResolvedTo(RAW_FIR)] contract@fun (): { + #( = [ResolvedTo(BODY_RESOLVE)] contract@fun (): { ^ # } ) > { { - contract#( = [ResolvedTo(BODY_RESOLVE)] contract@fun .(): { - req# + #( = [ResolvedTo(BODY_RESOLVE)] contract@fun (): { + ^ # } ) } diff --git a/analysis/low-level-api-fir/testData/inBlockModification/memberFunWithBodyWithFakeContractScript.txt b/analysis/low-level-api-fir/testData/inBlockModification/memberFunWithBodyWithFakeContractScript.txt index 0e45a3a00a4..3949d0b8af2 100644 --- a/analysis/low-level-api-fir/testData/inBlockModification/memberFunWithBodyWithFakeContractScript.txt +++ b/analysis/low-level-api-fir/testData/inBlockModification/memberFunWithBodyWithFakeContractScript.txt @@ -1,15 +1,15 @@ BEFORE MODIFICATION: public final [ResolvedTo(BODY_RESOLVE)] fun x(): R|kotlin/Unit| [Contract description] < - #( = [ResolvedTo(RAW_FIR)] contract@fun (): { + #( = [ResolvedTo(BODY_RESOLVE)] contract@fun (): { ^ # } ) > { { - contract#( = [ResolvedTo(BODY_RESOLVE)] contract@fun .(): { - req# + #( = [ResolvedTo(BODY_RESOLVE)] contract@fun (): { + ^ # } ) } diff --git a/analysis/low-level-api-fir/testData/inBlockModification/memberGetterWithBodyWithContract.out_of_src_roots.txt b/analysis/low-level-api-fir/testData/inBlockModification/memberGetterWithBodyWithContract.out_of_src_roots.txt index 88473ec439f..949bcd5fc8a 100644 --- a/analysis/low-level-api-fir/testData/inBlockModification/memberGetterWithBodyWithContract.out_of_src_roots.txt +++ b/analysis/low-level-api-fir/testData/inBlockModification/memberGetterWithBodyWithContract.out_of_src_roots.txt @@ -2,15 +2,15 @@ BEFORE MODIFICATION: public final [ResolvedTo(BODY_RESOLVE)] var x: R|kotlin/Int| public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=A] get(): R|kotlin/Int| [Contract description] < - #( = [ResolvedTo(RAW_FIR)] contract@fun (): { + #( = [ResolvedTo(BODY_RESOLVE)] contract@fun (): { ^ # } ) > { { - contract#( = [ResolvedTo(BODY_RESOLVE)] contract@fun .(): { - req# + #( = [ResolvedTo(BODY_RESOLVE)] contract@fun (): { + ^ # } ) } diff --git a/analysis/low-level-api-fir/testData/inBlockModification/memberGetterWithBodyWithContractWithoutName.out_of_src_roots.txt b/analysis/low-level-api-fir/testData/inBlockModification/memberGetterWithBodyWithContractWithoutName.out_of_src_roots.txt index 6246d2acb3e..5bd8575a30f 100644 --- a/analysis/low-level-api-fir/testData/inBlockModification/memberGetterWithBodyWithContractWithoutName.out_of_src_roots.txt +++ b/analysis/low-level-api-fir/testData/inBlockModification/memberGetterWithBodyWithContractWithoutName.out_of_src_roots.txt @@ -2,15 +2,15 @@ BEFORE MODIFICATION: public final [ResolvedTo(BODY_RESOLVE)] var : R|kotlin/Int| public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=A] get(): R|kotlin/Int| [Contract description] < - #( = [ResolvedTo(RAW_FIR)] contract@fun (): { + #( = [ResolvedTo(BODY_RESOLVE)] contract@fun (): { ^ # } ) > { { - contract#( = [ResolvedTo(BODY_RESOLVE)] contract@fun .(): { - req# + #( = [ResolvedTo(BODY_RESOLVE)] contract@fun (): { + ^ # } ) } diff --git a/analysis/low-level-api-fir/testData/lazyResolve/delegatedField.txt b/analysis/low-level-api-fir/testData/lazyResolve/delegatedField.txt index 3d37ec71e32..e5663695b29 100644 --- a/analysis/low-level-api-fir/testData/lazyResolve/delegatedField.txt +++ b/analysis/low-level-api-fir/testData/lazyResolve/delegatedField.txt @@ -245,7 +245,7 @@ FILE: [ResolvedTo(IMPORTS)] delegatedField.kt LAZY_super<> } - private final [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] field $$delegate_0: R|one/Foo| = prop# + private final [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] field $$delegate_0: R|one/Foo| = LAZY_EXPRESSION public final [ResolvedTo(STATUS)] fun baz([ResolvedTo(STATUS)] s: R|kotlin/String|): R|kotlin/Unit| { LAZY_BLOCK } @@ -268,7 +268,7 @@ FILE: [ResolvedTo(IMPORTS)] delegatedField.kt LAZY_super<> } - private final [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] field $$delegate_0: R|one/Foo| = prop# + private final [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] field $$delegate_0: R|one/Foo| = LAZY_EXPRESSION public final [ResolvedTo(STATUS)] fun baz([ResolvedTo(STATUS)] s: R|kotlin/String|): R|kotlin/Unit| { LAZY_BLOCK } diff --git a/analysis/low-level-api-fir/testData/lazyResolve/delegatedFieldScript.txt b/analysis/low-level-api-fir/testData/lazyResolve/delegatedFieldScript.txt index 7ee70346532..d3273c0c561 100644 --- a/analysis/low-level-api-fir/testData/lazyResolve/delegatedFieldScript.txt +++ b/analysis/low-level-api-fir/testData/lazyResolve/delegatedFieldScript.txt @@ -321,7 +321,7 @@ FILE: [ResolvedTo(IMPORTS)] delegatedFieldScript.kts LAZY_super<> } - private final [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] field $$delegate_0: R|one/Foo| = prop# + private final [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] field $$delegate_0: R|one/Foo| = LAZY_EXPRESSION public final [ResolvedTo(STATUS)] fun baz([ResolvedTo(STATUS)] s: R|kotlin/String|): R|kotlin/Unit| { LAZY_BLOCK } @@ -351,7 +351,7 @@ FILE: [ResolvedTo(IMPORTS)] delegatedFieldScript.kts LAZY_super<> } - private final [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] field $$delegate_0: R|one/Foo| = prop# + private final [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] field $$delegate_0: R|one/Foo| = LAZY_EXPRESSION public final [ResolvedTo(STATUS)] fun baz([ResolvedTo(STATUS)] s: R|kotlin/String|): R|kotlin/Unit| { LAZY_BLOCK } diff --git a/analysis/low-level-api-fir/testData/lazyResolve/enumEntry.txt b/analysis/low-level-api-fir/testData/lazyResolve/enumEntry.txt index 564b2bb4f42..1103a22c186 100644 --- a/analysis/low-level-api-fir/testData/lazyResolve/enumEntry.txt +++ b/analysis/low-level-api-fir/testData/lazyResolve/enumEntry.txt @@ -261,13 +261,7 @@ FILE: [ResolvedTo(IMPORTS)] enumEntry.kt LAZY_super|> } - @R|Anno|[Types]() public final static [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] [ContainingClassKey=Foo] enum entry ResolveMe: R|Foo| = object : R|Foo| { - private [ResolvedTo(RAW_FIR)] [ContainingClassKey=] constructor(): R|| { - super() - } - - } - + @R|Anno|[Types]() public final static [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] [ContainingClassKey=Foo] enum entry ResolveMe: R|Foo| = LAZY_EXPRESSION public final static [ResolvedTo(STATUS)] [ContainingClassKey=Foo] fun values(): R|kotlin/Array| { } @@ -292,13 +286,7 @@ FILE: [ResolvedTo(IMPORTS)] enumEntry.kt LAZY_super|> } - @R|Anno|[Types]() public final static [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] [ContainingClassKey=Foo] enum entry ResolveMe: R|Foo| = object : R|Foo| { - private [ResolvedTo(RAW_FIR)] [ContainingClassKey=] constructor(): R|| { - super() - } - - } - + @R|Anno|[Types]() public final static [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] [ContainingClassKey=Foo] enum entry ResolveMe: R|Foo| = LAZY_EXPRESSION public final static [ResolvedTo(STATUS)] [ContainingClassKey=Foo] fun values(): R|kotlin/Array| { } diff --git a/analysis/low-level-api-fir/testData/lazyResolve/enumEntryScript.txt b/analysis/low-level-api-fir/testData/lazyResolve/enumEntryScript.txt index a40640da25d..cedc4707e61 100644 --- a/analysis/low-level-api-fir/testData/lazyResolve/enumEntryScript.txt +++ b/analysis/low-level-api-fir/testData/lazyResolve/enumEntryScript.txt @@ -326,13 +326,7 @@ FILE: [ResolvedTo(IMPORTS)] enumEntryScript.kts LAZY_super|> } - @R|Anno|[Types]() public final static [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] [ContainingClassKey=Foo] enum entry ResolveMe: R|Foo| = object : R|Foo| { - private [ResolvedTo(RAW_FIR)] [ContainingClassKey=] constructor(): R|| { - super() - } - - } - + @R|Anno|[Types]() public final static [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] [ContainingClassKey=Foo] enum entry ResolveMe: R|Foo| = LAZY_EXPRESSION public final static [ResolvedTo(STATUS)] [ContainingClassKey=Foo] fun values(): R|kotlin/Array| { } @@ -363,13 +357,7 @@ FILE: [ResolvedTo(IMPORTS)] enumEntryScript.kts LAZY_super|> } - @R|Anno|[Types]() public final static [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] [ContainingClassKey=Foo] enum entry ResolveMe: R|Foo| = object : R|Foo| { - private [ResolvedTo(RAW_FIR)] [ContainingClassKey=] constructor(): R|| { - super() - } - - } - + @R|Anno|[Types]() public final static [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] [ContainingClassKey=Foo] enum entry ResolveMe: R|Foo| = LAZY_EXPRESSION public final static [ResolvedTo(STATUS)] [ContainingClassKey=Foo] fun values(): R|kotlin/Array| { } diff --git a/analysis/low-level-api-fir/testData/lazyResolve/functions/contract.out_of_src_roots.txt b/analysis/low-level-api-fir/testData/lazyResolve/functions/contract.out_of_src_roots.txt index c588cb33673..c980c323181 100644 --- a/analysis/low-level-api-fir/testData/lazyResolve/functions/contract.out_of_src_roots.txt +++ b/analysis/low-level-api-fir/testData/lazyResolve/functions/contract.out_of_src_roots.txt @@ -46,41 +46,21 @@ FILE: [ResolvedTo(IMPORTS)] contract.kt IMPLICIT_TYPES_BODY_RESOLVE: FILE: [ResolvedTo(IMPORTS)] contract.kt - public final inline [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] fun foo([ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] block: R|() -> kotlin/Unit|): R|kotlin/Unit| - [Contract description] < - kotlin#.contracts#.contract#( = [ResolvedTo(RAW_FIR)] contract@fun .(): { - callsInPlace#(block#, InvocationKind#.EXACTLY_ONCE#) - } - ) - > - { - { - kotlin#.contracts#.contract#( = [ResolvedTo(RAW_FIR)] contract@fun .(): { - callsInPlace#(block#, InvocationKind#.EXACTLY_ONCE#) - } - ) + public final inline [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] fun foo([ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] block: R|() -> kotlin/Unit|): R|kotlin/Unit| { + Q|kotlin|.#.#( = [ResolvedTo(RAW_FIR)] contract@fun (): { + ^ #(R|/block|, #.#) } - + ) block#() } ANNOTATIONS_ARGUMENTS_MAPPING: FILE: [ResolvedTo(IMPORTS)] contract.kt - public final inline [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] fun foo([ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] block: R|() -> kotlin/Unit|): R|kotlin/Unit| - [Contract description] < - kotlin#.contracts#.contract#( = [ResolvedTo(RAW_FIR)] contract@fun .(): { - callsInPlace#(block#, InvocationKind#.EXACTLY_ONCE#) - } - ) - > - { - { - kotlin#.contracts#.contract#( = [ResolvedTo(RAW_FIR)] contract@fun .(): { - callsInPlace#(block#, InvocationKind#.EXACTLY_ONCE#) - } - ) + public final inline [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] fun foo([ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] block: R|() -> kotlin/Unit|): R|kotlin/Unit| { + Q|kotlin|.#.#( = [ResolvedTo(RAW_FIR)] contract@fun (): { + ^ #(R|/block|, #.#) } - + ) block#() } @@ -88,15 +68,15 @@ BODY_RESOLVE: FILE: [ResolvedTo(IMPORTS)] contract.kt public final inline [ResolvedTo(BODY_RESOLVE)] fun foo([ResolvedTo(BODY_RESOLVE)] block: R|() -> kotlin/Unit|): R|kotlin/Unit| [Contract description] < - Q|kotlin|.#.#( = [ResolvedTo(RAW_FIR)] contract@fun (): { + Q|kotlin|.#.#( = [ResolvedTo(BODY_RESOLVE)] contract@fun (): { ^ #(R|/block|, #.#) } ) > { { - kotlin#.contracts#.contract#( = [ResolvedTo(BODY_RESOLVE)] contract@fun .(): { - callsInPlace#(block#, InvocationKind#.EXACTLY_ONCE#) + Q|kotlin|.#.#( = [ResolvedTo(BODY_RESOLVE)] contract@fun (): { + ^ #(R|/block|, #.#) } ) } @@ -108,15 +88,15 @@ FILE RAW TO BODY: FILE: [ResolvedTo(BODY_RESOLVE)] contract.kt public final inline [ResolvedTo(BODY_RESOLVE)] fun foo([ResolvedTo(BODY_RESOLVE)] block: R|() -> kotlin/Unit|): R|kotlin/Unit| [Contract description] < - Q|kotlin|.#.#( = [ResolvedTo(RAW_FIR)] contract@fun (): { + Q|kotlin|.#.#( = [ResolvedTo(BODY_RESOLVE)] contract@fun (): { ^ #(R|/block|, #.#) } ) > { { - kotlin#.contracts#.contract#( = [ResolvedTo(BODY_RESOLVE)] contract@fun .(): { - callsInPlace#(block#, InvocationKind#.EXACTLY_ONCE#) + Q|kotlin|.#.#( = [ResolvedTo(BODY_RESOLVE)] contract@fun (): { + ^ #(R|/block|, #.#) } ) }