[fir] move mutable/base collection pair map do StandardClassIds to further reuse it

This commit is contained in:
Ilya Kirillov
2022-10-18 14:21:56 +02:00
parent 725ae1fc65
commit ed1751bbc6
2 changed files with 21 additions and 16 deletions
@@ -6,24 +6,13 @@
package org.jetbrains.kotlin.fir.types
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.StandardClassIds
import org.jetbrains.kotlin.name.StandardClassIds.Collections.baseCollectionToMutableEquivalent
import org.jetbrains.kotlin.name.StandardClassIds.Collections.mutableCollectionToBaseCollection
object ConeFlexibleTypeBoundsChecker {
private val baseTypesToMutableEquivalent = mapOf(
StandardClassIds.Iterable to StandardClassIds.MutableIterable,
StandardClassIds.Iterator to StandardClassIds.MutableIterator,
StandardClassIds.ListIterator to StandardClassIds.MutableListIterator,
StandardClassIds.List to StandardClassIds.MutableList,
StandardClassIds.Collection to StandardClassIds.MutableCollection,
StandardClassIds.Set to StandardClassIds.MutableSet,
StandardClassIds.Map to StandardClassIds.MutableMap,
StandardClassIds.MapEntry to StandardClassIds.MutableMapEntry
)
private val mutableToBaseMap = baseTypesToMutableEquivalent.entries.associateBy({ it.value }) { it.key }
fun areTypesMayBeLowerAndUpperBoundsOfSameFlexibleTypeByMutability(a: ConeKotlinType, b: ConeKotlinType): Boolean {
val classId = a.classId ?: return false
val possiblePairBound = (baseTypesToMutableEquivalent[classId] ?: mutableToBaseMap[classId]) ?: return false
val possiblePairBound = (baseCollectionToMutableEquivalent[classId] ?: mutableCollectionToBaseCollection[classId]) ?: return false
return possiblePairBound == b.classId
}
@@ -32,8 +21,8 @@ object ConeFlexibleTypeBoundsChecker {
fun getBaseBoundFqNameByMutability(a: ConeKotlinType): ClassId? {
val classId = a.classId ?: return null
if (classId in baseTypesToMutableEquivalent) return classId
if (classId in baseCollectionToMutableEquivalent) return classId
return mutableToBaseMap[classId]
return mutableCollectionToBaseCollection[classId]
}
}
@@ -207,6 +207,22 @@ object StandardClassIds {
object Java {
val Record = "Record".javaLangId()
}
object Collections {
val baseCollectionToMutableEquivalent: Map<ClassId, ClassId> = mapOf(
StandardClassIds.Iterable to StandardClassIds.MutableIterable,
StandardClassIds.Iterator to StandardClassIds.MutableIterator,
StandardClassIds.ListIterator to StandardClassIds.MutableListIterator,
StandardClassIds.List to StandardClassIds.MutableList,
StandardClassIds.Collection to StandardClassIds.MutableCollection,
StandardClassIds.Set to StandardClassIds.MutableSet,
StandardClassIds.Map to StandardClassIds.MutableMap,
StandardClassIds.MapEntry to StandardClassIds.MutableMapEntry
)
val mutableCollectionToBaseCollection: Map<ClassId, ClassId> =
baseCollectionToMutableEquivalent.entries.associateBy({ it.value }) { it.key }
}
}
private fun String.baseId() = ClassId(StandardClassIds.BASE_KOTLIN_PACKAGE, Name.identifier(this))