diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java index 88c166100b9..ea816e77f32 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java @@ -4385,6 +4385,12 @@ public class DiagnosisCompilerFirTestdataTestGenerated extends AbstractDiagnosis 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 @TestMetadata("smartcastsFromEquals_differentModule.kt") public void testSmartcastsFromEquals_differentModule() throws Exception { diff --git a/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java b/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java index 07cbd6bc388..af1dd22d2f2 100644 --- a/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java +++ b/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java @@ -3862,6 +3862,11 @@ public class LazyBodyIsNotTouchedTilContractsPhaseTestGenerated extends Abstract 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") public void testSmartcastsFromEquals_differentModule() throws Exception { runTest("compiler/fir/analysis-tests/testData/resolve/smartcasts/smartcastsFromEquals_differentModule.kt"); diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/smartcastedField.fir.txt b/compiler/fir/analysis-tests/testData/resolve/smartcasts/smartcastedField.fir.txt new file mode 100644 index 00000000000..449cc8faeaf --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/smartcastedField.fir.txt @@ -0,0 +1,21 @@ +FILE: main.kt + private final val anyProperty: R|Property| = R|/Property.Property|() + private get(): R|Property| + private final val boundedProperty: R|Property| = R|/Property.Property|() + private get(): R|Property| + public final fun test_1(x: R|Property|): R|kotlin/Unit| { + when () { + (R|/x| is R|Reference|) -> { + R|/x|.R|SubstitutionOverride| + } + } + + } + public final fun test_2(x: R|Property|): R|kotlin/Unit| { + when () { + (R|/x| is R|Reference|) -> { + R|/x|.R|/Reference.id| + } + } + + } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/smartcastedField.kt b/compiler/fir/analysis-tests/testData/resolve/smartcasts/smartcastedField.kt new file mode 100644 index 00000000000..46f3ee846ce --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/smartcastedField.kt @@ -0,0 +1,33 @@ +// ISSUE: KT-56820 + +// FILE: PropertyId.java +public class PropertyId {} + +// FILE: ReferenceId.java +public class ReferenceId extends PropertyId {} + +// FILE: Property.java +public class Property { + public PropertyId id = new PropertyId<>(); +} + +// FILE: Reference.java +public class Reference extends Property { + public ReferenceId getId() { return new ReferenceId(); } +} + +// FILE: main.kt +private val anyProperty = Property() +private val boundedProperty = Property() + +fun test_1(x: Property) { + if (x is Reference) { + x.id + } +} + +fun test_2(x: Property) { + if (x is Reference) { + x.id + } +} diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeDiagnosticsTestGenerated.java index 70589815801..8260a104a1d 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeDiagnosticsTestGenerated.java @@ -4385,6 +4385,12 @@ public class FirLightTreeDiagnosticsTestGenerated extends AbstractFirLightTreeDi 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 @TestMetadata("smartcastsFromEquals_differentModule.kt") public void testSmartcastsFromEquals_differentModule() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiDiagnosticTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiDiagnosticTestGenerated.java index fe5a1a02bdb..e69dfce37c5 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiDiagnosticTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiDiagnosticTestGenerated.java @@ -4385,6 +4385,12 @@ public class FirPsiDiagnosticTestGenerated extends AbstractFirPsiDiagnosticTest 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 @TestMetadata("smartcastsFromEquals_differentModule.kt") public void testSmartcastsFromEquals_differentModule() throws Exception { diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirFakeOverrideGenerator.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirFakeOverrideGenerator.kt index 69ab056b828..abc4398198f 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirFakeOverrideGenerator.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirFakeOverrideGenerator.kt @@ -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? = 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( useSiteSession: FirSession, baseProperty: FirProperty, @@ -452,35 +488,38 @@ object FirFakeOverrideGenerator { return Triple(copiedReceiverType, copiedContextReceiverTypes, Maybe.Value(copiedReturnType)) } - private fun FirPropertyBuilder.configureAnnotationsAndSignature( - baseProperty: FirProperty, + private fun FirVariableBuilder.configureAnnotationsAndSignature( + baseVariable: FirVariable, newReceiverType: ConeKotlinType?, newContextReceiverTypes: List?, newReturnType: ConeKotlinType?, - fakeOverrideSubstitution: FakeOverrideSubstitution? + fakeOverrideSubstitution: FakeOverrideSubstitution?, + updateReceiver: Boolean = true ) { - annotations += baseProperty.annotations + annotations += baseVariable.annotations @Suppress("NAME_SHADOWING") - val fakeOverrideSubstitution = fakeOverrideSubstitution ?: runIf(baseProperty.returnTypeRef is FirImplicitTypeRef) { - FakeOverrideSubstitution(ConeSubstitutor.Empty, baseProperty.symbol) + val fakeOverrideSubstitution = fakeOverrideSubstitution ?: runIf(baseVariable.returnTypeRef is FirImplicitTypeRef) { + FakeOverrideSubstitution(ConeSubstitutor.Empty, baseVariable.symbol) } if (fakeOverrideSubstitution != null) { returnTypeRef = buildImplicitTypeRef() attributes.fakeOverrideSubstitution = fakeOverrideSubstitution } else { - returnTypeRef = baseProperty.returnTypeRef.withReplacedReturnType(newReturnType) + returnTypeRef = baseVariable.returnTypeRef.withReplacedReturnType(newReturnType) } - receiverParameter = baseProperty.receiverParameter?.let { receiverParameter -> - buildReceiverParameterCopy(receiverParameter) { - typeRef = receiverParameter.typeRef.withReplacedConeType(newReceiverType) + if (updateReceiver) { + receiverParameter = baseVariable.receiverParameter?.let { receiverParameter -> + buildReceiverParameterCopy(receiverParameter) { + typeRef = receiverParameter.typeRef.withReplacedConeType(newReceiverType) + } } } - contextReceivers += baseProperty.contextReceivers.zip( - newContextReceiverTypes ?: List(baseProperty.contextReceivers.size) { null } + contextReceivers += baseVariable.contextReceivers.zip( + newContextReceiverTypes ?: List(baseVariable.contextReceivers.size) { null } ) { contextReceiver, newType -> buildContextReceiverCopy(contextReceiver) { typeRef = contextReceiver.typeRef.withReplacedConeType(newType) diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScopeContext.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScopeContext.kt index 6b269e39e4b..10f4d397227 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScopeContext.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScopeContext.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.caches.* import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin 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.modality 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.name.CallableId import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.utils.addToStdlib.runIf import kotlin.contracts.ExperimentalContracts import kotlin.contracts.contract @@ -104,7 +106,6 @@ class FirTypeIntersectionScopeContext( return collectIntersectionResultsForCallables(name, FirScope::processFunctionsByName) } - @OptIn(PrivateForInline::class) inline fun > collectMembersGroupedByScope( name: Name, processCallables: FirScope.(Name, (D) -> Unit) -> Unit @@ -123,7 +124,6 @@ class FirTypeIntersectionScopeContext( } } - @OptIn(PrivateForInline::class) inline fun > collectIntersectionResultsForCallables( name: Name, processCallables: FirScope.(Name, (D) -> Unit) -> Unit @@ -200,7 +200,12 @@ class FirTypeIntersectionScopeContext( is FirPropertySymbol -> 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) } @@ -372,26 +377,62 @@ class FirTypeIntersectionScopeContext( newModality: Modality?, newVisibility: Visibility, ): FirPropertySymbol { - val key = mostSpecific.first() as FirPropertySymbol + return createIntersectionOverrideVariable( + 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>, + overrides: Collection>, + newModality: Modality?, + newVisibility: Visibility, + ): FirFieldSymbol { + return createIntersectionOverrideVariable( + 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 , F : FirVariable> createIntersectionOverrideVariable( + mostSpecific: Collection>, + overrides: Collection>, + createIntersectionOverrideSymbol: (CallableId, Collection>) -> S, + createCopy: (S, F, returnType: ConeKotlinType?) -> F + ): S { + val key = mostSpecific.first() as S val keyFir = key.fir - val callableId = CallableId( - dispatchReceiverType.classId ?: keyFir.dispatchReceiverClassLookupTagOrNull()?.classId!!, - keyFir.name - ) - val newSymbol = FirIntersectionOverridePropertySymbol(callableId, overrides) - FirFakeOverrideGenerator.createCopyForFirProperty( - 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 { + val callableId = CallableId(dispatchReceiverType.classId ?: keyFir.dispatchReceiverClassLookupTagOrNull()?.classId!!, keyFir.name) + val newSymbol = createIntersectionOverrideSymbol(callableId, overrides) + val newReturnType = runIf(!forClassUseSiteScope && mostSpecific.none { (it as FirVariableSymbol<*>).fir.isVar }) { + intersectReturnTypes(mostSpecific) + } + createCopy(newSymbol, keyFir, newReturnType).apply { originalForIntersectionOverrideAttr = keyFir } return newSymbol diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirFieldBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirFieldBuilder.kt index 1a116a224c8..c88b80c58b8 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirFieldBuilder.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirFieldBuilder.kt @@ -26,7 +26,7 @@ import org.jetbrains.kotlin.fir.declarations.FirReceiverParameter import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRef 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.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirExpression @@ -44,23 +44,23 @@ import org.jetbrains.kotlin.serialization.deserialization.descriptors.Deserializ */ @FirBuilderDsl -open class FirFieldBuilder : FirDeclarationBuilder, FirAnnotationContainerBuilder { +open class FirFieldBuilder : FirVariableBuilder, FirAnnotationContainerBuilder { override var source: KtSourceElement? = null override var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR override lateinit var moduleData: FirModuleData override lateinit var origin: FirDeclarationOrigin override var attributes: FirDeclarationAttributes = FirDeclarationAttributes() open val typeParameters: MutableList = mutableListOf() - open lateinit var status: FirDeclarationStatus - open lateinit var returnTypeRef: FirTypeRef - open var deprecationsProvider: DeprecationsProvider = UnresolvedDeprecationProvider - open var containerSource: DeserializedContainerSource? = null - open var dispatchReceiverType: ConeSimpleKotlinType? = null - open val contextReceivers: MutableList = mutableListOf() - open lateinit var name: Name - open var initializer: FirExpression? = null - open var isVar: Boolean by kotlin.properties.Delegates.notNull() - open var backingField: FirBackingField? = null + override lateinit var status: FirDeclarationStatus + override lateinit var returnTypeRef: FirTypeRef + override var deprecationsProvider: DeprecationsProvider = UnresolvedDeprecationProvider + override var containerSource: DeserializedContainerSource? = null + override var dispatchReceiverType: ConeSimpleKotlinType? = null + override val contextReceivers: MutableList = mutableListOf() + override lateinit var name: Name + override var initializer: FirExpression? = null + override var isVar: Boolean by kotlin.properties.Delegates.notNull() + override var backingField: FirBackingField? = null override val annotations: MutableList = mutableListOf() 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) diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirPropertyBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirPropertyBuilder.kt index 55352375dfe..96b734ead50 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirPropertyBuilder.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirPropertyBuilder.kt @@ -26,8 +26,8 @@ import org.jetbrains.kotlin.fir.declarations.FirReceiverParameter import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirTypeParameter 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.FirVariableBuilder import org.jetbrains.kotlin.fir.declarations.impl.FirPropertyImpl import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirExpression @@ -47,27 +47,27 @@ import org.jetbrains.kotlin.serialization.deserialization.descriptors.Deserializ */ @FirBuilderDsl -class FirPropertyBuilder : FirDeclarationBuilder, FirTypeParametersOwnerBuilder, FirAnnotationContainerBuilder { +class FirPropertyBuilder : FirVariableBuilder, FirTypeParametersOwnerBuilder, FirAnnotationContainerBuilder { override var source: KtSourceElement? = null override var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR override lateinit var moduleData: FirModuleData override lateinit var origin: FirDeclarationOrigin override var attributes: FirDeclarationAttributes = FirDeclarationAttributes() - lateinit var status: FirDeclarationStatus - lateinit var returnTypeRef: FirTypeRef - var receiverParameter: FirReceiverParameter? = null - var deprecationsProvider: DeprecationsProvider = UnresolvedDeprecationProvider - var containerSource: DeserializedContainerSource? = null - var dispatchReceiverType: ConeSimpleKotlinType? = null - lateinit var name: Name - var initializer: FirExpression? = null - var delegate: FirExpression? = null - var isVar: Boolean by kotlin.properties.Delegates.notNull() - var getter: FirPropertyAccessor? = null - var setter: FirPropertyAccessor? = null - var backingField: FirBackingField? = null + override lateinit var status: FirDeclarationStatus + override lateinit var returnTypeRef: FirTypeRef + override var receiverParameter: FirReceiverParameter? = null + override var deprecationsProvider: DeprecationsProvider = UnresolvedDeprecationProvider + override var containerSource: DeserializedContainerSource? = null + override var dispatchReceiverType: ConeSimpleKotlinType? = null + override lateinit var name: Name + override var initializer: FirExpression? = null + override var delegate: FirExpression? = null + override var isVar: Boolean by kotlin.properties.Delegates.notNull() + override var getter: FirPropertyAccessor? = null + override var setter: FirPropertyAccessor? = null + override var backingField: FirBackingField? = null override val annotations: MutableList = mutableListOf() - val contextReceivers: MutableList = mutableListOf() + override val contextReceivers: MutableList = mutableListOf() lateinit var symbol: FirPropertySymbol var delegateFieldSymbol: FirDelegateFieldSymbol? = null var isLocal: Boolean by kotlin.properties.Delegates.notNull() diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirVariableBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirVariableBuilder.kt new file mode 100644 index 00000000000..3b3b55f6b88 --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirVariableBuilder.kt @@ -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 + 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 + 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 +} diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirVariableSymbol.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirVariableSymbol.kt index 92d9c72fc53..f44472102c3 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirVariableSymbol.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirVariableSymbol.kt @@ -77,6 +77,11 @@ class FirIntersectionOverridePropertySymbol( override val intersections: Collection> ) : FirPropertySymbol(callableId), FirIntersectionCallableSymbol +class FirIntersectionOverrideFieldSymbol( + callableId: CallableId, + override val intersections: Collection> +) : FirFieldSymbol(callableId), FirIntersectionCallableSymbol + class FirBackingFieldSymbol(callableId: CallableId) : FirVariableSymbol(callableId) { val isVal: Boolean get() = fir.isVal @@ -93,7 +98,7 @@ class FirBackingFieldSymbol(callableId: CallableId) : FirVariableSymbol(callableId) -class FirFieldSymbol(callableId: CallableId) : FirVariableSymbol(callableId) { +open class FirFieldSymbol(callableId: CallableId) : FirVariableSymbol(callableId) { val hasInitializer: Boolean get() = fir.initializer != null diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/BuilderConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/BuilderConfigurator.kt index f8e1a651e95..aa840bb41cb 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/BuilderConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/BuilderConfigurator.kt @@ -101,12 +101,6 @@ object BuilderConfigurator : AbstractBuilderConfigurator(FirTree withCopy() } - builder(field) { - parents += declarationBuilder - default("resolvePhase", "FirResolvePhase.DECLARATIONS") - openBuilder() - } - builder(anonymousObject) { parents += declarationBuilder parents += classBuilder @@ -223,8 +217,13 @@ object BuilderConfigurator : AbstractBuilderConfigurator(FirTree parents += callBuilder } - builder(property) { + val variableBuilder by builder { + fields from variable without listOf("symbol", "typeParameters", "isVal") parents += declarationBuilder + } + + builder(property) { + parents += variableBuilder parents += typeParametersOwnerBuilder defaultNull("getter", "setter", "containerSource", "delegateFieldSymbol") default("resolvePhase", "FirResolvePhase.RAW_FIR") @@ -232,6 +231,12 @@ object BuilderConfigurator : AbstractBuilderConfigurator(FirTree withCopy() } + builder(field) { + parents += variableBuilder + default("resolvePhase", "FirResolvePhase.DECLARATIONS") + openBuilder() + } + builder(typeOperatorCall) { parents += callBuilder default("argumentList") {