Skip to content

Commit 5e7de6b

Browse files
committed
Fix header compilation for function / class declarations nested inside inline functions.
^KT-78422
1 parent 9a20050 commit 5e7de6b

File tree

8 files changed

+27
-9
lines changed

8 files changed

+27
-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
@@ -2063,7 +2063,8 @@ class LightTreeRawFirDeclarationBuilder(
20632063
}
20642064

20652065
val allowLegacyContractDescription = outerContractDescription == null
2066-
val bodyWithContractDescription = withForcedLocalContext {
2066+
val forceKeepingTheBodyInHeaderMode = context.forceKeepingTheBodyInHeaderMode || functionBuilder.status.isInline
2067+
val bodyWithContractDescription = withForcedLocalContext(forceKeepingTheBodyInHeaderMode) {
20672068
convertFunctionBody(block, expression, allowLegacyContractDescription)
20682069
}
20692070
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: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1039,7 +1039,7 @@ open class FirDeclarationsResolveTransformer(
10391039
}
10401040
result.transformReturnTypeRef(transformer, ResolutionMode.UpdateImplicitTypeRef(returnTypeRef))
10411041
}
1042-
if (session.languageVersionSettings.getFlag(AnalysisFlags.headerMode) && !function.isInline) {
1042+
if (session.languageVersionSettings.getFlag(AnalysisFlags.headerMode) && !function.isInline && !function.isLocal) {
10431043
// Header mode: once the return type for non-inline function is known, the body can be removed.
10441044
result.replaceBody(null)
10451045
}

0 commit comments

Comments
 (0)