diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirContractsLazyResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirContractsLazyResolver.kt index d7e57a5e4a6..b00b7bdbb98 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirContractsLazyResolver.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirContractsLazyResolver.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirResolveContextCollector import org.jetbrains.kotlin.fir.resolve.transformers.contracts.FirContractResolveTransformer +import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef internal object LLFirContractsLazyResolver : LLFirLazyResolver(FirResolvePhase.CONTRACTS) { override fun resolve( @@ -54,7 +55,13 @@ private class LLFirContractsTargetResolver( override fun doLazyResolveUnderLock(target: FirElementWithResolveState) { when (target) { - is FirSimpleFunction -> resolve(target, ContractStateKeepers.SIMPLE_FUNCTION) + is FirSimpleFunction -> { + // There is no sense to try to transform functions without a block body and without a raw contract + if (target.returnTypeRef !is FirImplicitTypeRef || target.contractDescription is FirRawContractDescription) { + resolve(target, ContractStateKeepers.SIMPLE_FUNCTION) + } + } + is FirConstructor -> resolve(target, ContractStateKeepers.CONSTRUCTOR) is FirProperty -> resolve(target, ContractStateKeepers.PROPERTY) is FirRegularClass, diff --git a/analysis/low-level-api-fir/testData/lazyResolve/annotationFromImplicitJavaType.txt b/analysis/low-level-api-fir/testData/lazyResolve/annotationFromImplicitJavaType.txt index ab922d06b66..0a20c63b266 100644 --- a/analysis/low-level-api-fir/testData/lazyResolve/annotationFromImplicitJavaType.txt +++ b/analysis/low-level-api-fir/testData/lazyResolve/annotationFromImplicitJavaType.txt @@ -36,9 +36,7 @@ FILE: [ResolvedTo(IMPORTS)] main.kt CONTRACTS: FILE: [ResolvedTo(IMPORTS)] main.kt - public final [ResolvedTo(CONTRACTS)] fun resolveMe([ResolvedTo(CONTRACTS)] i: R|JavaInterface|): { - ^resolveMe i#.id# - } + public final [ResolvedTo(CONTRACTS)] fun resolveMe([ResolvedTo(CONTRACTS)] i: R|JavaInterface|): { LAZY_BLOCK } IMPLICIT_TYPES_BODY_RESOLVE: FILE: [ResolvedTo(IMPORTS)] main.kt diff --git a/analysis/low-level-api-fir/testData/lazyResolve/annotationFromImplicitJavaTypeWithJavaAnnotation.txt b/analysis/low-level-api-fir/testData/lazyResolve/annotationFromImplicitJavaTypeWithJavaAnnotation.txt index 6830bc14694..34eb7e67f5a 100644 --- a/analysis/low-level-api-fir/testData/lazyResolve/annotationFromImplicitJavaTypeWithJavaAnnotation.txt +++ b/analysis/low-level-api-fir/testData/lazyResolve/annotationFromImplicitJavaTypeWithJavaAnnotation.txt @@ -36,9 +36,7 @@ FILE: [ResolvedTo(IMPORTS)] main.kt CONTRACTS: FILE: [ResolvedTo(IMPORTS)] main.kt - public final [ResolvedTo(CONTRACTS)] fun resolveMe([ResolvedTo(CONTRACTS)] i: R|JavaInterface|): { - ^resolveMe i#.id# - } + public final [ResolvedTo(CONTRACTS)] fun resolveMe([ResolvedTo(CONTRACTS)] i: R|JavaInterface|): { LAZY_BLOCK } IMPLICIT_TYPES_BODY_RESOLVE: FILE: [ResolvedTo(IMPORTS)] main.kt diff --git a/analysis/low-level-api-fir/testData/lazyResolve/functionWithParameter.txt b/analysis/low-level-api-fir/testData/lazyResolve/functionWithParameter.txt index 6c8681c529d..ac9a16f7674 100644 --- a/analysis/low-level-api-fir/testData/lazyResolve/functionWithParameter.txt +++ b/analysis/low-level-api-fir/testData/lazyResolve/functionWithParameter.txt @@ -56,9 +56,7 @@ CONTRACTS: FILE: [ResolvedTo(IMPORTS)] functionWithParameter.kt public? final? [ResolvedTo(RAW_FIR)] interface I : R|kotlin/Any| { } - public final [ResolvedTo(CONTRACTS)] fun resolveMe([ResolvedTo(CONTRACTS)] param: R|I|): { - ^resolveMe Unit# - } + public final [ResolvedTo(CONTRACTS)] fun resolveMe([ResolvedTo(CONTRACTS)] param: R|I|): { LAZY_BLOCK } IMPLICIT_TYPES_BODY_RESOLVE: FILE: [ResolvedTo(IMPORTS)] functionWithParameter.kt diff --git a/analysis/low-level-api-fir/testData/lazyResolve/functionWithParameterScript.txt b/analysis/low-level-api-fir/testData/lazyResolve/functionWithParameterScript.txt index cef1ad6cc59..ea575bbed41 100644 --- a/analysis/low-level-api-fir/testData/lazyResolve/functionWithParameterScript.txt +++ b/analysis/low-level-api-fir/testData/lazyResolve/functionWithParameterScript.txt @@ -115,9 +115,7 @@ FILE: [ResolvedTo(IMPORTS)] functionWithParameterScript.kts public? final? [ResolvedTo(RAW_FIR)] interface I : R|kotlin/Any| { } - public final [ResolvedTo(CONTRACTS)] fun resolveMe([ResolvedTo(CONTRACTS)] param: R|I|): { - ^resolveMe Unit# - } + public final [ResolvedTo(CONTRACTS)] fun resolveMe([ResolvedTo(CONTRACTS)] param: R|I|): { LAZY_BLOCK } IMPLICIT_TYPES_BODY_RESOLVE: @@ -174,3 +172,4 @@ FILE: [ResolvedTo(BODY_RESOLVE)] functionWithParameterScript.kts public final [ResolvedTo(BODY_RESOLVE)] fun resolveMe([ResolvedTo(BODY_RESOLVE)] param: R|I|): R|kotlin/Unit| { ^resolveMe Q|kotlin/Unit| } + diff --git a/analysis/low-level-api-fir/testData/lazyResolve/functions/functionParameter.txt b/analysis/low-level-api-fir/testData/lazyResolve/functions/functionParameter.txt index 40e43bbc005..7e4b2fb7e6e 100644 --- a/analysis/low-level-api-fir/testData/lazyResolve/functions/functionParameter.txt +++ b/analysis/low-level-api-fir/testData/lazyResolve/functions/functionParameter.txt @@ -36,9 +36,7 @@ FILE: [ResolvedTo(IMPORTS)] functionParameter.kt CONTRACTS: FILE: [ResolvedTo(IMPORTS)] functionParameter.kt - public final [ResolvedTo(CONTRACTS)] fun foo([ResolvedTo(CONTRACTS)] param: R|kotlin/Int|): { - ^foo String(boo) - } + public final [ResolvedTo(CONTRACTS)] fun foo([ResolvedTo(CONTRACTS)] param: R|kotlin/Int|): { LAZY_BLOCK } IMPLICIT_TYPES_BODY_RESOLVE: FILE: [ResolvedTo(IMPORTS)] functionParameter.kt diff --git a/analysis/low-level-api-fir/testData/lazyResolve/functions/functionParameterScript.txt b/analysis/low-level-api-fir/testData/lazyResolve/functions/functionParameterScript.txt index b94d96b31ae..2073fbd27e9 100644 --- a/analysis/low-level-api-fir/testData/lazyResolve/functions/functionParameterScript.txt +++ b/analysis/low-level-api-fir/testData/lazyResolve/functions/functionParameterScript.txt @@ -85,9 +85,7 @@ FILE: [ResolvedTo(IMPORTS)] functionParameterScript.kts SCRIPT: [ResolvedTo(TYPES)] [ResolvedTo(RAW_FIR)] lval args: R|kotlin/Array| - public final [ResolvedTo(CONTRACTS)] fun foo([ResolvedTo(CONTRACTS)] param: R|kotlin/Int|): { - ^foo String(boo) - } + public final [ResolvedTo(CONTRACTS)] fun foo([ResolvedTo(CONTRACTS)] param: R|kotlin/Int|): { LAZY_BLOCK } IMPLICIT_TYPES_BODY_RESOLVE: @@ -132,3 +130,4 @@ FILE: [ResolvedTo(BODY_RESOLVE)] functionParameterScript.kts public final [ResolvedTo(BODY_RESOLVE)] fun foo([ResolvedTo(BODY_RESOLVE)] param: R|kotlin/Int|): R|kotlin/String| { ^foo String(boo) } + diff --git a/analysis/low-level-api-fir/testData/lazyResolve/localConstructor.txt b/analysis/low-level-api-fir/testData/lazyResolve/localConstructor.txt index c11f17b4ada..56f90300af9 100644 --- a/analysis/low-level-api-fir/testData/lazyResolve/localConstructor.txt +++ b/analysis/low-level-api-fir/testData/lazyResolve/localConstructor.txt @@ -114,28 +114,7 @@ FILE: [ResolvedTo(IMPORTS)] localConstructor.kt LAZY_super } - public final [ResolvedTo(CONTRACTS)] fun <[ResolvedTo(CONTRACTS)] E, [ResolvedTo(CONTRACTS)] F> foo(): { - ^foo [ResolvedTo(RAW_FIR)] fun .(): { - local final? [ResolvedTo(RAW_FIR)] class C<[ResolvedTo(RAW_FIR)] G, [ResolvedTo(CONTRACTS)] Outer(E), [ResolvedTo(CONTRACTS)] Outer(F)> : R|kotlin/Any| { - public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=C] constructor<[ResolvedTo(RAW_FIR)] G>(): R|/C| { - super() - } - - public? final? [ResolvedTo(RAW_FIR)] val e: E = magic#() - public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=C] get(): E - - public? final? [ResolvedTo(RAW_FIR)] val f: F = magic#() - public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=C] get(): F - - public? final? [ResolvedTo(RAW_FIR)] val g: G = magic#() - public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=C] get(): G - - } - - C#() - } - - } + public final [ResolvedTo(CONTRACTS)] fun <[ResolvedTo(CONTRACTS)] E, [ResolvedTo(CONTRACTS)] F> foo(): { LAZY_BLOCK } } diff --git a/analysis/low-level-api-fir/testData/lazyResolve/localConstructorScript.txt b/analysis/low-level-api-fir/testData/lazyResolve/localConstructorScript.txt index ceedf351d85..a129a08b96b 100644 --- a/analysis/low-level-api-fir/testData/lazyResolve/localConstructorScript.txt +++ b/analysis/low-level-api-fir/testData/lazyResolve/localConstructorScript.txt @@ -173,28 +173,7 @@ FILE: [ResolvedTo(IMPORTS)] localConstructorScript.kts LAZY_super } - public final [ResolvedTo(CONTRACTS)] fun <[ResolvedTo(CONTRACTS)] E, [ResolvedTo(CONTRACTS)] F> foo(): { - ^foo [ResolvedTo(RAW_FIR)] fun .(): { - local final? [ResolvedTo(RAW_FIR)] class C<[ResolvedTo(RAW_FIR)] G, [ResolvedTo(CONTRACTS)] Outer(E), [ResolvedTo(CONTRACTS)] Outer(F)> : R|kotlin/Any| { - public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=C] constructor<[ResolvedTo(RAW_FIR)] G>(): R|/C| { - super() - } - - public? final? [ResolvedTo(RAW_FIR)] val e: E = magic#() - public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=C] get(): E - - public? final? [ResolvedTo(RAW_FIR)] val f: F = magic#() - public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=C] get(): F - - public? final? [ResolvedTo(RAW_FIR)] val g: G = magic#() - public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=C] get(): G - - } - - C#() - } - - } + public final [ResolvedTo(CONTRACTS)] fun <[ResolvedTo(CONTRACTS)] E, [ResolvedTo(CONTRACTS)] F> foo(): { LAZY_BLOCK } } @@ -361,3 +340,4 @@ FILE: [ResolvedTo(BODY_RESOLVE)] localConstructorScript.kts } } +