@@ -29,12 +29,13 @@ private fun PropertyModel.toVal(): PropertyModel {
29
29
)
30
30
}
31
31
32
- private class VarOverrideResolver (
32
+ private class OverrideConflictResolver (
33
33
private val modelContext : ModelContext ,
34
34
private val inheritanceContext : InheritanceContext
35
35
) : ModelWithOwnerTypeLowering {
36
36
37
37
val propertiesToChangeToVal: MutableSet <NameEntity > = mutableSetOf ()
38
+ val propertiesToChangeType: MutableMap <NameEntity , TypeModel > = mutableMapOf ()
38
39
39
40
private fun findConflictingProperties (
40
41
parentMembers : Map <NameEntity ?, List <MemberData >>,
@@ -71,6 +72,25 @@ private class VarOverrideResolver(
71
72
return null
72
73
}
73
74
75
+ private fun processParentPropertiesNeededToChangeType (
76
+ member : PropertyModel ,
77
+ parentMembers : Map <NameEntity ?, List <MemberData >>,
78
+ typeChecker : OverrideTypeChecker
79
+ ) {
80
+ val parentProperty = parentMembers[member.name]?.firstOrNull { it.memberModel is PropertyModel }
81
+ if (parentProperty != null ) {
82
+ val parentType = (parentProperty.memberModel as PropertyModel ).type
83
+ val childType = member.type
84
+ val newType = parentType
85
+ .changeVarianceToMatchChild(childType, typeChecker)
86
+ .changeNullabilityToMatchChild(childType)
87
+ val fqName = parentProperty.fqName?.appendLeft(member.name)
88
+ if (newType != parentType && fqName != null ) {
89
+ propertiesToChangeType[fqName] = newType
90
+ }
91
+ }
92
+ }
93
+
74
94
private fun findSuperType (types : List <TypeModel >, typeChecker : OverrideTypeChecker ): TypeModel ? {
75
95
var superType: TypeModel ? = types[0 ]
76
96
types.forEach { type ->
@@ -109,7 +129,7 @@ private class VarOverrideResolver(
109
129
110
130
val propertiesToAdd = allConflictingProperties.mapNotNull { createPropertyToAdd(it, classLike) }
111
131
112
- return classLike.members.mapNotNull { member ->
132
+ return classLike.members.map { member ->
113
133
if (member is PropertyModel ) {
114
134
when {
115
135
allConflictingProperties.any { properties ->
@@ -143,14 +163,24 @@ private class VarOverrideResolver(
143
163
OverrideTypeChecker (modelContext, inheritanceContext, classLike, null )
144
164
)
145
165
146
- val varPropertiesWithSpecifiedType = classLike.members.filterIsInstance<PropertyModel >().mapNotNull {
166
+ val properties = classLike.members.filterIsInstance<PropertyModel >()
167
+
168
+ val varPropertiesWithSpecifiedType = properties.mapNotNull {
147
169
findVarPropertiesWithSpecifiedType(
148
170
it,
149
171
parentMembers,
150
172
OverrideTypeChecker (modelContext, inheritanceContext, classLike, null )
151
173
)
152
174
}
153
175
176
+ properties.forEach {
177
+ processParentPropertiesNeededToChangeType(
178
+ it,
179
+ parentMembers,
180
+ OverrideTypeChecker (modelContext, inheritanceContext, classLike, null )
181
+ )
182
+ }
183
+
154
184
(allConflictingProperties + listOf (varPropertiesWithSpecifiedType)).forEach { propertiesToChangeToVal + = it.mapNotNull { memberData ->
155
185
(memberData.memberModel as ? PropertyModel )?.let { property ->
156
186
memberData.fqName?.appendLeft(property.name)
@@ -167,17 +197,24 @@ private class VarOverrideResolver(
167
197
}
168
198
}
169
199
170
- private class VarToValResolver (private val propertiesToChangeToVal : Set <NameEntity >) : ModelWithOwnerTypeLowering {
200
+ private class ParentPropertyChanger (
201
+ private val propertiesToChangeToVal : Set <NameEntity >,
202
+ private val propertiesToChangeType : MutableMap <NameEntity , TypeModel >
203
+ ) : ModelWithOwnerTypeLowering {
171
204
172
205
private var currentFqName: NameEntity = IdentifierEntity (" " )
173
206
174
207
override fun lowerPropertyModel (ownerContext : NodeOwner <PropertyModel >): PropertyModel {
175
208
val property = ownerContext.node
209
+ val propertyFqName = currentFqName.appendLeft(property.name)
176
210
177
- return if (propertiesToChangeToVal.contains(currentFqName.appendLeft(property.name))) {
178
- property.toVal()
211
+ val newType = propertiesToChangeType[propertyFqName] ? : property.type
212
+ val newProperty = property.copy(type = newType)
213
+
214
+ return if (propertiesToChangeToVal.contains(propertyFqName)) {
215
+ newProperty.toVal()
179
216
} else {
180
- property
217
+ newProperty
181
218
}
182
219
}
183
220
@@ -197,22 +234,24 @@ private class VarToValResolver(private val propertiesToChangeToVal: Set<NameEnti
197
234
}
198
235
}
199
236
200
- class VarConflictResolveLowering : ModelLowering {
237
+ class OverrideConflictResolveLowering : ModelLowering {
201
238
202
239
override fun lower (source : SourceSetModel ): SourceSetModel {
203
240
val modelContext = ModelContext (source)
204
241
val inheritanceContext = InheritanceContext (modelContext.buildInheritanceGraph())
205
- val varOverrideResolver = VarOverrideResolver (modelContext, inheritanceContext)
242
+ val overrideConflictResolver = OverrideConflictResolver (modelContext, inheritanceContext)
206
243
val newSourceSet = source.copy(
207
244
sources = source.sources.map {
208
- it.copy(root = varOverrideResolver .lowerRoot(it.root, NodeOwner (it.root, null )))
245
+ it.copy(root = overrideConflictResolver .lowerRoot(it.root, NodeOwner (it.root, null )))
209
246
}
210
247
)
211
- val varToValResolver =
212
- VarToValResolver (varOverrideResolver.propertiesToChangeToVal)
248
+ val parentPropertyChanger = ParentPropertyChanger (
249
+ overrideConflictResolver.propertiesToChangeToVal,
250
+ overrideConflictResolver.propertiesToChangeType
251
+ )
213
252
return newSourceSet.copy(
214
253
sources = newSourceSet.sources.map {
215
- it.copy(root = varToValResolver .lowerRoot(it.root, NodeOwner (it.root, null )))
254
+ it.copy(root = parentPropertyChanger .lowerRoot(it.root, NodeOwner (it.root, null )))
216
255
}
217
256
)
218
257
}
0 commit comments