Skip to content

Commit

Permalink
Fix issue by finding the all name ref for a var
Browse files Browse the repository at this point in the history
Fix violations
Add PR TC
  • Loading branch information
atulgpt committed Mar 25, 2023
1 parent 56f4987 commit 5df2c49
Show file tree
Hide file tree
Showing 2 changed files with 233 additions and 169 deletions.
Expand Up @@ -17,6 +17,8 @@ import io.gitlab.arturbosch.detekt.rules.isOverride
import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
import org.jetbrains.kotlin.js.translate.callTranslator.getReturnType
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.KtBinaryExpression
Expand Down Expand Up @@ -231,13 +233,22 @@ class CanBeNonNullable(config: Config = Config.empty) : Rule(config) {
}

override fun visitWhenExpression(expression: KtWhenExpression) {
val subjectDescriptor = expression.subjectExpression
?.let { it as? KtNameReferenceExpression }
?.getResolvedCall(bindingContext)
?.resultingDescriptor
val nullCheckedDescriptor =
(expression.subjectExpression?.collectDescendantsOfType<KtNameReferenceExpression>() ?: emptyList())

Check warning

Code scanning / detekt

Use `orEmpty()` call instead of `?:` with empty collection factory methods Warning

This '?: emptyList()' can be replaced with 'orEmpty()' call
.mapNotNull {
val callDescriptor =
it.getResolvedCall(bindingContext)
val valueParameterDescriptor =
callDescriptor?.resultingDescriptor as? ValueParameterDescriptor
if (valueParameterDescriptor != null && callDescriptor.getReturnType().isNullable()) {
valueParameterDescriptor
} else {
null
}
}
val whenConditions = expression.entries.flatMap { it.conditions.asList() }
if (subjectDescriptor != null) {
whenConditions.evaluateSubjectWhenExpression(expression, subjectDescriptor)
if (nullCheckedDescriptor.isNotEmpty()) {
whenConditions.evaluateSubjectWhenExpression(expression, nullCheckedDescriptor)
} else {
whenConditions.forEach { whenCondition ->
if (whenCondition is KtWhenConditionWithExpression) {
Expand Down Expand Up @@ -342,7 +353,9 @@ class CanBeNonNullable(config: Config = Config.empty) : Rule(config) {
} else {
{ nullableParam -> nullableParam.isNonNullChecked = true }
}
nonNullChecks.forEach { nullableParams[it]?.let(nullableParamCallback) }
nonNullChecks.forEach {
nullableParams[it]?.let(nullableParamCallback)
}
}
}

Expand Down Expand Up @@ -389,7 +402,7 @@ class CanBeNonNullable(config: Config = Config.empty) : Rule(config) {

private fun List<KtWhenCondition>.evaluateSubjectWhenExpression(
expression: KtWhenExpression,
subjectDescriptor: CallableDescriptor
subjectDescriptor: List<CallableDescriptor>,
) {
var isNonNullChecked = false
var isNullChecked = false
Expand All @@ -416,9 +429,11 @@ class CanBeNonNullable(config: Config = Config.empty) : Rule(config) {
isNullChecked = true
}
}
nullableParams[subjectDescriptor]?.let {
if (isNullChecked) it.isNullChecked = true
if (isNonNullChecked) it.isNonNullChecked = true
subjectDescriptor.forEach {
nullableParams[it]?.let {
if (isNullChecked) it.isNullChecked = true
if (isNonNullChecked) it.isNonNullChecked = true
}

Check warning

Code scanning / detekt

Disallow shadowing variable declarations. Warning

Name shadowed: implicit lambda parameter 'it'
}
}

Expand Down

0 comments on commit 5df2c49

Please sign in to comment.