[FIR] Create intersection overrides for fields in intersection type scope

^KT-56820 Fixed
This commit is contained in:
Dmitriy Novozhilov
2023-03-01 13:16:00 +02:00
committed by Space Team
parent 4e56079c59
commit 8c6d4a6f4b
13 changed files with 325 additions and 70 deletions
@@ -4385,6 +4385,12 @@ public class DiagnosisCompilerFirTestdataTestGenerated extends AbstractDiagnosis
runTest("compiler/fir/analysis-tests/testData/resolve/smartcasts/smartcastToTypeParameter.kt"); runTest("compiler/fir/analysis-tests/testData/resolve/smartcasts/smartcastToTypeParameter.kt");
} }
@Test
@TestMetadata("smartcastedField.kt")
public void testSmartcastedField() throws Exception {
runTest("compiler/fir/analysis-tests/testData/resolve/smartcasts/smartcastedField.kt");
}
@Test @Test
@TestMetadata("smartcastsFromEquals_differentModule.kt") @TestMetadata("smartcastsFromEquals_differentModule.kt")
public void testSmartcastsFromEquals_differentModule() throws Exception { public void testSmartcastsFromEquals_differentModule() throws Exception {
@@ -3862,6 +3862,11 @@ public class LazyBodyIsNotTouchedTilContractsPhaseTestGenerated extends Abstract
runTest("compiler/fir/analysis-tests/testData/resolve/smartcasts/smartcastToTypeParameter.kt"); runTest("compiler/fir/analysis-tests/testData/resolve/smartcasts/smartcastToTypeParameter.kt");
} }
@TestMetadata("smartcastedField.kt")
public void testSmartcastedField() throws Exception {
runTest("compiler/fir/analysis-tests/testData/resolve/smartcasts/smartcastedField.kt");
}
@TestMetadata("smartcastsFromEquals_differentModule.kt") @TestMetadata("smartcastsFromEquals_differentModule.kt")
public void testSmartcastsFromEquals_differentModule() throws Exception { public void testSmartcastsFromEquals_differentModule() throws Exception {
runTest("compiler/fir/analysis-tests/testData/resolve/smartcasts/smartcastsFromEquals_differentModule.kt"); runTest("compiler/fir/analysis-tests/testData/resolve/smartcasts/smartcastsFromEquals_differentModule.kt");
@@ -0,0 +1,21 @@
FILE: main.kt
private final val anyProperty: R|Property<kotlin/Any>| = R|/Property.Property|<R|kotlin/Any|>()
private get(): R|Property<kotlin/Any>|
private final val boundedProperty: R|Property<kotlin/String>| = R|/Property.Property|<R|kotlin/String|>()
private get(): R|Property<kotlin/String>|
public final fun test_1(x: R|Property<kotlin/Any>|): R|kotlin/Unit| {
when () {
(R|<local>/x| is R|Reference|) -> {
R|<local>/x|.R|SubstitutionOverride</Reference.id>|
}
}
}
public final fun test_2(x: R|Property<kotlin/String>|): R|kotlin/Unit| {
when () {
(R|<local>/x| is R|Reference|) -> {
R|<local>/x|.R|/Reference.id|
}
}
}
@@ -0,0 +1,33 @@
// ISSUE: KT-56820
// FILE: PropertyId.java
public class PropertyId<T> {}
// FILE: ReferenceId.java
public class ReferenceId extends PropertyId<Object> {}
// FILE: Property.java
public class Property<T> {
public PropertyId<T> id = new PropertyId<>();
}
// FILE: Reference.java
public class Reference extends Property<Object> {
public ReferenceId getId() { return new ReferenceId(); }
}
// FILE: main.kt
private val anyProperty = Property<Any>()
private val boundedProperty = Property<String>()
fun test_1(x: Property<Any>) {
if (x is Reference) {
x.id
}
}
fun test_2(x: Property<String>) {
if (x is Reference) {
x.id
}
}
@@ -4385,6 +4385,12 @@ public class FirLightTreeDiagnosticsTestGenerated extends AbstractFirLightTreeDi
runTest("compiler/fir/analysis-tests/testData/resolve/smartcasts/smartcastToTypeParameter.kt"); runTest("compiler/fir/analysis-tests/testData/resolve/smartcasts/smartcastToTypeParameter.kt");
} }
@Test
@TestMetadata("smartcastedField.kt")
public void testSmartcastedField() throws Exception {
runTest("compiler/fir/analysis-tests/testData/resolve/smartcasts/smartcastedField.kt");
}
@Test @Test
@TestMetadata("smartcastsFromEquals_differentModule.kt") @TestMetadata("smartcastsFromEquals_differentModule.kt")
public void testSmartcastsFromEquals_differentModule() throws Exception { public void testSmartcastsFromEquals_differentModule() throws Exception {
@@ -4385,6 +4385,12 @@ public class FirPsiDiagnosticTestGenerated extends AbstractFirPsiDiagnosticTest
runTest("compiler/fir/analysis-tests/testData/resolve/smartcasts/smartcastToTypeParameter.kt"); runTest("compiler/fir/analysis-tests/testData/resolve/smartcasts/smartcastToTypeParameter.kt");
} }
@Test
@TestMetadata("smartcastedField.kt")
public void testSmartcastedField() throws Exception {
runTest("compiler/fir/analysis-tests/testData/resolve/smartcasts/smartcastedField.kt");
}
@Test @Test
@TestMetadata("smartcastsFromEquals_differentModule.kt") @TestMetadata("smartcastsFromEquals_differentModule.kt")
public void testSmartcastsFromEquals_differentModule() throws Exception { public void testSmartcastsFromEquals_differentModule() throws Exception {
@@ -379,6 +379,42 @@ object FirFakeOverrideGenerator {
} }
} }
fun createCopyForFirField(
newSymbol: FirFieldSymbol,
baseField: FirField,
derivedClassLookupTag: ConeClassLikeLookupTag?,
session: FirSession,
origin: FirDeclarationOrigin,
isExpect: Boolean = baseField.isExpect,
newDispatchReceiverType: ConeSimpleKotlinType?,
newReceiverType: ConeKotlinType? = null,
newContextReceiverTypes: List<ConeKotlinType?>? = null,
newReturnType: ConeKotlinType? = null,
newModality: Modality? = null,
newVisibility: Visibility? = null,
fakeOverrideSubstitution: FakeOverrideSubstitution? = null
): FirField {
return buildField {
source = baseField.source
moduleData = session.moduleData
this.origin = origin
name = baseField.name
isVar = baseField.isVar
this.symbol = newSymbol
status = baseField.status.copy(newVisibility, newModality, isExpect = isExpect)
resolvePhase = baseField.resolvePhase
dispatchReceiverType = newDispatchReceiverType
attributes = baseField.attributes.copy()
configureAnnotationsAndSignature(
baseField, newReceiverType, newContextReceiverTypes, newReturnType, fakeOverrideSubstitution, updateReceiver = false
)
deprecationsProvider = baseField.deprecationsProvider
}.apply {
containingClassForStaticMemberAttr = derivedClassLookupTag.takeIf { shouldOverrideSetContainingClass(baseField) }
}
}
private fun FirPropertyBuilder.configureAnnotationsTypeParametersAndSignature( private fun FirPropertyBuilder.configureAnnotationsTypeParametersAndSignature(
useSiteSession: FirSession, useSiteSession: FirSession,
baseProperty: FirProperty, baseProperty: FirProperty,
@@ -452,35 +488,38 @@ object FirFakeOverrideGenerator {
return Triple(copiedReceiverType, copiedContextReceiverTypes, Maybe.Value(copiedReturnType)) return Triple(copiedReceiverType, copiedContextReceiverTypes, Maybe.Value(copiedReturnType))
} }
private fun FirPropertyBuilder.configureAnnotationsAndSignature( private fun FirVariableBuilder.configureAnnotationsAndSignature(
baseProperty: FirProperty, baseVariable: FirVariable,
newReceiverType: ConeKotlinType?, newReceiverType: ConeKotlinType?,
newContextReceiverTypes: List<ConeKotlinType?>?, newContextReceiverTypes: List<ConeKotlinType?>?,
newReturnType: ConeKotlinType?, newReturnType: ConeKotlinType?,
fakeOverrideSubstitution: FakeOverrideSubstitution? fakeOverrideSubstitution: FakeOverrideSubstitution?,
updateReceiver: Boolean = true
) { ) {
annotations += baseProperty.annotations annotations += baseVariable.annotations
@Suppress("NAME_SHADOWING") @Suppress("NAME_SHADOWING")
val fakeOverrideSubstitution = fakeOverrideSubstitution ?: runIf(baseProperty.returnTypeRef is FirImplicitTypeRef) { val fakeOverrideSubstitution = fakeOverrideSubstitution ?: runIf(baseVariable.returnTypeRef is FirImplicitTypeRef) {
FakeOverrideSubstitution(ConeSubstitutor.Empty, baseProperty.symbol) FakeOverrideSubstitution(ConeSubstitutor.Empty, baseVariable.symbol)
} }
if (fakeOverrideSubstitution != null) { if (fakeOverrideSubstitution != null) {
returnTypeRef = buildImplicitTypeRef() returnTypeRef = buildImplicitTypeRef()
attributes.fakeOverrideSubstitution = fakeOverrideSubstitution attributes.fakeOverrideSubstitution = fakeOverrideSubstitution
} else { } else {
returnTypeRef = baseProperty.returnTypeRef.withReplacedReturnType(newReturnType) returnTypeRef = baseVariable.returnTypeRef.withReplacedReturnType(newReturnType)
} }
receiverParameter = baseProperty.receiverParameter?.let { receiverParameter -> if (updateReceiver) {
buildReceiverParameterCopy(receiverParameter) { receiverParameter = baseVariable.receiverParameter?.let { receiverParameter ->
typeRef = receiverParameter.typeRef.withReplacedConeType(newReceiverType) buildReceiverParameterCopy(receiverParameter) {
typeRef = receiverParameter.typeRef.withReplacedConeType(newReceiverType)
}
} }
} }
contextReceivers += baseProperty.contextReceivers.zip( contextReceivers += baseVariable.contextReceivers.zip(
newContextReceiverTypes ?: List(baseProperty.contextReceivers.size) { null } newContextReceiverTypes ?: List(baseVariable.contextReceivers.size) { null }
) { contextReceiver, newType -> ) { contextReceiver, newType ->
buildContextReceiverCopy(contextReceiver) { buildContextReceiverCopy(contextReceiver) {
typeRef = contextReceiver.typeRef.withReplacedConeType(newType) typeRef = contextReceiver.typeRef.withReplacedConeType(newType)
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.caches.*
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.FirVariable
import org.jetbrains.kotlin.fir.declarations.utils.isExpect import org.jetbrains.kotlin.fir.declarations.utils.isExpect
import org.jetbrains.kotlin.fir.declarations.utils.modality import org.jetbrains.kotlin.fir.declarations.utils.modality
import org.jetbrains.kotlin.fir.declarations.utils.visibility import org.jetbrains.kotlin.fir.declarations.utils.visibility
@@ -24,6 +25,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.CallableId
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.utils.addToStdlib.runIf
import kotlin.contracts.ExperimentalContracts import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.contract import kotlin.contracts.contract
@@ -104,7 +106,6 @@ class FirTypeIntersectionScopeContext(
return collectIntersectionResultsForCallables(name, FirScope::processFunctionsByName) return collectIntersectionResultsForCallables(name, FirScope::processFunctionsByName)
} }
@OptIn(PrivateForInline::class)
inline fun <D : FirCallableSymbol<*>> collectMembersGroupedByScope( inline fun <D : FirCallableSymbol<*>> collectMembersGroupedByScope(
name: Name, name: Name,
processCallables: FirScope.(Name, (D) -> Unit) -> Unit processCallables: FirScope.(Name, (D) -> Unit) -> Unit
@@ -123,7 +124,6 @@ class FirTypeIntersectionScopeContext(
} }
} }
@OptIn(PrivateForInline::class)
inline fun <D : FirCallableSymbol<*>> collectIntersectionResultsForCallables( inline fun <D : FirCallableSymbol<*>> collectIntersectionResultsForCallables(
name: Name, name: Name,
processCallables: FirScope.(Name, (D) -> Unit) -> Unit processCallables: FirScope.(Name, (D) -> Unit) -> Unit
@@ -200,7 +200,12 @@ class FirTypeIntersectionScopeContext(
is FirPropertySymbol -> is FirPropertySymbol ->
createIntersectionOverrideProperty(mostSpecificSymbols, extractedOverridesSymbols, newModality, newVisibility) createIntersectionOverrideProperty(mostSpecificSymbols, extractedOverridesSymbols, newModality, newVisibility)
else -> throw IllegalStateException("Should not be here") is FirFieldSymbol -> {
if (forClassUseSiteScope) error("Can not create intersection override in class scope for field ${key.member}")
createIntersectionOverrideField(mostSpecificSymbols, extractedOverridesSymbols, newModality, newVisibility)
}
else -> error("Unsupported symbol type for creating intersection overrides: ${key.member}")
}.withScope(key.baseScope) }.withScope(key.baseScope)
} }
@@ -372,26 +377,62 @@ class FirTypeIntersectionScopeContext(
newModality: Modality?, newModality: Modality?,
newVisibility: Visibility, newVisibility: Visibility,
): FirPropertySymbol { ): FirPropertySymbol {
val key = mostSpecific.first() as FirPropertySymbol return createIntersectionOverrideVariable<FirPropertySymbol, _>(
mostSpecific,
overrides,
::FirIntersectionOverridePropertySymbol,
) { symbol, fir, returnType ->
FirFakeOverrideGenerator.createCopyForFirProperty(
symbol, fir, derivedClassLookupTag = null, session,
FirDeclarationOrigin.IntersectionOverride,
newModality = newModality,
newVisibility = newVisibility,
newDispatchReceiverType = dispatchReceiverType,
// If any of the properties are vars and the types are not equal, these declarations are conflicting
// anyway and their uses should result in an overload resolution error.
newReturnType = returnType
)
}
}
private fun createIntersectionOverrideField(
mostSpecific: Collection<FirCallableSymbol<*>>,
overrides: Collection<FirCallableSymbol<*>>,
newModality: Modality?,
newVisibility: Visibility,
): FirFieldSymbol {
return createIntersectionOverrideVariable<FirFieldSymbol, _>(
mostSpecific,
overrides,
::FirIntersectionOverrideFieldSymbol
) { symbol, fir, returnType ->
FirFakeOverrideGenerator.createCopyForFirField(
symbol, fir, derivedClassLookupTag = null, session,
FirDeclarationOrigin.IntersectionOverride,
newModality = newModality,
newVisibility = newVisibility,
newDispatchReceiverType = dispatchReceiverType,
// If any of the properties are vars and the types are not equal, these declarations are conflicting
// anyway and their uses should result in an overload resolution error.
newReturnType = returnType
)
}
}
private inline fun <reified S : FirVariableSymbol<F>, F : FirVariable> createIntersectionOverrideVariable(
mostSpecific: Collection<FirCallableSymbol<*>>,
overrides: Collection<FirCallableSymbol<*>>,
createIntersectionOverrideSymbol: (CallableId, Collection<FirCallableSymbol<*>>) -> S,
createCopy: (S, F, returnType: ConeKotlinType?) -> F
): S {
val key = mostSpecific.first() as S
val keyFir = key.fir val keyFir = key.fir
val callableId = CallableId( val callableId = CallableId(dispatchReceiverType.classId ?: keyFir.dispatchReceiverClassLookupTagOrNull()?.classId!!, keyFir.name)
dispatchReceiverType.classId ?: keyFir.dispatchReceiverClassLookupTagOrNull()?.classId!!, val newSymbol = createIntersectionOverrideSymbol(callableId, overrides)
keyFir.name val newReturnType = runIf(!forClassUseSiteScope && mostSpecific.none { (it as FirVariableSymbol<*>).fir.isVar }) {
) intersectReturnTypes(mostSpecific)
val newSymbol = FirIntersectionOverridePropertySymbol(callableId, overrides) }
FirFakeOverrideGenerator.createCopyForFirProperty( createCopy(newSymbol, keyFir, newReturnType).apply {
newSymbol, keyFir, derivedClassLookupTag = null, session,
FirDeclarationOrigin.IntersectionOverride,
newModality = newModality,
newVisibility = newVisibility,
newDispatchReceiverType = dispatchReceiverType,
// If any of the properties are vars and the types are not equal, these declarations are conflicting
// anyway and their uses should result in an overload resolution error.
newReturnType = if (!forClassUseSiteScope && !mostSpecific.any { (it as FirPropertySymbol).fir.isVar })
intersectReturnTypes(mostSpecific)
else
null,
).apply {
originalForIntersectionOverrideAttr = keyFir originalForIntersectionOverrideAttr = keyFir
} }
return newSymbol return newSymbol
@@ -26,7 +26,7 @@ import org.jetbrains.kotlin.fir.declarations.FirReceiverParameter
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRef import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRef
import org.jetbrains.kotlin.fir.declarations.UnresolvedDeprecationProvider import org.jetbrains.kotlin.fir.declarations.UnresolvedDeprecationProvider
import org.jetbrains.kotlin.fir.declarations.builder.FirDeclarationBuilder import org.jetbrains.kotlin.fir.declarations.builder.FirVariableBuilder
import org.jetbrains.kotlin.fir.declarations.impl.FirFieldImpl import org.jetbrains.kotlin.fir.declarations.impl.FirFieldImpl
import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
@@ -44,23 +44,23 @@ import org.jetbrains.kotlin.serialization.deserialization.descriptors.Deserializ
*/ */
@FirBuilderDsl @FirBuilderDsl
open class FirFieldBuilder : FirDeclarationBuilder, FirAnnotationContainerBuilder { open class FirFieldBuilder : FirVariableBuilder, FirAnnotationContainerBuilder {
override var source: KtSourceElement? = null override var source: KtSourceElement? = null
override var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR override var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR
override lateinit var moduleData: FirModuleData override lateinit var moduleData: FirModuleData
override lateinit var origin: FirDeclarationOrigin override lateinit var origin: FirDeclarationOrigin
override var attributes: FirDeclarationAttributes = FirDeclarationAttributes() override var attributes: FirDeclarationAttributes = FirDeclarationAttributes()
open val typeParameters: MutableList<FirTypeParameterRef> = mutableListOf() open val typeParameters: MutableList<FirTypeParameterRef> = mutableListOf()
open lateinit var status: FirDeclarationStatus override lateinit var status: FirDeclarationStatus
open lateinit var returnTypeRef: FirTypeRef override lateinit var returnTypeRef: FirTypeRef
open var deprecationsProvider: DeprecationsProvider = UnresolvedDeprecationProvider override var deprecationsProvider: DeprecationsProvider = UnresolvedDeprecationProvider
open var containerSource: DeserializedContainerSource? = null override var containerSource: DeserializedContainerSource? = null
open var dispatchReceiverType: ConeSimpleKotlinType? = null override var dispatchReceiverType: ConeSimpleKotlinType? = null
open val contextReceivers: MutableList<FirContextReceiver> = mutableListOf() override val contextReceivers: MutableList<FirContextReceiver> = mutableListOf()
open lateinit var name: Name override lateinit var name: Name
open var initializer: FirExpression? = null override var initializer: FirExpression? = null
open var isVar: Boolean by kotlin.properties.Delegates.notNull<Boolean>() override var isVar: Boolean by kotlin.properties.Delegates.notNull<Boolean>()
open var backingField: FirBackingField? = null override var backingField: FirBackingField? = null
override val annotations: MutableList<FirAnnotation> = mutableListOf() override val annotations: MutableList<FirAnnotation> = mutableListOf()
open lateinit var symbol: FirFieldSymbol open lateinit var symbol: FirFieldSymbol
@@ -88,6 +88,34 @@ open class FirFieldBuilder : FirDeclarationBuilder, FirAnnotationContainerBuilde
) )
} }
@Deprecated("Modification of 'receiverParameter' has no impact for FirFieldBuilder", level = DeprecationLevel.HIDDEN)
override var receiverParameter: FirReceiverParameter?
get() = throw IllegalStateException()
set(_) {
throw IllegalStateException()
}
@Deprecated("Modification of 'delegate' has no impact for FirFieldBuilder", level = DeprecationLevel.HIDDEN)
override var delegate: FirExpression?
get() = throw IllegalStateException()
set(_) {
throw IllegalStateException()
}
@Deprecated("Modification of 'getter' has no impact for FirFieldBuilder", level = DeprecationLevel.HIDDEN)
override var getter: FirPropertyAccessor?
get() = throw IllegalStateException()
set(_) {
throw IllegalStateException()
}
@Deprecated("Modification of 'setter' has no impact for FirFieldBuilder", level = DeprecationLevel.HIDDEN)
override var setter: FirPropertyAccessor?
get() = throw IllegalStateException()
set(_) {
throw IllegalStateException()
}
} }
@OptIn(ExperimentalContracts::class) @OptIn(ExperimentalContracts::class)
@@ -26,8 +26,8 @@ import org.jetbrains.kotlin.fir.declarations.FirReceiverParameter
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
import org.jetbrains.kotlin.fir.declarations.UnresolvedDeprecationProvider import org.jetbrains.kotlin.fir.declarations.UnresolvedDeprecationProvider
import org.jetbrains.kotlin.fir.declarations.builder.FirDeclarationBuilder
import org.jetbrains.kotlin.fir.declarations.builder.FirTypeParametersOwnerBuilder import org.jetbrains.kotlin.fir.declarations.builder.FirTypeParametersOwnerBuilder
import org.jetbrains.kotlin.fir.declarations.builder.FirVariableBuilder
import org.jetbrains.kotlin.fir.declarations.impl.FirPropertyImpl import org.jetbrains.kotlin.fir.declarations.impl.FirPropertyImpl
import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
@@ -47,27 +47,27 @@ import org.jetbrains.kotlin.serialization.deserialization.descriptors.Deserializ
*/ */
@FirBuilderDsl @FirBuilderDsl
class FirPropertyBuilder : FirDeclarationBuilder, FirTypeParametersOwnerBuilder, FirAnnotationContainerBuilder { class FirPropertyBuilder : FirVariableBuilder, FirTypeParametersOwnerBuilder, FirAnnotationContainerBuilder {
override var source: KtSourceElement? = null override var source: KtSourceElement? = null
override var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR override var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR
override lateinit var moduleData: FirModuleData override lateinit var moduleData: FirModuleData
override lateinit var origin: FirDeclarationOrigin override lateinit var origin: FirDeclarationOrigin
override var attributes: FirDeclarationAttributes = FirDeclarationAttributes() override var attributes: FirDeclarationAttributes = FirDeclarationAttributes()
lateinit var status: FirDeclarationStatus override lateinit var status: FirDeclarationStatus
lateinit var returnTypeRef: FirTypeRef override lateinit var returnTypeRef: FirTypeRef
var receiverParameter: FirReceiverParameter? = null override var receiverParameter: FirReceiverParameter? = null
var deprecationsProvider: DeprecationsProvider = UnresolvedDeprecationProvider override var deprecationsProvider: DeprecationsProvider = UnresolvedDeprecationProvider
var containerSource: DeserializedContainerSource? = null override var containerSource: DeserializedContainerSource? = null
var dispatchReceiverType: ConeSimpleKotlinType? = null override var dispatchReceiverType: ConeSimpleKotlinType? = null
lateinit var name: Name override lateinit var name: Name
var initializer: FirExpression? = null override var initializer: FirExpression? = null
var delegate: FirExpression? = null override var delegate: FirExpression? = null
var isVar: Boolean by kotlin.properties.Delegates.notNull<Boolean>() override var isVar: Boolean by kotlin.properties.Delegates.notNull<Boolean>()
var getter: FirPropertyAccessor? = null override var getter: FirPropertyAccessor? = null
var setter: FirPropertyAccessor? = null override var setter: FirPropertyAccessor? = null
var backingField: FirBackingField? = null override var backingField: FirBackingField? = null
override val annotations: MutableList<FirAnnotation> = mutableListOf() override val annotations: MutableList<FirAnnotation> = mutableListOf()
val contextReceivers: MutableList<FirContextReceiver> = mutableListOf() override val contextReceivers: MutableList<FirContextReceiver> = mutableListOf()
lateinit var symbol: FirPropertySymbol lateinit var symbol: FirPropertySymbol
var delegateFieldSymbol: FirDelegateFieldSymbol? = null var delegateFieldSymbol: FirDelegateFieldSymbol? = null
var isLocal: Boolean by kotlin.properties.Delegates.notNull<Boolean>() var isLocal: Boolean by kotlin.properties.Delegates.notNull<Boolean>()
@@ -0,0 +1,60 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@file:Suppress("DuplicatedCode")
package org.jetbrains.kotlin.fir.declarations.builder
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.declarations.DeprecationsProvider
import org.jetbrains.kotlin.fir.declarations.FirBackingField
import org.jetbrains.kotlin.fir.declarations.FirContextReceiver
import org.jetbrains.kotlin.fir.declarations.FirDeclarationAttributes
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus
import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
import org.jetbrains.kotlin.fir.declarations.FirReceiverParameter
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.FirVariable
import org.jetbrains.kotlin.fir.declarations.builder.FirDeclarationBuilder
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.types.ConeSimpleKotlinType
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.*
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
/*
* This file was generated automatically
* DO NOT MODIFY IT MANUALLY
*/
@FirBuilderDsl
interface FirVariableBuilder : FirDeclarationBuilder {
abstract override var source: KtSourceElement?
abstract override var resolvePhase: FirResolvePhase
abstract override val annotations: MutableList<FirAnnotation>
abstract override var moduleData: FirModuleData
abstract override var origin: FirDeclarationOrigin
abstract override var attributes: FirDeclarationAttributes
abstract var status: FirDeclarationStatus
abstract var returnTypeRef: FirTypeRef
abstract var receiverParameter: FirReceiverParameter?
abstract var deprecationsProvider: DeprecationsProvider
abstract var containerSource: DeserializedContainerSource?
abstract var dispatchReceiverType: ConeSimpleKotlinType?
abstract val contextReceivers: MutableList<FirContextReceiver>
abstract var name: Name
abstract var initializer: FirExpression?
abstract var delegate: FirExpression?
abstract var isVar: Boolean
abstract var getter: FirPropertyAccessor?
abstract var setter: FirPropertyAccessor?
abstract var backingField: FirBackingField?
override fun build(): FirVariable
}
@@ -77,6 +77,11 @@ class FirIntersectionOverridePropertySymbol(
override val intersections: Collection<FirCallableSymbol<*>> override val intersections: Collection<FirCallableSymbol<*>>
) : FirPropertySymbol(callableId), FirIntersectionCallableSymbol ) : FirPropertySymbol(callableId), FirIntersectionCallableSymbol
class FirIntersectionOverrideFieldSymbol(
callableId: CallableId,
override val intersections: Collection<FirCallableSymbol<*>>
) : FirFieldSymbol(callableId), FirIntersectionCallableSymbol
class FirBackingFieldSymbol(callableId: CallableId) : FirVariableSymbol<FirBackingField>(callableId) { class FirBackingFieldSymbol(callableId: CallableId) : FirVariableSymbol<FirBackingField>(callableId) {
val isVal: Boolean val isVal: Boolean
get() = fir.isVal get() = fir.isVal
@@ -93,7 +98,7 @@ class FirBackingFieldSymbol(callableId: CallableId) : FirVariableSymbol<FirBacki
class FirDelegateFieldSymbol(callableId: CallableId) : FirVariableSymbol<FirProperty>(callableId) class FirDelegateFieldSymbol(callableId: CallableId) : FirVariableSymbol<FirProperty>(callableId)
class FirFieldSymbol(callableId: CallableId) : FirVariableSymbol<FirField>(callableId) { open class FirFieldSymbol(callableId: CallableId) : FirVariableSymbol<FirField>(callableId) {
val hasInitializer: Boolean val hasInitializer: Boolean
get() = fir.initializer != null get() = fir.initializer != null
@@ -101,12 +101,6 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
withCopy() withCopy()
} }
builder(field) {
parents += declarationBuilder
default("resolvePhase", "FirResolvePhase.DECLARATIONS")
openBuilder()
}
builder(anonymousObject) { builder(anonymousObject) {
parents += declarationBuilder parents += declarationBuilder
parents += classBuilder parents += classBuilder
@@ -223,8 +217,13 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
parents += callBuilder parents += callBuilder
} }
builder(property) { val variableBuilder by builder {
fields from variable without listOf("symbol", "typeParameters", "isVal")
parents += declarationBuilder parents += declarationBuilder
}
builder(property) {
parents += variableBuilder
parents += typeParametersOwnerBuilder parents += typeParametersOwnerBuilder
defaultNull("getter", "setter", "containerSource", "delegateFieldSymbol") defaultNull("getter", "setter", "containerSource", "delegateFieldSymbol")
default("resolvePhase", "FirResolvePhase.RAW_FIR") default("resolvePhase", "FirResolvePhase.RAW_FIR")
@@ -232,6 +231,12 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
withCopy() withCopy()
} }
builder(field) {
parents += variableBuilder
default("resolvePhase", "FirResolvePhase.DECLARATIONS")
openBuilder()
}
builder(typeOperatorCall) { builder(typeOperatorCall) {
parents += callBuilder parents += callBuilder
default("argumentList") { default("argumentList") {