Skip to content

Commit f02fb2d

Browse files
committed
Handle functions & methods with implicit return types.
^KT-78422
1 parent 6032444 commit f02fb2d

File tree

9 files changed

+22
-2
lines changed

9 files changed

+22
-2
lines changed

compiler/fir/analysis-tests/testData/resolve/headerMode/classDeclaration.fir.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ FILE: classDeclaration.kt
1919

2020
private final fun funC(): R|kotlin/String|
2121

22+
public final fun funD(): R|kotlin/Int|
23+
2224
}
2325
public abstract interface B : R|kotlin/Any| {
2426
public open fun funA(): R|kotlin/String|

compiler/fir/analysis-tests/testData/resolve/headerMode/classDeclaration.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ class A {
2323
private fun funC(): String {
2424
return "A.funC body"
2525
}
26+
27+
fun funD() = 1 + 2
2628
}
2729

2830
interface B {

compiler/fir/analysis-tests/testData/resolve/headerMode/functionDeclaration.fir.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,4 @@ FILE: functionDeclaration.kt
1010
>
1111

1212
private final fun funC(): R|kotlin/String|
13+
public final fun funD(): R|kotlin/Int|

compiler/fir/analysis-tests/testData/resolve/headerMode/functionDeclaration.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,7 @@ private fun funC(): String {
2323
return "funC body"
2424
}
2525

26+
fun funD() = 1 + 2
27+
2628
/* GENERATED_FIR_TAGS: classReference, contractConditionalEffect, contracts, functionDeclaration, inline, nullableType,
2729
stringLiteral */

compiler/fir/analysis-tests/testData/resolve/headerMode/objectDeclaration.fir.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,6 @@ FILE: objectDeclaration.kt
1919

2020
private final fun funC(): R|kotlin/String|
2121

22+
public final fun funD(): R|kotlin/Int|
23+
2224
}

compiler/fir/analysis-tests/testData/resolve/headerMode/objectDeclaration.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ object A {
2323
private fun funC(): String {
2424
return "A.funC body"
2525
}
26+
27+
fun funD() = 1 + 2
2628
}
2729

2830
/* GENERATED_FIR_TAGS: classReference, contractConditionalEffect, contracts, functionDeclaration, inline, nullableType,

compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirDeclarationBuilder.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2087,7 +2087,12 @@ class LightTreeRawFirDeclarationBuilder(
20872087

20882088
val allowLegacyContractDescription = outerContractDescription == null
20892089
val bodyWithContractDescription = withForcedLocalContext {
2090-
convertFunctionBody(block, expression, allowLegacyContractDescription, headerMode)
2090+
convertFunctionBody(
2091+
block,
2092+
expression,
2093+
allowLegacyContractDescription,
2094+
headerMode && (returnTypeRef !is FirImplicitTypeRef)
2095+
)
20912096
}
20922097
this.body = bodyWithContractDescription.first
20932098
val contractDescription = outerContractDescription ?: bodyWithContractDescription.second

compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolveTransformer.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.fir.resolve.toSymbol
1919
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.LocalClassesNavigationInfo
2020
import org.jetbrains.kotlin.fir.symbols.impl.*
2121
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
22+
import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef
2223
import org.jetbrains.kotlin.fir.types.FirTypeRef
2324
import org.jetbrains.kotlin.fir.types.coneType
2425
import org.jetbrains.kotlin.fir.utils.exceptions.withFirEntry
@@ -428,7 +429,7 @@ abstract class AbstractFirStatusResolveTransformer(
428429
overriddenFunctions.map { it.status as FirResolvedDeclarationStatus },
429430
)
430431
// Once the modality is determined, we can remove the body.
431-
if (simpleFunction.isHeader == true) simpleFunction.replaceBody(null)
432+
if (simpleFunction.isHeader == true && simpleFunction.returnTypeRef !is FirImplicitTypeRef) simpleFunction.replaceBody(null)
432433

433434
simpleFunction.transformStatus(this, resolvedStatus)
434435
transformDeclaration(simpleFunction, data) as FirStatement

compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyBackingField
2121
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
2222
import org.jetbrains.kotlin.fir.declarations.utils.hasExplicitBackingField
2323
import org.jetbrains.kotlin.fir.declarations.utils.isConst
24+
import org.jetbrains.kotlin.fir.declarations.utils.isHeader
2425
import org.jetbrains.kotlin.fir.declarations.utils.isInline
2526
import org.jetbrains.kotlin.fir.declarations.utils.isLocal
2627
import org.jetbrains.kotlin.fir.declarations.utils.isScriptTopLevelDeclaration
@@ -1038,6 +1039,8 @@ open class FirDeclarationsResolveTransformer(
10381039
}
10391040
result.transformReturnTypeRef(transformer, ResolutionMode.UpdateImplicitTypeRef(returnTypeRef))
10401041
}
1042+
// Once the return type is resolved, the body can be removed.
1043+
if (result.isHeader == true) result.replaceBody(null)
10411044

10421045
return result
10431046
}

0 commit comments

Comments
 (0)