Skip to content

Commit f9c1856

Browse files
committed
Fix header compilation for function / class declarations nested inside inline functions.
^KT-78422
1 parent b198c08 commit f9c1856

File tree

8 files changed

+28
-9
lines changed

8 files changed

+28
-9
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ FILE: classDeclaration.kt
2222
public final fun funD(): R|kotlin/Int|
2323

2424
public final inline fun funE(): R|kotlin/String| {
25-
local final fun funF(): R|kotlin/String|
25+
local final fun funF(): R|kotlin/String| {
26+
^funF String(funF body)
27+
}
2628

2729
^funE R|<local>/funF|()
2830
}

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ FILE: enumClassDeclaration.kt
2424
super<R|B|>()
2525
}
2626

27-
public open override fun getString(): R|kotlin/String|
27+
public open override fun getString(): R|kotlin/String| {
28+
^getString String(north)
29+
}
2830

2931
}
3032

@@ -33,7 +35,9 @@ FILE: enumClassDeclaration.kt
3335
super<R|B|>()
3436
}
3537

36-
public open override fun getString(): R|kotlin/String|
38+
public open override fun getString(): R|kotlin/String| {
39+
^getString String(south)
40+
}
3741

3842
}
3943

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ FILE: functionDeclaration.kt
1212
private final fun funC(): R|kotlin/String|
1313
public final fun funD(): R|kotlin/Int|
1414
public final inline fun funE(): R|kotlin/String| {
15-
local final fun funF(): R|kotlin/String|
15+
local final fun funF(): R|kotlin/String| {
16+
^funF String(funF body)
17+
}
1618

1719
^funE R|<local>/funF|()
1820
}
@@ -22,7 +24,9 @@ FILE: functionDeclaration.kt
2224
super<R|kotlin/Any|>()
2325
}
2426

25-
public final fun funH(): R|kotlin/String|
27+
public final fun funH(): R|kotlin/String| {
28+
^funH String(funH body)
29+
}
2630

2731
}
2832

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ FILE: objectDeclaration.kt
2222
public final fun funD(): R|kotlin/Int|
2323

2424
public final inline fun funE(): R|kotlin/String| {
25-
local final fun funF(): R|kotlin/String|
25+
local final fun funF(): R|kotlin/String| {
26+
^funF String(funF body)
27+
}
2628

2729
^funE R|<local>/funF|()
2830
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2058,7 +2058,8 @@ class LightTreeRawFirDeclarationBuilder(
20582058
}
20592059

20602060
val allowLegacyContractDescription = outerContractDescription == null
2061-
val bodyWithContractDescription = withForcedLocalContext {
2061+
val forceKeepingTheBodyInHeaderMode = context.forceKeepingTheBodyInHeaderMode || functionBuilder.status.isInline
2062+
val bodyWithContractDescription = withForcedLocalContext(forceKeepingTheBodyInHeaderMode) {
20622063
convertFunctionBody(block, expression, allowLegacyContractDescription)
20632064
}
20642065
this.body = bodyWithContractDescription.first

compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilder.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,9 @@ abstract class AbstractRawFirBuilder<T : Any>(val baseSession: FirSession, val c
126126
}
127127
}
128128

129-
inline fun <R> withForcedLocalContext(block: () -> R): R {
129+
inline fun <R> withForcedLocalContext(forceKeepingTheBodyInHeaderMode: Boolean = false, block: () -> R): R {
130+
val oldForceKeepingTheBodyInHeaderMode = context.forceKeepingTheBodyInHeaderMode
131+
context.forceKeepingTheBodyInHeaderMode = oldForceKeepingTheBodyInHeaderMode || forceKeepingTheBodyInHeaderMode
130132
val oldForcedLocalContext = context.inLocalContext
131133
context.inLocalContext = true
132134
val oldClassNameBeforeLocalContext = context.classNameBeforeLocalContext
@@ -141,6 +143,7 @@ abstract class AbstractRawFirBuilder<T : Any>(val baseSession: FirSession, val c
141143
context.classNameBeforeLocalContext = oldClassNameBeforeLocalContext
142144
context.inLocalContext = oldForcedLocalContext
143145
context.className = oldClassName
146+
context.forceKeepingTheBodyInHeaderMode = oldForceKeepingTheBodyInHeaderMode
144147
}
145148
}
146149

compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/Context.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ class Context<T> {
5959
val dispatchReceiverTypesStack: MutableList<ConeClassLikeType> = mutableListOf()
6060
var containerIsExpect: Boolean = false
6161

62+
var forceKeepingTheBodyInHeaderMode: Boolean = false
63+
6264
var containingScriptSymbol: FirScriptSymbol? = null
6365
var containingReplSymbol: FirReplSnippetSymbol? = null
6466

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.fir.declarations.utils.hasExplicitBackingField
2424
import org.jetbrains.kotlin.fir.declarations.utils.isConst
2525
import org.jetbrains.kotlin.fir.declarations.utils.isInline
2626
import org.jetbrains.kotlin.fir.declarations.utils.isLocal
27+
import org.jetbrains.kotlin.fir.declarations.utils.isNonLocal
2728
import org.jetbrains.kotlin.fir.declarations.utils.isScriptTopLevelDeclaration
2829
import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic
2930
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
@@ -1039,7 +1040,7 @@ open class FirDeclarationsResolveTransformer(
10391040
}
10401041
result.transformReturnTypeRef(transformer, ResolutionMode.UpdateImplicitTypeRef(returnTypeRef))
10411042
}
1042-
if (session.languageVersionSettings.getFlag(AnalysisFlags.headerMode) && !function.isInline) {
1043+
if (session.languageVersionSettings.getFlag(AnalysisFlags.headerMode) && !function.isInline && function.isNonLocal) {
10431044
// Header mode: once the return type for non-inline function is known, the body can be removed.
10441045
result.replaceBody(null)
10451046
}

0 commit comments

Comments
 (0)