diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt index 77ee05d0d0a..a0cc06237f9 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt @@ -5,11 +5,13 @@ package org.jetbrains.kotlin.fir.resolve.transformers.body.resolve +import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty import org.jetbrains.kotlin.fir.declarations.utils.hasExplicitBackingField import org.jetbrains.kotlin.fir.declarations.utils.isLocal +import org.jetbrains.kotlin.fir.declarations.utils.visibility import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind import org.jetbrains.kotlin.fir.resolve.FirRegularTowerDataContexts @@ -19,13 +21,14 @@ import org.jetbrains.kotlin.fir.resolve.providers.firProvider import org.jetbrains.kotlin.fir.resolve.transformers.AdapterForResolveProcessor import org.jetbrains.kotlin.fir.resolve.transformers.FirTransformerBasedResolveProcessor import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculator +import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculatorForFullBodyResolve import org.jetbrains.kotlin.fir.resolve.transformers.contracts.runContractResolveForLocalClass import org.jetbrains.kotlin.fir.scopes.FakeOverrideTypeCalculator import org.jetbrains.kotlin.fir.scopes.fakeOverrideSubstitution import org.jetbrains.kotlin.fir.scopes.impl.delegatedWrapperData -import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase -import org.jetbrains.kotlin.fir.symbols.impl.FirSyntheticPropertySymbol import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirSyntheticPropertySymbol +import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef @@ -217,6 +220,11 @@ private class ReturnTypeCalculatorWithJump( var outerTowerDataContexts: FirRegularTowerDataContexts? = null override fun tryCalculateReturnTypeOrNull(declaration: FirCallableDeclaration): FirResolvedTypeRef { + // Local declarations must be handled by `ReturnTypeCalculatorForFullBodyResolve` to avoid resolution cycles in LL FIR. + if (declaration.visibility == Visibilities.Local) { + return ReturnTypeCalculatorForFullBodyResolve.tryCalculateReturnType(declaration) + } + if (declaration is FirValueParameter && declaration.returnTypeRef is FirImplicitTypeRef) { declaration.replaceReturnTypeRef( buildErrorTypeRef { diff --git a/compiler/testData/diagnostics/tests/inference/recursiveLocalFuns/localFactorial.fir.kt b/compiler/testData/diagnostics/tests/inference/recursiveLocalFuns/localFactorial.fir.kt index 8f1200ca411..fc52c00306a 100644 --- a/compiler/testData/diagnostics/tests/inference/recursiveLocalFuns/localFactorial.fir.kt +++ b/compiler/testData/diagnostics/tests/inference/recursiveLocalFuns/localFactorial.fir.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // See KT-6271 fun foo() { fun fact(n: Int) = { diff --git a/compiler/testData/diagnostics/tests/inference/recursiveLocalFuns/localFactorial.kt b/compiler/testData/diagnostics/tests/inference/recursiveLocalFuns/localFactorial.kt index 81e181f99a1..dd9dc91bb1d 100644 --- a/compiler/testData/diagnostics/tests/inference/recursiveLocalFuns/localFactorial.kt +++ b/compiler/testData/diagnostics/tests/inference/recursiveLocalFuns/localFactorial.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // See KT-6271 fun foo() { fun fact(n: Int) = { diff --git a/compiler/testData/diagnostics/tests/inference/recursiveLocalFuns/recursiveFun.fir.kt b/compiler/testData/diagnostics/tests/inference/recursiveLocalFuns/recursiveFun.fir.kt index 831c654f61d..a4b6e0861eb 100644 --- a/compiler/testData/diagnostics/tests/inference/recursiveLocalFuns/recursiveFun.fir.kt +++ b/compiler/testData/diagnostics/tests/inference/recursiveLocalFuns/recursiveFun.fir.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE fun foo() { fun bar() = (fun() = bar()) } diff --git a/compiler/testData/diagnostics/tests/inference/recursiveLocalFuns/recursiveFun.kt b/compiler/testData/diagnostics/tests/inference/recursiveLocalFuns/recursiveFun.kt index 9a099374232..06c65c151ed 100644 --- a/compiler/testData/diagnostics/tests/inference/recursiveLocalFuns/recursiveFun.kt +++ b/compiler/testData/diagnostics/tests/inference/recursiveLocalFuns/recursiveFun.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE fun foo() { fun bar() = (fun() = bar()) } diff --git a/compiler/testData/diagnostics/tests/inference/recursiveLocalFuns/recursiveLambda.fir.kt b/compiler/testData/diagnostics/tests/inference/recursiveLocalFuns/recursiveLambda.fir.kt index 3f2ccb269a3..962d4b4eadb 100644 --- a/compiler/testData/diagnostics/tests/inference/recursiveLocalFuns/recursiveLambda.fir.kt +++ b/compiler/testData/diagnostics/tests/inference/recursiveLocalFuns/recursiveLambda.fir.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE fun foo() { fun bar() = { bar() diff --git a/compiler/testData/diagnostics/tests/inference/recursiveLocalFuns/recursiveLambda.kt b/compiler/testData/diagnostics/tests/inference/recursiveLocalFuns/recursiveLambda.kt index 56099b7c8e4..f387bb43b60 100644 --- a/compiler/testData/diagnostics/tests/inference/recursiveLocalFuns/recursiveLambda.kt +++ b/compiler/testData/diagnostics/tests/inference/recursiveLocalFuns/recursiveLambda.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE fun foo() { fun bar() = { bar() diff --git a/compiler/testData/diagnostics/tests/inference/recursiveLocalFuns/selfCall.fir.kt b/compiler/testData/diagnostics/tests/inference/recursiveLocalFuns/selfCall.fir.kt index e34d8a69e51..0e7c9cdcffb 100644 --- a/compiler/testData/diagnostics/tests/inference/recursiveLocalFuns/selfCall.fir.kt +++ b/compiler/testData/diagnostics/tests/inference/recursiveLocalFuns/selfCall.fir.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE fun foo() { fun bar1() = bar1() diff --git a/compiler/testData/diagnostics/tests/inference/recursiveLocalFuns/selfCall.kt b/compiler/testData/diagnostics/tests/inference/recursiveLocalFuns/selfCall.kt index 0d401d069b6..c8555c8a729 100644 --- a/compiler/testData/diagnostics/tests/inference/recursiveLocalFuns/selfCall.kt +++ b/compiler/testData/diagnostics/tests/inference/recursiveLocalFuns/selfCall.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE fun foo() { fun bar1() = bar1() diff --git a/compiler/testData/diagnostics/tests/regressions/kt9384.fir.kt b/compiler/testData/diagnostics/tests/regressions/kt9384.fir.kt index bb10628dd87..239a81e2aad 100644 --- a/compiler/testData/diagnostics/tests/regressions/kt9384.fir.kt +++ b/compiler/testData/diagnostics/tests/regressions/kt9384.fir.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // !DIAGNOSTICS: -UNUSED_PARAMETER fun main(args: Array) { fun f() = run { diff --git a/compiler/testData/diagnostics/tests/regressions/kt9384.kt b/compiler/testData/diagnostics/tests/regressions/kt9384.kt index 2806a764dae..2457bb32cb6 100644 --- a/compiler/testData/diagnostics/tests/regressions/kt9384.kt +++ b/compiler/testData/diagnostics/tests/regressions/kt9384.kt @@ -1,4 +1,3 @@ -// FIR_IDE_IGNORE // !DIAGNOSTICS: -UNUSED_PARAMETER fun main(args: Array) { fun f() = run {