Refactor RangeCodegenUtil: introduce isTopLevelExtensionOnType

This commit is contained in:
Dmitry Petrov
2018-01-19 11:36:04 +03:00
parent fb487b31ba
commit e07e9c0ea5
@@ -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) ||