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( private class CallWithConvertedArguments(
original: Call, original: Call,
val callArgumentMapToConvert: Map<KtValueArgument, KtCallExpression> callArgumentMapToConvert: Map<KtValueArgument, KtCallExpression>,
) : DelegatingCall(original) { ) : DelegatingCall(original) {
private val newArguments: List<ValueArgument> private val newArguments: List<ValueArgument>
@@ -166,26 +166,19 @@ class RedundantSamConstructorInspection : AbstractKotlinInspection() {
fun samConstructorCallsToBeConverted(functionCall: KtCallExpression): Collection<KtCallExpression> { fun samConstructorCallsToBeConverted(functionCall: KtCallExpression): Collection<KtCallExpression> {
val valueArguments = functionCall.valueArguments val valueArguments = functionCall.valueArguments
if (valueArguments.all { !canBeSamConstructorCall(it) }) { if (valueArguments.none { canBeSamConstructorCall(it) }) return emptyList()
return emptyList()
}
val bindingContext = functionCall.analyze(BodyResolveMode.PARTIAL) val bindingContext = functionCall.analyze(BodyResolveMode.PARTIAL)
val functionResolvedCall = functionCall.getResolvedCall(bindingContext) ?: return emptyList() val functionResolvedCall = functionCall.getResolvedCall(bindingContext) ?: return emptyList()
if (!functionResolvedCall.isReallySuccess()) 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 call.getResolvedCall(bindingContext)?.resultingDescriptor?.original is SamConstructorDescriptor
} }
if (samConstructorCallArgumentMap.isEmpty()) return emptyList() if (samConstructorCallArgumentMap.isEmpty()) return emptyList()
if (samConstructorCallArgumentMap.values.any { if (samConstructorCallArgumentMap.values.any(::containsLabeledReturnPreventingConversion)) return emptyList()
val samValueArgument = it.samConstructorValueArgument()
val samConstructorName = (it.calleeExpression as? KtSimpleNameExpression)?.getReferencedNameAsName()
samValueArgument == null || samConstructorName == null ||
samValueArgument.hasLabeledReturnPreventingConversion(samConstructorName)
}) return emptyList()
val originalFunctionDescriptor = functionResolvedCall.resultingDescriptor.original as? FunctionDescriptor ?: return emptyList() val originalFunctionDescriptor = functionResolvedCall.resultingDescriptor.original as? FunctionDescriptor ?: return emptyList()
val containingClass = originalFunctionDescriptor.containingDeclaration as? ClassDescriptor ?: return emptyList() val containingClass = originalFunctionDescriptor.containingDeclaration as? ClassDescriptor ?: return emptyList()
@@ -250,6 +243,14 @@ class RedundantSamConstructorInspection : AbstractKotlinInspection() {
return parametersWithSamTypeCount == samConstructorsCount 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) = private fun KtValueArgument.hasLabeledReturnPreventingConversion(samConstructorName: Name) =
anyDescendantOfType<KtReturnExpression> { it.getLabelNameAsName() == samConstructorName } anyDescendantOfType<KtReturnExpression> { it.getLabelNameAsName() == samConstructorName }
} }