Refactor RedundantSamConstructorInspection

- Does not change the behaviour
This commit is contained in:
Roman Golyshev
2020-02-07 12:51:21 +03:00
committed by Roman Golyshev
parent 3122760c49
commit 9b5110b9f3
@@ -148,7 +148,7 @@ class RedundantSamConstructorInspection : AbstractKotlinInspection() {
private class CallWithConvertedArguments(
original: Call,
val callArgumentMapToConvert: Map<KtValueArgument, KtCallExpression>
callArgumentMapToConvert: Map<KtValueArgument, KtCallExpression>,
) : DelegatingCall(original) {
private val newArguments: List<ValueArgument>
@@ -166,26 +166,19 @@ class RedundantSamConstructorInspection : AbstractKotlinInspection() {
fun samConstructorCallsToBeConverted(functionCall: KtCallExpression): Collection<KtCallExpression> {
val valueArguments = functionCall.valueArguments
if (valueArguments.all { !canBeSamConstructorCall(it) }) {
return emptyList()
}
if (valueArguments.none { canBeSamConstructorCall(it) }) return emptyList()
val bindingContext = functionCall.analyze(BodyResolveMode.PARTIAL)
val functionResolvedCall = functionCall.getResolvedCall(bindingContext) ?: return emptyList()
if (!functionResolvedCall.isReallySuccess()) return emptyList()
val samConstructorCallArgumentMap = valueArguments.keysToMapExceptNulls { it.toCallExpression() }.filter { (_, call) ->
val samConstructorCallArgumentMap = valueArguments.keysToMapExceptNulls { it.toCallExpression() }.filterValues { call ->
call.getResolvedCall(bindingContext)?.resultingDescriptor?.original is SamConstructorDescriptor
}
if (samConstructorCallArgumentMap.isEmpty()) return emptyList()
if (samConstructorCallArgumentMap.values.any {
val samValueArgument = it.samConstructorValueArgument()
val samConstructorName = (it.calleeExpression as? KtSimpleNameExpression)?.getReferencedNameAsName()
samValueArgument == null || samConstructorName == null ||
samValueArgument.hasLabeledReturnPreventingConversion(samConstructorName)
}) return emptyList()
if (samConstructorCallArgumentMap.values.any(::containsLabeledReturnPreventingConversion)) return emptyList()
val originalFunctionDescriptor = functionResolvedCall.resultingDescriptor.original as? FunctionDescriptor ?: return emptyList()
val containingClass = originalFunctionDescriptor.containingDeclaration as? ClassDescriptor ?: return emptyList()
@@ -250,6 +243,14 @@ class RedundantSamConstructorInspection : AbstractKotlinInspection() {
return parametersWithSamTypeCount == samConstructorsCount
}
private fun containsLabeledReturnPreventingConversion(it: KtCallExpression): Boolean {
val samValueArgument = it.samConstructorValueArgument()
val samConstructorName = (it.calleeExpression as? KtSimpleNameExpression)?.getReferencedNameAsName()
return samValueArgument == null ||
samConstructorName == null ||
samValueArgument.hasLabeledReturnPreventingConversion(samConstructorName)
}
private fun KtValueArgument.hasLabeledReturnPreventingConversion(samConstructorName: Name) =
anyDescendantOfType<KtReturnExpression> { it.getLabelNameAsName() == samConstructorName }
}