Skip to content

Commit 8134ffb

Browse files
committed
Handle bodies of interfaces with default method body.
^KT-78422
1 parent 3cc60ca commit 8134ffb

File tree

4 files changed

+11
-2
lines changed

4 files changed

+11
-2
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ FILE: classDeclaration.kt
2121

2222
}
2323
public abstract interface B : R|kotlin/Any| {
24-
public abstract fun funA(): R|kotlin/String|
24+
public open fun funA(): R|kotlin/String|
2525

2626
public abstract fun funB(): R|kotlin/String|
2727

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes
5757
import org.jetbrains.kotlin.util.getChildren
5858
import org.jetbrains.kotlin.utils.addToStdlib.runIf
5959
import org.jetbrains.kotlin.utils.addToStdlib.shouldNotBeCalled
60+
import org.jetbrains.kotlin.fir.declarations.utils.*
6061

6162
class LightTreeRawFirDeclarationBuilder(
6263
session: FirSession,
@@ -701,6 +702,7 @@ class LightTreeRawFirDeclarationBuilder(
701702
}
702703
}
703704
}.also {
705+
it.isHeader = generateHeaders
704706
if (classNode.getParent()?.elementType == KtStubElementTypes.CLASS_BODY) {
705707
it.initContainingClassForLocalAttr()
706708
}
@@ -2099,6 +2101,7 @@ class LightTreeRawFirDeclarationBuilder(
20992101
}
21002102
context.firFunctionTargets.removeLast()
21012103
}.build().also {
2104+
it.isHeader = headerMode
21022105
target.bind(it)
21032106
fillDanglingConstraintsTo(firTypeParameters, typeConstraints, it)
21042107
}
@@ -2138,7 +2141,8 @@ class LightTreeRawFirDeclarationBuilder(
21382141
processLegacyContractDescription(block, diagnostic)
21392142
}
21402143
if (generateHeaders) {
2141-
null to contractDescription // We want to preserve the contract info when processing as headers.
2144+
// Return an empty body, which will be removed after the status resolution.
2145+
buildEmptyExpressionBlock() to contractDescription // We want to preserve the contract info when processing as headers.
21422146
} else {
21432147
block to contractDescription
21442148
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.descriptors.Visibilities
99
import org.jetbrains.kotlin.fir.*
1010
import org.jetbrains.kotlin.fir.declarations.*
1111
import org.jetbrains.kotlin.fir.declarations.utils.componentFunctionSymbol
12+
import org.jetbrains.kotlin.fir.declarations.utils.isHeader
1213
import org.jetbrains.kotlin.fir.declarations.utils.isInlineOrValue
1314
import org.jetbrains.kotlin.fir.declarations.utils.visibility
1415
import org.jetbrains.kotlin.fir.expressions.FirBlock
@@ -426,6 +427,8 @@ abstract class AbstractFirStatusResolveTransformer(
426427
isLocal = false,
427428
overriddenFunctions.map { it.status as FirResolvedDeclarationStatus },
428429
)
430+
// Once the modality is determined, we can remove the body.
431+
if (simpleFunction.isHeader == true) simpleFunction.replaceBody(null)
429432

430433
simpleFunction.transformStatus(this, resolvedStatus)
431434
transformDeclaration(simpleFunction, data) as FirStatement

compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/utils/declarationAttributes.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ private object IsDeserializedPropertyFromAnnotation : FirDeclarationDataKey()
4141
private object IsDelegatedProperty : FirDeclarationDataKey()
4242
private object LambdaArgumentHoldsInTruths : FirDeclarationDataKey()
4343
private object FileNameForPluginGeneratedCallable : FirDeclarationDataKey()
44+
private object IsHeader: FirDeclarationDataKey()
4445

4546
var FirProperty.isFromVararg: Boolean? by FirDeclarationDataRegistry.data(IsFromVarargKey)
4647
var FirProperty.isReferredViaField: Boolean? by FirDeclarationDataRegistry.data(IsReferredViaField)
@@ -52,6 +53,7 @@ var FirDeclaration.compilerPluginMetadata: Map<String, ByteArray>? by FirDeclara
5253
var FirDeclaration.originalReplSnippetSymbol: FirReplSnippetSymbol? by FirDeclarationDataRegistry.data(OriginalReplSnippet)
5354
var FirAnonymousFunction.lambdaArgumentParent: FirQualifiedAccessExpression? by FirDeclarationDataRegistry.data(LambdaArgumentHoldsInTruths)
5455
var FirCallableDeclaration.fileNameForPluginGeneratedCallable: String? by FirDeclarationDataRegistry.data(FileNameForPluginGeneratedCallable)
56+
var FirDeclaration.isHeader: Boolean? by FirDeclarationDataRegistry.data(IsHeader)
5557

5658
var FirDeclaration.isScriptTopLevelDeclaration: Boolean? by FirDeclarationDataRegistry.data(ScriptTopLevelDeclaration)
5759

0 commit comments

Comments
 (0)