Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ FILE: constructorDeclaration.kt
super<R|kotlin/Any|>()
}

public final val a: R|kotlin/String| = R|<local>/a|
public final val a: R|kotlin/String|
public get(): R|kotlin/String|

public final val b: R|kotlin/Int| = R|<local>/b|
public final val b: R|kotlin/Int|
public get(): R|kotlin/Int|

public constructor(e: R|kotlin/String|): R|A| {
Expand All @@ -24,10 +24,10 @@ FILE: constructorDeclaration.kt
super<R|kotlin/Any|>()
}

public final val a: R|kotlin/String| = R|<local>/a|
public final val a: R|kotlin/String|
public get(): R|kotlin/String|

public final val b: R|kotlin/Int| = R|<local>/b|
public final val b: R|kotlin/Int|
public get(): R|kotlin/Int|

public constructor(e: R|kotlin/String|): R|B| {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ FILE: dataClassDeclaration.kt
super<R|kotlin/Any|>()
}

public final val name: R|kotlin/String| = R|<local>/name|
public final val name: R|kotlin/String|
public get(): R|kotlin/String|

public final val age: R|kotlin/Int| = R|<local>/age|
public final val age: R|kotlin/Int|
public get(): R|kotlin/Int|

public final operator fun component1(): R|kotlin/String|
Expand Down
Original file line number Diff line number Diff line change
@@ -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|<R|kotlin/String|>(<L> = lazy@fun <anonymous>(): R|kotlin/String| <inline=NoInline> {
^ 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|<anonymous>| {
super<R|kotlin/Any|>()
}

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|
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// WITH_STDLIB
// RUN_PIPELINE_TILL: BACKEND
// FIR_DUMP
// Public property with explicit type
Expand All @@ -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 */
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Setting forceKeepingTheBodyInHeaderMode here actually doesn't do anything, as this property affects only transformFunctionBody, and here we call just getAsFirExpression, which unconditionally creates an expression.

Here you should just don't call getAsFirExpression if isReturnType && modifiers?.isConst() != true.

expressionConverter.getAsFirExpression(it, "Should have initializer")
}
context.calleeNamesForLambda.removeLast()
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -2130,9 +2131,12 @@ class LightTreeRawFirDeclarationBuilder(
block to contractDescription
}
}
expression != null -> FirSingleExpressionBlock(
expressionConverter.getAsFirExpression<FirExpression>(expression, "Function has no body (but should)").toReturn()
) to null
expression != null -> {
if (generateHeader) buildEmptyExpressionBlock() to null
else FirSingleExpressionBlock(
expressionConverter.getAsFirExpression<FirExpression>(expression, "Function has no body (but should)").toReturn()
) to null
}
else -> null to null
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand All @@ -188,6 +193,14 @@ open class FirDeclarationsResolveTransformer(
if (!initializerIsAlreadyResolved) {
dataFlowAnalyzer.enterProperty(property)
}
else if (
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This branch is actually useless, as you anyway remove the initializer in the end of the transformProperty.

session.languageVersionSettings.getFlag(AnalysisFlags.headerMode) &&
!property.isConst &&
property.returnTypeRef !is FirImplicitTypeRef &&
property.initializer !is FirAnonymousObjectExpression
) {
property.replaceInitializer(null)
}

var backingFieldIsAlreadyResolved = false
context.withProperty(property) {
Expand Down Expand Up @@ -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
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
// ISSUE: KT-67993
// IGNORE_HEADER_MODE: JVM_IR
// Reason: KT-82336

fun box(): String {
return Klass().buildee.produce()
Expand Down