From 3e9e66493f47ab64769d27eab60ebfc65996ca27 Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Wed, 20 Sep 2023 13:55:19 +0200 Subject: [PATCH] [LL FIR] LLFirContractsLazyResolver: avoid transformation for functions with implicit type Legacy (current) contracts can exist only on functions with bodies. This change also should improve memory consumption because we will less frequently calculate bodies. ^KT-55750 --- .../LLFirContractsLazyResolver.kt | 9 ++++++- .../annotationFromImplicitJavaType.txt | 4 +--- ...FromImplicitJavaTypeWithJavaAnnotation.txt | 4 +--- .../lazyResolve/functionWithParameter.txt | 4 +--- .../functionWithParameterScript.txt | 5 ++-- .../functions/functionParameter.txt | 4 +--- .../functions/functionParameterScript.txt | 5 ++-- .../testData/lazyResolve/localConstructor.txt | 23 +----------------- .../lazyResolve/localConstructorScript.txt | 24 ++----------------- 9 files changed, 19 insertions(+), 63 deletions(-) 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 } } +