Skip to content

Commit

Permalink
Move guard clause helpers to detekt-rules-style
Browse files Browse the repository at this point in the history
These are only used in two rules and have limited utility elsewhere
  • Loading branch information
3flex committed May 19, 2024
1 parent 1b00a0c commit d2754f2
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 52 deletions.
6 changes: 0 additions & 6 deletions detekt-psi-utils/api/detekt-psi-utils.api
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,6 @@ public final class io/gitlab/arturbosch/detekt/rules/AllowedExceptionNamePattern
public static final fun isAllowedExceptionName (Lorg/jetbrains/kotlin/psi/KtCatchClause;Lkotlin/text/Regex;)Z
}

public final class io/gitlab/arturbosch/detekt/rules/GuardClausesKt {
public static final fun isElvisOperatorGuardClause (Lorg/jetbrains/kotlin/psi/KtExpression;Lorg/jetbrains/kotlin/psi/KtExpression;)Z
public static final fun isIfConditionGuardClause (Lorg/jetbrains/kotlin/psi/KtExpression;Lorg/jetbrains/kotlin/psi/KtExpression;)Z
public static final fun isSuperCall (Lorg/jetbrains/kotlin/psi/KtExpression;)Z
}

public final class io/gitlab/arturbosch/detekt/rules/IdentifierNameKt {
public static final fun identifierName (Lorg/jetbrains/kotlin/psi/KtNamedDeclaration;)Ljava/lang/String;
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,19 @@ package io.gitlab.arturbosch.detekt.rules.style

import org.jetbrains.kotlin.com.intellij.openapi.util.TextRange
import org.jetbrains.kotlin.com.intellij.psi.PsiElement
import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi.KtBinaryExpression
import org.jetbrains.kotlin.psi.KtDotQualifiedExpression
import org.jetbrains.kotlin.psi.KtExpression
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtIfExpression
import org.jetbrains.kotlin.psi.KtNamedFunction
import org.jetbrains.kotlin.psi.KtSuperExpression
import org.jetbrains.kotlin.psi.psiUtil.anyDescendantOfType
import org.jetbrains.kotlin.psi.psiUtil.elementsInRange
import org.jetbrains.kotlin.psi.psiUtil.findDescendantOfType
import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType
import org.jetbrains.kotlin.psi.psiUtil.lastBlockStatementOrThis

/**
* Util function to search for the [KtElement]s in the parents of
Expand All @@ -17,3 +26,34 @@ internal fun findKtElementInParents(file: KtFile, offset: Int, line: String): Se
.plus(file.findElementAt(offset))
.mapNotNull { it?.getNonStrictParentOfType() }
}

inline fun <reified T : KtExpression> KtNamedFunction.yieldStatementsSkippingGuardClauses(): Sequence<KtExpression> =
sequence {
var firstNonGuardFound = false
this@yieldStatementsSkippingGuardClauses.bodyBlockExpression?.statements?.forEach {
if (firstNonGuardFound) {
yield(it)
} else if (!it.isGuardClause<T>() && !it.isSuperCall()) {
firstNonGuardFound = true
yield(it)
}
}
}

fun KtExpression.isSuperCall(): Boolean {
return (this as? KtDotQualifiedExpression)?.receiverExpression is KtSuperExpression
}

inline fun <reified T : KtExpression> KtExpression.isGuardClause(): Boolean {
val descendantExpr = this.findDescendantOfType<T>() ?: return false
return this.isIfConditionGuardClause(descendantExpr) || this.isElvisOperatorGuardClause(descendantExpr)
}

fun <T : KtExpression> KtExpression.isIfConditionGuardClause(descendantExpr: T): Boolean {
val ifExpr = this as? KtIfExpression ?: return false
return ifExpr.`else` == null &&
descendantExpr === ifExpr.then?.lastBlockStatementOrThis()
}

fun <T : KtExpression> KtExpression.isElvisOperatorGuardClause(descendantExpr: T): Boolean =
this.anyDescendantOfType<KtBinaryExpression> { it.operationToken == KtTokens.ELVIS && it.right == descendantExpr }
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import io.gitlab.arturbosch.detekt.api.Entity
import io.gitlab.arturbosch.detekt.api.Rule
import io.gitlab.arturbosch.detekt.api.config
import io.gitlab.arturbosch.detekt.api.simplePatternToRegex
import io.gitlab.arturbosch.detekt.rules.yieldStatementsSkippingGuardClauses
import org.jetbrains.kotlin.psi.KtLambdaExpression
import org.jetbrains.kotlin.psi.KtNamedFunction
import org.jetbrains.kotlin.psi.KtReturnExpression
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import io.gitlab.arturbosch.detekt.api.Configuration
import io.gitlab.arturbosch.detekt.api.Entity
import io.gitlab.arturbosch.detekt.api.Rule
import io.gitlab.arturbosch.detekt.api.config
import io.gitlab.arturbosch.detekt.rules.yieldStatementsSkippingGuardClauses
import org.jetbrains.kotlin.psi.KtNamedFunction
import org.jetbrains.kotlin.psi.KtThrowExpression
import org.jetbrains.kotlin.psi.psiUtil.collectDescendantsOfType
Expand Down

0 comments on commit d2754f2

Please sign in to comment.