diff --git a/compiler/fir/analysis-tests/testData/resolve/headerMode/constructorDeclaration.fir.txt b/compiler/fir/analysis-tests/testData/resolve/headerMode/constructorDeclaration.fir.txt index 2af9dd0e03743..b583fd65c80db 100644 --- a/compiler/fir/analysis-tests/testData/resolve/headerMode/constructorDeclaration.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/headerMode/constructorDeclaration.fir.txt @@ -4,10 +4,10 @@ FILE: constructorDeclaration.kt super() } - public final val a: R|kotlin/String| = R|/a| + public final val a: R|kotlin/String| public get(): R|kotlin/String| - public final val b: R|kotlin/Int| = R|/b| + public final val b: R|kotlin/Int| public get(): R|kotlin/Int| public constructor(e: R|kotlin/String|): R|A| { @@ -24,10 +24,10 @@ FILE: constructorDeclaration.kt super() } - public final val a: R|kotlin/String| = R|/a| + public final val a: R|kotlin/String| public get(): R|kotlin/String| - public final val b: R|kotlin/Int| = R|/b| + public final val b: R|kotlin/Int| public get(): R|kotlin/Int| public constructor(e: R|kotlin/String|): R|B| { diff --git a/compiler/fir/analysis-tests/testData/resolve/headerMode/dataClassDeclaration.fir.txt b/compiler/fir/analysis-tests/testData/resolve/headerMode/dataClassDeclaration.fir.txt index 5610c90334714..ac4aa6703ce52 100644 --- a/compiler/fir/analysis-tests/testData/resolve/headerMode/dataClassDeclaration.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/headerMode/dataClassDeclaration.fir.txt @@ -4,10 +4,10 @@ FILE: dataClassDeclaration.kt super() } - public final val name: R|kotlin/String| = R|/name| + public final val name: R|kotlin/String| public get(): R|kotlin/String| - public final val age: R|kotlin/Int| = R|/age| + public final val age: R|kotlin/Int| public get(): R|kotlin/Int| public final operator fun component1(): R|kotlin/String| diff --git a/compiler/fir/analysis-tests/testData/resolve/headerMode/propertyDeclaration.fir.txt b/compiler/fir/analysis-tests/testData/resolve/headerMode/propertyDeclaration.fir.txt index f751e1dd735f4..28d33119debd9 100644 --- a/compiler/fir/analysis-tests/testData/resolve/headerMode/propertyDeclaration.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/headerMode/propertyDeclaration.fir.txt @@ -1,8 +1,44 @@ FILE: propertyDeclaration.kt - public final val a: R|kotlin/String| = String(A) + public final val a: R|kotlin/String| public get(): R|kotlin/String| - public final val b: R|kotlin/String| = String(B) + public final val b: R|kotlin/String| public get(): R|kotlin/String| public final fun foo(): R|kotlin/String| public final val c: R|kotlin/String| public get(): R|kotlin/String| + public final val d: R|kotlin/Boolean| + public get(): R|kotlin/Boolean| + public final val e: R|kotlin/String| + public get(): R|kotlin/String| + public final var f: R|kotlin/Int| + public get(): R|kotlin/Int| + public set(value: R|kotlin/Int|): R|kotlin/Unit| + public final val g: R|kotlin/Int| + public get(): R|kotlin/Int| + public final val h: R|kotlin/String|by R|kotlin/lazy|( = lazy@fun (): R|kotlin/String| { + ^ String(H) + } + ) + public get(): R|kotlin/String| + public final const val i: R|kotlin/Int| = Int(123) + public get(): R|kotlin/Int| + public final val j: R|kotlin/Any| = object : R|kotlin/Any| { + private constructor(): R|| { + super() + } + + public final fun foo(): R|kotlin/String| { + ^foo String(foo) + } + + public final fun bar(): R|kotlin/String| { + ^bar String(bar) + } + + } + + public get(): R|kotlin/Any| + public final val k: R|(kotlin/String) -> kotlin/String| + public get(): R|(kotlin/String) -> kotlin/String| + public final val l: R|(kotlin/String) -> kotlin/String| + public get(): R|(kotlin/String) -> kotlin/String| diff --git a/compiler/fir/analysis-tests/testData/resolve/headerMode/propertyDeclaration.kt b/compiler/fir/analysis-tests/testData/resolve/headerMode/propertyDeclaration.kt index b652d8e49b152..42fd7b9a6a3d3 100644 --- a/compiler/fir/analysis-tests/testData/resolve/headerMode/propertyDeclaration.kt +++ b/compiler/fir/analysis-tests/testData/resolve/headerMode/propertyDeclaration.kt @@ -1,3 +1,4 @@ +// WITH_STDLIB // RUN_PIPELINE_TILL: BACKEND // FIR_DUMP // Public property with explicit type @@ -7,5 +8,33 @@ val b = "B" // Property with overriden getter and implicit type. fun foo() = "C" val c get() = foo() - +// Property initializer with control statement. +val d = true +val e = if(d) "True" else "False" +// Property with backing field use in setter. +var f: Int + set(value) { + if (value >= 0) { + // 'field' references the actual backing storage + field = value + } + } +// Property with backing field use in getter. +val g: Int + get() { + return g + 1 + } +// Delegated property with implicit type. +val h by lazy { + "H" +} +const val i = 123 +val j = object { + fun foo() = "foo" + fun bar(): String = "bar" +} +val k = fun(foo: String): String { + return "foo: $foo" +} +val l = fun(foo: String): String { return "Foo: $foo" } /* GENERATED_FIR_TAGS: propertyDeclaration, stringLiteral */ diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirDeclarationBuilder.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirDeclarationBuilder.kt index 7ca4c27715ff0..adde39eb54e97 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirDeclarationBuilder.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirDeclarationBuilder.kt @@ -1426,7 +1426,7 @@ class LightTreeRawFirDeclarationBuilder( BACKING_FIELD -> fieldDeclaration = it else -> if (it.isExpression()) { context.calleeNamesForLambda += null - propertyInitializer = withForcedLocalContext { + propertyInitializer = withForcedLocalContext(!isReturnType || modifiers?.isConst() == true) { expressionConverter.getAsFirExpression(it, "Should have initializer") } context.calleeNamesForLambda.removeLast() @@ -2070,8 +2070,9 @@ class LightTreeRawFirDeclarationBuilder( } val allowLegacyContractDescription = outerContractDescription == null - val forceKeepingTheBodyInHeaderMode = context.forceKeepingTheBodyInHeaderMode || functionBuilder.status.isInline - val bodyWithContractDescription = withForcedLocalContext(forceKeepingTheBodyInHeaderMode) { + val bodyWithContractDescription = withForcedLocalContext( + forceKeepingTheBodyInHeaderMode = functionBuilder.status.isInline || functionBuilder.returnTypeRef is FirImplicitTypeRef + ) { convertFunctionBody(block, expression, allowLegacyContractDescription) } this.body = bodyWithContractDescription.first @@ -2130,9 +2131,12 @@ class LightTreeRawFirDeclarationBuilder( block to contractDescription } } - expression != null -> FirSingleExpressionBlock( - expressionConverter.getAsFirExpression(expression, "Function has no body (but should)").toReturn() - ) to null + expression != null -> { + if (generateHeader) buildEmptyExpressionBlock() to null + else FirSingleExpressionBlock( + expressionConverter.getAsFirExpression(expression, "Function has no body (but should)").toReturn() + ) to null + } else -> null to null } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt index 51a09462496a6..0d91a6492ffbf 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt @@ -178,6 +178,11 @@ open class FirDeclarationsResolveTransformer( val cannotHaveDeepImplicitTypeRefs = property.backingField?.returnTypeRef !is FirImplicitTypeRef if (!property.isConst && implicitTypeOnly && property.returnTypeRef !is FirImplicitTypeRef && cannotHaveDeepImplicitTypeRefs) { + if (session.languageVersionSettings.getFlag(AnalysisFlags.headerMode) && + property.initializer !is FirAnonymousObjectExpression + ) { + property.replaceInitializer(null) + } return property } @@ -188,6 +193,14 @@ open class FirDeclarationsResolveTransformer( if (!initializerIsAlreadyResolved) { dataFlowAnalyzer.enterProperty(property) } + else if ( + session.languageVersionSettings.getFlag(AnalysisFlags.headerMode) && + !property.isConst && + property.returnTypeRef !is FirImplicitTypeRef && + property.initializer !is FirAnonymousObjectExpression + ) { + property.replaceInitializer(null) + } var backingFieldIsAlreadyResolved = false context.withProperty(property) { @@ -295,6 +308,13 @@ open class FirDeclarationsResolveTransformer( property.replaceControlFlowGraphReference(FirControlFlowGraphReferenceImpl(it)) } } + if (session.languageVersionSettings.getFlag(AnalysisFlags.headerMode) && + !property.isConst && + property.returnTypeRef !is FirImplicitTypeRef && + property.initializer !is FirAnonymousObjectExpression + ) { + property.replaceInitializer(null) + } property } diff --git a/compiler/testData/codegen/box/inference/pcla/issues/kt67993.kt b/compiler/testData/codegen/box/inference/pcla/issues/kt67993.kt index 0cca82c14245b..a21c6ffc4b375 100644 --- a/compiler/testData/codegen/box/inference/pcla/issues/kt67993.kt +++ b/compiler/testData/codegen/box/inference/pcla/issues/kt67993.kt @@ -1,6 +1,4 @@ // ISSUE: KT-67993 -// IGNORE_HEADER_MODE: JVM_IR -// Reason: KT-82336 fun box(): String { return Klass().buildee.produce()