Skip to content
Open
Show file tree
Hide file tree
Changes from 4 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,40 @@
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|
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,29 @@ 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"
}
/* GENERATED_FIR_TAGS: propertyDeclaration, stringLiteral */
Original file line number Diff line number Diff line change
Expand Up @@ -1426,9 +1426,13 @@ class LightTreeRawFirDeclarationBuilder(
BACKING_FIELD -> fieldDeclaration = it
else -> if (it.isExpression()) {
context.calleeNamesForLambda += null
propertyInitializer = withForcedLocalContext {
expressionConverter.getAsFirExpression(it, "Should have initializer")
}
propertyInitializer =
if (!headerMode ||
context.forceKeepingTheBodyInHeaderMode ||
!isReturnType ||
modifiers?.isConst() == true) withForcedLocalContext {
expressionConverter.getAsFirExpression(it, "Should have initializer")
} else null
context.calleeNamesForLambda.removeLast()
}
}
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