Refactor RedundantSamConstructorInspection
- Does not change the behaviour
This commit is contained in:
committed by
Roman Golyshev
parent
3122760c49
commit
9b5110b9f3
+12
-11
@@ -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 }
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user