Refactor RangeCodegenUtil: introduce isTopLevelExtensionOnType
This commit is contained in:
@@ -98,65 +98,53 @@ fun isPrimitiveNumberRangeTo(rangeTo: CallableDescriptor) =
|
|||||||
"rangeTo" == rangeTo.name.asString() && isPrimitiveNumberClassDescriptor(rangeTo.containingDeclaration) ||
|
"rangeTo" == rangeTo.name.asString() && isPrimitiveNumberClassDescriptor(rangeTo.containingDeclaration) ||
|
||||||
isPrimitiveRangeToExtension(rangeTo)
|
isPrimitiveRangeToExtension(rangeTo)
|
||||||
|
|
||||||
private fun isPrimitiveRangeToExtension(descriptor: CallableDescriptor): Boolean {
|
private inline fun CallableDescriptor.isTopLevelExtensionOnType(
|
||||||
if (!isTopLevelInPackage(descriptor, "rangeTo", "kotlin.ranges")) return false
|
name: String,
|
||||||
|
packageFQN: String,
|
||||||
val extensionReceiver = descriptor.extensionReceiverParameter ?: return false
|
receiverTypePredicate: (KotlinType) -> Boolean
|
||||||
return KotlinBuiltIns.isPrimitiveType(extensionReceiver.type)
|
): Boolean {
|
||||||
|
if (!isTopLevelInPackage(this, name, packageFQN)) return false
|
||||||
|
val extensionReceiverType = original.extensionReceiverParameter?.type ?: return false
|
||||||
|
return receiverTypePredicate(extensionReceiverType)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun isPrimitiveNumberDownTo(descriptor: CallableDescriptor): Boolean {
|
private fun isPrimitiveRangeToExtension(descriptor: CallableDescriptor) =
|
||||||
if (!isTopLevelInPackage(descriptor, "downTo", "kotlin.ranges")) return false
|
descriptor.isTopLevelExtensionOnType("rangeTo", "kotlin.ranges") {
|
||||||
|
KotlinBuiltIns.isPrimitiveType(it)
|
||||||
|
}
|
||||||
|
|
||||||
val extensionReceiver = descriptor.extensionReceiverParameter ?: return false
|
fun isPrimitiveNumberDownTo(descriptor: CallableDescriptor) =
|
||||||
val extensionReceiverClassifier = extensionReceiver.type.constructor.declarationDescriptor
|
descriptor.isTopLevelExtensionOnType("downTo", "kotlin.ranges") {
|
||||||
return isPrimitiveNumberClassDescriptor(extensionReceiverClassifier)
|
isPrimitiveNumberClassDescriptor(it.constructor.declarationDescriptor)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun isPrimitiveNumberUntil(descriptor: CallableDescriptor): Boolean {
|
fun isPrimitiveNumberUntil(descriptor: CallableDescriptor) =
|
||||||
if (!isTopLevelInPackage(descriptor, "until", "kotlin.ranges")) return false
|
descriptor.isTopLevelExtensionOnType("until", "kotlin.ranges") {
|
||||||
|
isPrimitiveNumberClassDescriptor(it.constructor.declarationDescriptor)
|
||||||
|
}
|
||||||
|
|
||||||
val extensionReceiver = descriptor.extensionReceiverParameter ?: return false
|
fun isArrayOrPrimitiveArrayIndices(descriptor: CallableDescriptor) =
|
||||||
val extensionReceiverClassifier = extensionReceiver.type.constructor.declarationDescriptor
|
descriptor.isTopLevelExtensionOnType("indices", "kotlin.collections") {
|
||||||
return isPrimitiveNumberClassDescriptor(extensionReceiverClassifier)
|
KotlinBuiltIns.isArray(it) || KotlinBuiltIns.isPrimitiveArray(it)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun isArrayOrPrimitiveArrayIndices(descriptor: CallableDescriptor): Boolean {
|
fun isCollectionIndices(descriptor: CallableDescriptor) =
|
||||||
if (!isTopLevelInPackage(descriptor, "indices", "kotlin.collections")) return false
|
descriptor.isTopLevelExtensionOnType("indices", "kotlin.collections") {
|
||||||
|
KotlinBuiltIns.isCollectionOrNullableCollection(it)
|
||||||
|
}
|
||||||
|
|
||||||
val extensionReceiver = descriptor.extensionReceiverParameter ?: return false
|
fun isCharSequenceIndices(descriptor: CallableDescriptor) =
|
||||||
val extensionReceiverType = extensionReceiver.type
|
descriptor.isTopLevelExtensionOnType("indices", "kotlin.text") {
|
||||||
return KotlinBuiltIns.isArray(extensionReceiverType) || KotlinBuiltIns.isPrimitiveArray(extensionReceiverType)
|
KotlinBuiltIns.isCharSequenceOrNullableCharSequence(it)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun isCollectionIndices(descriptor: CallableDescriptor): Boolean {
|
fun isComparableRangeTo(descriptor: CallableDescriptor) =
|
||||||
if (!isTopLevelInPackage(descriptor, "indices", "kotlin.collections")) return false
|
descriptor.isTopLevelExtensionOnType("rangeTo", "kotlin.ranges") {
|
||||||
|
val extensionReceiverTypeDescriptor = it.constructor.declarationDescriptor as? TypeParameterDescriptor ?: return false
|
||||||
val extensionReceiver = descriptor.extensionReceiverParameter ?: return false
|
val upperBoundType = extensionReceiverTypeDescriptor.upperBounds.singleOrNull() ?: return false
|
||||||
val extensionReceiverType = extensionReceiver.type
|
val upperBoundClassDescriptor = upperBoundType.constructor.declarationDescriptor as? ClassDescriptor ?: return false
|
||||||
return KotlinBuiltIns.isCollectionOrNullableCollection(extensionReceiverType)
|
isTopLevelInPackage(upperBoundClassDescriptor, "Comparable", "kotlin")
|
||||||
}
|
}
|
||||||
|
|
||||||
fun isCharSequenceIndices(descriptor: CallableDescriptor): Boolean {
|
|
||||||
if (!isTopLevelInPackage(descriptor, "indices", "kotlin.text")) return false
|
|
||||||
|
|
||||||
val extensionReceiver = descriptor.extensionReceiverParameter ?: return false
|
|
||||||
val extensionReceiverType = extensionReceiver.type
|
|
||||||
return KotlinBuiltIns.isCharSequenceOrNullableCharSequence(extensionReceiverType)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun isComparableRangeTo(descriptor: CallableDescriptor): Boolean {
|
|
||||||
if (!isTopLevelInPackage(descriptor, "rangeTo", "kotlin.ranges")) return false
|
|
||||||
|
|
||||||
val extensionReceiver = descriptor.original.extensionReceiverParameter ?: return false
|
|
||||||
val extensionReceiverTypeDescriptor =
|
|
||||||
extensionReceiver.type.constructor.declarationDescriptor as? TypeParameterDescriptor ?: return false
|
|
||||||
val upperBoundType = extensionReceiverTypeDescriptor.upperBounds.singleOrNull() ?: return false
|
|
||||||
val upperBoundClassDescriptor = upperBoundType.constructor.declarationDescriptor as? ClassDescriptor ?: return false
|
|
||||||
if (!isTopLevelInPackage(upperBoundClassDescriptor, "Comparable", "kotlin")) return false
|
|
||||||
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
fun isClosedRangeContains(descriptor: CallableDescriptor): Boolean {
|
fun isClosedRangeContains(descriptor: CallableDescriptor): Boolean {
|
||||||
if (descriptor.name.asString() != "contains") return false
|
if (descriptor.name.asString() != "contains") return false
|
||||||
@@ -188,13 +176,10 @@ fun isPrimitiveNumberRangeExtensionContainsPrimitiveNumber(descriptor: CallableD
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
fun isPrimitiveProgressionReverse(descriptor: CallableDescriptor): Boolean {
|
fun isPrimitiveProgressionReverse(descriptor: CallableDescriptor) =
|
||||||
if (!isTopLevelInPackage(descriptor, "reversed", "kotlin.ranges")) return false
|
descriptor.isTopLevelExtensionOnType("reversed", "kotlin.ranges") {
|
||||||
if (descriptor.valueParameters.isNotEmpty()) return false
|
isPrimitiveProgression(it)
|
||||||
val extensionReceiverType = descriptor.extensionReceiverParameter?.type ?: return false
|
}
|
||||||
if (!isPrimitiveProgression(extensionReceiverType)) return false
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun isPrimitiveNumberType(type: KotlinType) =
|
private fun isPrimitiveNumberType(type: KotlinType) =
|
||||||
KotlinBuiltIns.isByte(type) ||
|
KotlinBuiltIns.isByte(type) ||
|
||||||
|
|||||||
Reference in New Issue
Block a user