[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:
+10
-2
@@ -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
@@ -1,4 +1,3 @@
|
||||
// FIR_IDE_IGNORE
|
||||
// See KT-6271
|
||||
fun foo() {
|
||||
fun fact(n: Int) = {
|
||||
|
||||
-1
@@ -1,4 +1,3 @@
|
||||
// FIR_IDE_IGNORE
|
||||
// See KT-6271
|
||||
fun foo() {
|
||||
fun fact(n: Int) = {
|
||||
|
||||
-1
@@ -1,4 +1,3 @@
|
||||
// FIR_IDE_IGNORE
|
||||
fun foo() {
|
||||
fun bar() = (fun() = bar())
|
||||
}
|
||||
|
||||
-1
@@ -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
@@ -1,4 +1,3 @@
|
||||
// FIR_IDE_IGNORE
|
||||
fun foo() {
|
||||
fun bar() = {
|
||||
bar()
|
||||
|
||||
-1
@@ -1,4 +1,3 @@
|
||||
// FIR_IDE_IGNORE
|
||||
fun foo() {
|
||||
fun bar() = {
|
||||
<!TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM_ERROR!><!DEBUG_INFO_MISSING_UNRESOLVED!>bar<!>()<!>
|
||||
|
||||
-1
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user