[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
This commit is contained in:
committed by
Space Team
parent
3c865bdddd
commit
3e9e66493f
+8
-1
@@ -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,
|
||||
|
||||
+1
-3
@@ -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|): <implicit> {
|
||||
^resolveMe i#.id#
|
||||
}
|
||||
public final [ResolvedTo(CONTRACTS)] fun resolveMe([ResolvedTo(CONTRACTS)] i: R|JavaInterface|): <implicit> { LAZY_BLOCK }
|
||||
|
||||
IMPLICIT_TYPES_BODY_RESOLVE:
|
||||
FILE: [ResolvedTo(IMPORTS)] main.kt
|
||||
|
||||
analysis/low-level-api-fir/testData/lazyResolve/annotationFromImplicitJavaTypeWithJavaAnnotation.txt
Vendored
+1
-3
@@ -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|): <implicit> {
|
||||
^resolveMe i#.id#
|
||||
}
|
||||
public final [ResolvedTo(CONTRACTS)] fun resolveMe([ResolvedTo(CONTRACTS)] i: R|JavaInterface|): <implicit> { LAZY_BLOCK }
|
||||
|
||||
IMPLICIT_TYPES_BODY_RESOLVE:
|
||||
FILE: [ResolvedTo(IMPORTS)] main.kt
|
||||
|
||||
@@ -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|): <implicit> {
|
||||
^resolveMe Unit#
|
||||
}
|
||||
public final [ResolvedTo(CONTRACTS)] fun resolveMe([ResolvedTo(CONTRACTS)] param: R|I|): <implicit> { LAZY_BLOCK }
|
||||
|
||||
IMPLICIT_TYPES_BODY_RESOLVE:
|
||||
FILE: [ResolvedTo(IMPORTS)] functionWithParameter.kt
|
||||
|
||||
+2
-3
@@ -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|): <implicit> {
|
||||
^resolveMe Unit#
|
||||
}
|
||||
public final [ResolvedTo(CONTRACTS)] fun resolveMe([ResolvedTo(CONTRACTS)] param: R|I|): <implicit> { 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|
|
||||
}
|
||||
|
||||
|
||||
+1
-3
@@ -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|): <implicit> {
|
||||
^foo String(boo)
|
||||
}
|
||||
public final [ResolvedTo(CONTRACTS)] fun foo([ResolvedTo(CONTRACTS)] param: R|kotlin/Int|): <implicit> { LAZY_BLOCK }
|
||||
|
||||
IMPLICIT_TYPES_BODY_RESOLVE:
|
||||
FILE: [ResolvedTo(IMPORTS)] functionParameter.kt
|
||||
|
||||
+2
-3
@@ -85,9 +85,7 @@ FILE: [ResolvedTo(IMPORTS)] functionParameterScript.kts
|
||||
SCRIPT: [ResolvedTo(TYPES)] <script-functionParameterScript.kts>
|
||||
[ResolvedTo(RAW_FIR)] lval args: R|kotlin/Array<kotlin/String>|
|
||||
|
||||
public final [ResolvedTo(CONTRACTS)] fun foo([ResolvedTo(CONTRACTS)] param: R|kotlin/Int|): <implicit> {
|
||||
^foo String(boo)
|
||||
}
|
||||
public final [ResolvedTo(CONTRACTS)] fun foo([ResolvedTo(CONTRACTS)] param: R|kotlin/Int|): <implicit> { 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)
|
||||
}
|
||||
|
||||
|
||||
@@ -114,28 +114,7 @@ FILE: [ResolvedTo(IMPORTS)] localConstructor.kt
|
||||
LAZY_super<R|kotlin/Any|>
|
||||
}
|
||||
|
||||
public final [ResolvedTo(CONTRACTS)] fun <[ResolvedTo(CONTRACTS)] E, [ResolvedTo(CONTRACTS)] F> foo(): <implicit> {
|
||||
^foo [ResolvedTo(RAW_FIR)] fun <implicit>.<anonymous>(): <implicit> <inline=Unknown> {
|
||||
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|<local>/C<G, E, F>| {
|
||||
super<R|kotlin/Any|>()
|
||||
}
|
||||
|
||||
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#<F>()
|
||||
}
|
||||
|
||||
}
|
||||
public final [ResolvedTo(CONTRACTS)] fun <[ResolvedTo(CONTRACTS)] E, [ResolvedTo(CONTRACTS)] F> foo(): <implicit> { LAZY_BLOCK }
|
||||
|
||||
}
|
||||
|
||||
|
||||
+2
-22
@@ -173,28 +173,7 @@ FILE: [ResolvedTo(IMPORTS)] localConstructorScript.kts
|
||||
LAZY_super<R|kotlin/Any|>
|
||||
}
|
||||
|
||||
public final [ResolvedTo(CONTRACTS)] fun <[ResolvedTo(CONTRACTS)] E, [ResolvedTo(CONTRACTS)] F> foo(): <implicit> {
|
||||
^foo [ResolvedTo(RAW_FIR)] fun <implicit>.<anonymous>(): <implicit> <inline=Unknown> {
|
||||
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|<local>/C<G, E, F>| {
|
||||
super<R|kotlin/Any|>()
|
||||
}
|
||||
|
||||
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#<F>()
|
||||
}
|
||||
|
||||
}
|
||||
public final [ResolvedTo(CONTRACTS)] fun <[ResolvedTo(CONTRACTS)] E, [ResolvedTo(CONTRACTS)] F> foo(): <implicit> { LAZY_BLOCK }
|
||||
|
||||
}
|
||||
|
||||
@@ -361,3 +340,4 @@ FILE: [ResolvedTo(BODY_RESOLVE)] localConstructorScript.kts
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user