[LL FIR] KT-55327 Use body resolve return type calculator for locals

- LL FIR uses `ReturnTypeCalculatorWithJump` by default because it
  cannot guarantee that the implicit types of non-local functions
  referenced in a function `f` have been resolved during body resolve
  of `f`.
- However, if `ReturnTypeCalculatorWithJump` encountered a local
  function, it tried to resolve its return type even during body
  resolve of that same local function. The fix delegates to
  `ReturnTypeCalculatorForFullBodyResolve`, which should be used for
  local declarations.

^KT-55327 fixed
^KT-55324 fixed
This commit is contained in:
Marco Pennekamp
2022-12-08 20:17:44 +01:00
parent 28759a3ac3
commit 2cdcdce6ed
11 changed files with 10 additions and 12 deletions
@@ -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 {
@@ -1,4 +1,3 @@
// FIR_IDE_IGNORE
// See KT-6271
fun foo() {
fun fact(n: Int) = {
@@ -1,4 +1,3 @@
// FIR_IDE_IGNORE
// See KT-6271
fun foo() {
fun fact(n: Int) = {
@@ -1,4 +1,3 @@
// FIR_IDE_IGNORE
fun foo() {
fun bar() = (fun() = bar())
}
@@ -1,4 +1,3 @@
// FIR_IDE_IGNORE
fun foo() {
fun bar() = (fun() = <!TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM_ERROR!><!DEBUG_INFO_MISSING_UNRESOLVED!>bar<!>()<!>)
}
@@ -1,4 +1,3 @@
// FIR_IDE_IGNORE
fun foo() {
fun bar() = {
bar()
@@ -1,4 +1,3 @@
// FIR_IDE_IGNORE
fun foo() {
fun bar() = {
<!TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM_ERROR!><!DEBUG_INFO_MISSING_UNRESOLVED!>bar<!>()<!>
@@ -1,4 +1,3 @@
// FIR_IDE_IGNORE
fun foo() {
fun bar1() = bar1()
@@ -1,4 +1,3 @@
// FIR_IDE_IGNORE
fun foo() {
fun bar1() = <!TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM_ERROR!><!DEBUG_INFO_MISSING_UNRESOLVED!>bar1<!>()<!>
@@ -1,4 +1,3 @@
// FIR_IDE_IGNORE
// !DIAGNOSTICS: -UNUSED_PARAMETER
fun main(args: Array<String>) {
fun f() = run {
@@ -1,4 +1,3 @@
// FIR_IDE_IGNORE
// !DIAGNOSTICS: -UNUSED_PARAMETER
fun main(args: Array<String>) {
fun f() = run {