[FIR] Create intersection overrides for fields in intersection type scope
^KT-56820 Fixed
This commit is contained in:
committed by
Space Team
parent
4e56079c59
commit
8c6d4a6f4b
+6
@@ -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 {
|
||||||
|
|||||||
+5
@@ -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");
|
||||||
|
|||||||
+21
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
+6
@@ -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 {
|
||||||
|
|||||||
+6
@@ -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 {
|
||||||
|
|||||||
+51
-12
@@ -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)
|
||||||
|
|||||||
+63
-22
@@ -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
|
||||||
|
|||||||
+40
-12
@@ -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)
|
||||||
|
|||||||
+16
-16
@@ -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>()
|
||||||
|
|||||||
+60
@@ -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
|
||||||
|
|
||||||
|
|||||||
+12
-7
@@ -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") {
|
||||||
|
|||||||
Reference in New Issue
Block a user