diff --git a/detekt-rules-complexity/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/complexity/NamedArguments.kt b/detekt-rules-complexity/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/complexity/NamedArguments.kt index 2fc021d9fe26..05b42da65e0f 100644 --- a/detekt-rules-complexity/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/complexity/NamedArguments.kt +++ b/detekt-rules-complexity/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/complexity/NamedArguments.kt @@ -11,6 +11,7 @@ import io.gitlab.arturbosch.detekt.api.config import io.gitlab.arturbosch.detekt.api.internal.Configuration import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution import org.jetbrains.kotlin.psi.KtCallExpression +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtLambdaArgument import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.calls.util.getParameterForArgument @@ -48,8 +49,9 @@ class NamedArguments(config: Config = Config.empty) : Rule(config) { @Configuration("ignores when argument values are the same as the parameter names") private val ignoreArgumentsMatchingNames: Boolean by config(defaultValue = false) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitCallExpression(expression: KtCallExpression) { - if (bindingContext == BindingContext.EMPTY) return val valueArguments = expression.valueArguments.filterNot { it is KtLambdaArgument } if (valueArguments.size > threshold && expression.canNameArguments()) { val message = "This function call has ${valueArguments.size} arguments. To call a function with more " + diff --git a/detekt-rules-complexity/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/complexity/NestedScopeFunctions.kt b/detekt-rules-complexity/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/complexity/NestedScopeFunctions.kt index 81a0dc39d7f6..2d4dc7bd9137 100644 --- a/detekt-rules-complexity/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/complexity/NestedScopeFunctions.kt +++ b/detekt-rules-complexity/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/complexity/NestedScopeFunctions.kt @@ -15,6 +15,7 @@ import io.gitlab.arturbosch.detekt.api.internal.Configuration import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.psi.KtCallExpression +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall @@ -65,8 +66,9 @@ class NestedScopeFunctions(config: Config = Config.empty) : Rule(config) { it.toSet().map(FunctionMatcher::fromFunctionSignature) } + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitNamedFunction(function: KtNamedFunction) { - if (bindingContext == BindingContext.EMPTY) return function.accept(FunctionDepthVisitor()) } diff --git a/detekt-rules-complexity/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/complexity/ReplaceSafeCallChainWithRun.kt b/detekt-rules-complexity/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/complexity/ReplaceSafeCallChainWithRun.kt index 4d0209811e40..16246a726618 100644 --- a/detekt-rules-complexity/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/complexity/ReplaceSafeCallChainWithRun.kt +++ b/detekt-rules-complexity/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/complexity/ReplaceSafeCallChainWithRun.kt @@ -8,6 +8,7 @@ import io.gitlab.arturbosch.detekt.api.Issue import io.gitlab.arturbosch.detekt.api.Rule import io.gitlab.arturbosch.detekt.api.Severity import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtSafeQualifiedExpression import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall @@ -49,11 +50,11 @@ class ReplaceSafeCallChainWithRun(config: Config = Config.empty) : Rule(config) Debt.TEN_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitSafeQualifiedExpression(expression: KtSafeQualifiedExpression) { super.visitSafeQualifiedExpression(expression) - if (bindingContext == BindingContext.EMPTY) return - /* We want the last safe qualified expression in the chain, so if there are more in this chain then there's no need to run checks on this one */ if (expression.parent is KtSafeQualifiedExpression) return diff --git a/detekt-rules-coroutines/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/coroutines/InjectDispatcher.kt b/detekt-rules-coroutines/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/coroutines/InjectDispatcher.kt index a3453a61c1f6..f0a4f5563df5 100644 --- a/detekt-rules-coroutines/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/coroutines/InjectDispatcher.kt +++ b/detekt-rules-coroutines/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/coroutines/InjectDispatcher.kt @@ -13,10 +13,11 @@ import io.gitlab.arturbosch.detekt.api.internal.Configuration import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution import io.gitlab.arturbosch.detekt.rules.fqNameOrNull import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtParameter import org.jetbrains.kotlin.psi.KtSimpleNameExpression import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType -import org.jetbrains.kotlin.resolve.BindingContext.EMPTY +import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.calls.util.getType import org.jetbrains.kotlin.types.typeUtil.supertypes @@ -54,9 +55,11 @@ class InjectDispatcher(config: Config) : Rule(config) { Debt.FIVE_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitSimpleNameExpression(expression: KtSimpleNameExpression) { super.visitSimpleNameExpression(expression) - if (bindingContext == EMPTY || expression.getReferencedName() !in dispatcherNames) return + if (expression.getReferencedName() !in dispatcherNames) return val type = expression.getType(bindingContext) ?: return val isCoroutineDispatcher = type.fqNameOrNull() == COROUTINE_DISPATCHER_FQCN || type.supertypes().any { it.fqNameOrNull() == COROUTINE_DISPATCHER_FQCN } diff --git a/detekt-rules-coroutines/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/coroutines/RedundantSuspendModifier.kt b/detekt-rules-coroutines/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/coroutines/RedundantSuspendModifier.kt index 0005021245cc..dc066dc9896a 100644 --- a/detekt-rules-coroutines/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/coroutines/RedundantSuspendModifier.kt +++ b/detekt-rules-coroutines/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/coroutines/RedundantSuspendModifier.kt @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.descriptors.accessors import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtCallExpression import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtForExpression import org.jetbrains.kotlin.psi.KtNameReferenceExpression import org.jetbrains.kotlin.psi.KtNamedFunction @@ -65,8 +66,9 @@ class RedundantSuspendModifier(config: Config) : Rule(config) { Debt.FIVE_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitNamedFunction(function: KtNamedFunction) { - if (bindingContext == BindingContext.EMPTY) return val suspendModifier = function.modifierList?.getModifier(KtTokens.SUSPEND_KEYWORD) ?: return if (!function.hasBody()) return if (function.hasModifier(KtTokens.OVERRIDE_KEYWORD)) return diff --git a/detekt-rules-coroutines/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/coroutines/SleepInsteadOfDelay.kt b/detekt-rules-coroutines/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/coroutines/SleepInsteadOfDelay.kt index de15f72bcf25..b1b060d412eb 100644 --- a/detekt-rules-coroutines/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/coroutines/SleepInsteadOfDelay.kt +++ b/detekt-rules-coroutines/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/coroutines/SleepInsteadOfDelay.kt @@ -12,6 +12,7 @@ import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution import org.jetbrains.kotlin.com.intellij.psi.PsiElement import org.jetbrains.kotlin.psi.KtCallExpression import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.KtQualifiedExpression import org.jetbrains.kotlin.psi.psiUtil.forEachDescendantOfType @@ -49,8 +50,9 @@ class SleepInsteadOfDelay(config: Config = Config.empty) : Rule(config) { Debt.FIVE_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitNamedFunction(function: KtNamedFunction) { - if (bindingContext == BindingContext.EMPTY) return if (function.modifierList?.hasSuspendModifier() == true) { function.checkDescendants(SUSPEND_FUN_MESSAGE) } diff --git a/detekt-rules-coroutines/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/coroutines/SuspendFunWithCoroutineScopeReceiver.kt b/detekt-rules-coroutines/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/coroutines/SuspendFunWithCoroutineScopeReceiver.kt index 5b18e5837560..d51430606ed8 100644 --- a/detekt-rules-coroutines/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/coroutines/SuspendFunWithCoroutineScopeReceiver.kt +++ b/detekt-rules-coroutines/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/coroutines/SuspendFunWithCoroutineScopeReceiver.kt @@ -10,6 +10,7 @@ import io.gitlab.arturbosch.detekt.api.Severity import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution import io.gitlab.arturbosch.detekt.rules.fqNameOrNull import org.jetbrains.kotlin.lexer.KtTokens +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.types.KotlinType @@ -59,8 +60,9 @@ class SuspendFunWithCoroutineScopeReceiver(config: Config) : Rule(config) { debt = Debt.TEN_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitNamedFunction(function: KtNamedFunction) { - if (bindingContext == BindingContext.EMPTY) return checkReceiver(function) } diff --git a/detekt-rules-coroutines/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/coroutines/SuspendFunWithFlowReturnType.kt b/detekt-rules-coroutines/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/coroutines/SuspendFunWithFlowReturnType.kt index 45b5688cda5d..e7b9aeb29c89 100644 --- a/detekt-rules-coroutines/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/coroutines/SuspendFunWithFlowReturnType.kt +++ b/detekt-rules-coroutines/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/coroutines/SuspendFunWithFlowReturnType.kt @@ -11,6 +11,7 @@ import io.gitlab.arturbosch.detekt.api.internal.ActiveByDefault import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution import io.gitlab.arturbosch.detekt.rules.fqNameOrNull import org.jetbrains.kotlin.lexer.KtTokens +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.types.KotlinType @@ -72,8 +73,9 @@ class SuspendFunWithFlowReturnType(config: Config) : Rule(config) { debt = Debt.TEN_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitNamedFunction(function: KtNamedFunction) { - if (bindingContext == BindingContext.EMPTY) return val suspendModifier = function.modifierList?.getModifier(KtTokens.SUSPEND_KEYWORD) ?: return bindingContext[BindingContext.FUNCTION, function] ?.returnType diff --git a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/AvoidReferentialEquality.kt b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/AvoidReferentialEquality.kt index a86219142649..f7707bdc952f 100644 --- a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/AvoidReferentialEquality.kt +++ b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/AvoidReferentialEquality.kt @@ -16,6 +16,7 @@ import io.gitlab.arturbosch.detekt.rules.fqNameOrNull import org.jetbrains.kotlin.lexer.KtTokens.EQEQEQ import org.jetbrains.kotlin.lexer.KtTokens.EXCLEQEQEQ import org.jetbrains.kotlin.psi.KtBinaryExpression +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.calls.util.getType @@ -56,13 +57,14 @@ class AvoidReferentialEquality(config: Config) : Rule(config) { ) ) { it.map(SimpleGlob::of) } + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitBinaryExpression(expression: KtBinaryExpression) { super.visitBinaryExpression(expression) checkBinaryExpression(expression) } private fun checkBinaryExpression(expression: KtBinaryExpression) { - if (bindingContext == BindingContext.EMPTY) return if (expression.operationToken != EQEQEQ && expression.operationToken != EXCLEQEQEQ) return val checkedType = expression.left?.getType(bindingContext)?.fqNameOrNull() ?: return diff --git a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/Deprecation.kt b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/Deprecation.kt index 615f1cf77c3c..bf96e0d8b246 100644 --- a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/Deprecation.kt +++ b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/Deprecation.kt @@ -10,6 +10,7 @@ import io.gitlab.arturbosch.detekt.api.Severity import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution import org.jetbrains.kotlin.com.intellij.psi.PsiElement import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtNamedDeclaration import org.jetbrains.kotlin.resolve.BindingContext @@ -29,8 +30,9 @@ class Deprecation(config: Config) : Rule(config) { override val defaultRuleIdAliases = setOf("DEPRECATION") + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitElement(element: PsiElement) { - if (bindingContext == BindingContext.EMPTY) return if (hasDeprecationCompilerWarnings(element)) { val entity = if (element is KtNamedDeclaration) Entity.atName(element) else Entity.from(element) report(CodeSmell(issue, entity, "${element.text} is deprecated.")) diff --git a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/DontDowncastCollectionTypes.kt b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/DontDowncastCollectionTypes.kt index 3310b269f4af..6ad3f2976fb5 100644 --- a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/DontDowncastCollectionTypes.kt +++ b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/DontDowncastCollectionTypes.kt @@ -12,6 +12,7 @@ import io.gitlab.arturbosch.detekt.rules.fqNameOrNull import io.gitlab.arturbosch.detekt.rules.safeAs import org.jetbrains.kotlin.psi.KtBinaryExpressionWithTypeRHS import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtIsExpression import org.jetbrains.kotlin.psi.KtTypeReference import org.jetbrains.kotlin.psi.KtUserType @@ -48,9 +49,10 @@ class DontDowncastCollectionTypes(config: Config) : Rule(config) { Debt.TEN_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitIsExpression(expression: KtIsExpression) { super.visitIsExpression(expression) - if (bindingContext == BindingContext.EMPTY) return checkForDowncast(expression, expression.leftHandSide, expression.typeReference) } @@ -58,8 +60,6 @@ class DontDowncastCollectionTypes(config: Config) : Rule(config) { override fun visitBinaryWithTypeRHSExpression(expression: KtBinaryExpressionWithTypeRHS) { super.visitBinaryWithTypeRHSExpression(expression) - if (bindingContext == BindingContext.EMPTY) return - checkForDowncast(expression, expression.left, expression.right) } diff --git a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/DoubleMutabilityForCollection.kt b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/DoubleMutabilityForCollection.kt index 57d6f8fb2f37..9efe9c8e62de 100644 --- a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/DoubleMutabilityForCollection.kt +++ b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/DoubleMutabilityForCollection.kt @@ -13,6 +13,7 @@ import io.gitlab.arturbosch.detekt.api.internal.Configuration import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution import io.gitlab.arturbosch.detekt.rules.fqNameOrNull import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.resolve.BindingContext @@ -62,11 +63,11 @@ class DoubleMutabilityForCollection(config: Config = Config.empty) : Rule(config types.map { FqName(it) }.toSet() } + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitProperty(property: KtProperty) { super.visitProperty(property) - if (bindingContext == BindingContext.EMPTY) return - val type = (bindingContext[BindingContext.VARIABLE, property])?.type ?: return val standardType = type.fqNameOrNull() if (property.isVar && standardType in mutableTypes) { diff --git a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/ElseCaseInsteadOfExhaustiveWhen.kt b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/ElseCaseInsteadOfExhaustiveWhen.kt index 59d710006078..a9670a6ed4c4 100644 --- a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/ElseCaseInsteadOfExhaustiveWhen.kt +++ b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/ElseCaseInsteadOfExhaustiveWhen.kt @@ -9,6 +9,7 @@ import io.gitlab.arturbosch.detekt.api.Rule import io.gitlab.arturbosch.detekt.api.Severity import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution import org.jetbrains.kotlin.cfg.WhenChecker +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtWhenExpression import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.calls.util.getType @@ -60,10 +61,11 @@ class ElseCaseInsteadOfExhaustiveWhen(config: Config = Config.empty) : Rule(conf Debt.FIVE_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitWhenExpression(whenExpression: KtWhenExpression) { super.visitWhenExpression(whenExpression) - if (bindingContext == BindingContext.EMPTY) return checkForElseCaseInsteadOfExhaustiveWhenExpression(whenExpression) } diff --git a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/ExitOutsideMain.kt b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/ExitOutsideMain.kt index 451dd84b5196..47181ae5006c 100644 --- a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/ExitOutsideMain.kt +++ b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/ExitOutsideMain.kt @@ -10,6 +10,7 @@ import io.gitlab.arturbosch.detekt.api.Severity import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution import io.gitlab.arturbosch.detekt.rules.isMainFunction import org.jetbrains.kotlin.psi.KtCallExpression +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType import org.jetbrains.kotlin.resolve.BindingContext @@ -54,12 +55,12 @@ class ExitOutsideMain(config: Config = Config.empty) : Rule(config) { Debt.TEN_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + @Suppress("ReturnCount") override fun visitCallExpression(expression: KtCallExpression) { super.visitCallExpression(expression) - if (context == BindingContext.EMPTY) return - if (expression.getStrictParentOfType()?.isMainFunction() == true) return val fqName = expression.getResolvedCall(bindingContext)?.resultingDescriptor?.fqNameOrNull() ?: return diff --git a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/HasPlatformType.kt b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/HasPlatformType.kt index 80f8088c26fe..d59c39b996f2 100644 --- a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/HasPlatformType.kt +++ b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/HasPlatformType.kt @@ -12,6 +12,7 @@ import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.psi.KtCallableDeclaration import org.jetbrains.kotlin.psi.KtElement +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFunction import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject @@ -49,9 +50,10 @@ class HasPlatformType(config: Config) : Rule(config) { Debt.FIVE_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitKtElement(element: KtElement) { super.visitKtElement(element) - if (bindingContext == BindingContext.EMPTY) return if (element is KtCallableDeclaration && element.hasImplicitPlatformType()) { report( diff --git a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/IgnoredReturnValue.kt b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/IgnoredReturnValue.kt index b5eb9c48df43..aa4670c180d9 100644 --- a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/IgnoredReturnValue.kt +++ b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/IgnoredReturnValue.kt @@ -15,6 +15,7 @@ import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution import io.gitlab.arturbosch.detekt.api.simplePatternToRegex import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor import org.jetbrains.kotlin.psi.KtCallExpression +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.bindingContextUtil.isUsedAsExpression import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall @@ -72,10 +73,11 @@ class IgnoredReturnValue(config: Config = Config.empty) : Rule(config) { it.map(FunctionMatcher::fromFunctionSignature) } + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + @Suppress("ReturnCount") override fun visitCallExpression(expression: KtCallExpression) { super.visitCallExpression(expression) - if (bindingContext == BindingContext.EMPTY) return if (expression.isUsedAsExpression(bindingContext)) return diff --git a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/ImplicitUnitReturnType.kt b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/ImplicitUnitReturnType.kt index e4d4c0a5f56e..fceb385a8d92 100644 --- a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/ImplicitUnitReturnType.kt +++ b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/ImplicitUnitReturnType.kt @@ -12,6 +12,7 @@ import io.gitlab.arturbosch.detekt.api.internal.Configuration import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall @@ -55,12 +56,10 @@ class ImplicitUnitReturnType(config: Config) : Rule(config) { @Configuration("if functions with explicit 'Unit' return type should be allowed") private val allowExplicitReturnType: Boolean by config(true) - @Suppress("ReturnCount") + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitNamedFunction(function: KtNamedFunction) { super.visitNamedFunction(function) - if (BindingContext.EMPTY == bindingContext) { - return - } if (allowExplicitReturnType && function.hasDeclaredReturnType()) { return diff --git a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/MissingWhenCase.kt b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/MissingWhenCase.kt index e91dcd1a7b04..db5455a28568 100644 --- a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/MissingWhenCase.kt +++ b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/MissingWhenCase.kt @@ -13,6 +13,7 @@ import io.gitlab.arturbosch.detekt.api.internal.Configuration import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution import org.jetbrains.kotlin.cfg.WhenChecker import org.jetbrains.kotlin.diagnostics.WhenMissingCase +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtWhenExpression import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.bindingContextUtil.isUsedAsExpression @@ -81,9 +82,10 @@ class MissingWhenCase(config: Config = Config.empty) : Rule(config) { @Configuration("whether `else` can be treated as a valid case for enums and sealed classes") private val allowElseExpression: Boolean by config(true) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitWhenExpression(expression: KtWhenExpression) { super.visitWhenExpression(expression) - if (bindingContext == BindingContext.EMPTY) return if (allowElseExpression && expression.elseExpression != null) return checkMissingWhenExpression(expression) } diff --git a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/NullCheckOnMutableProperty.kt b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/NullCheckOnMutableProperty.kt index 1a153e64491b..605275e4f972 100644 --- a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/NullCheckOnMutableProperty.kt +++ b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/NullCheckOnMutableProperty.kt @@ -61,8 +61,9 @@ class NullCheckOnMutableProperty(config: Config) : Rule(config) { Debt.TEN_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitKtFile(file: KtFile) { - if (bindingContext == BindingContext.EMPTY) return super.visitKtFile(file) NullCheckVisitor().visitKtFile(file) } diff --git a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/NullableToStringCall.kt b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/NullableToStringCall.kt index b6d4eb7b86d0..106c5de1fafa 100644 --- a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/NullableToStringCall.kt +++ b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/NullableToStringCall.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtCallExpression import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtQualifiedExpression import org.jetbrains.kotlin.psi.KtSafeQualifiedExpression import org.jetbrains.kotlin.psi.KtSimpleNameExpression @@ -59,9 +60,10 @@ class NullableToStringCall(config: Config = Config.empty) : Rule(config) { Debt.FIVE_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitSimpleNameExpression(expression: KtSimpleNameExpression) { super.visitSimpleNameExpression(expression) - if (bindingContext == BindingContext.EMPTY) return val simpleOrCallExpression = expression.parent.safeAs() ?: expression val targetExpression = simpleOrCallExpression.targetExpression() ?: return diff --git a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/RedundantElseInWhen.kt b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/RedundantElseInWhen.kt index e4a2b80d806b..99ceef8d2c1c 100644 --- a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/RedundantElseInWhen.kt +++ b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/RedundantElseInWhen.kt @@ -10,6 +10,7 @@ import io.gitlab.arturbosch.detekt.api.Severity import io.gitlab.arturbosch.detekt.api.internal.ActiveByDefault import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtWhenExpression import org.jetbrains.kotlin.resolve.BindingContext @@ -69,10 +70,11 @@ class RedundantElseInWhen(config: Config = Config.empty) : Rule(config) { Debt.FIVE_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitWhenExpression(whenExpression: KtWhenExpression) { super.visitWhenExpression(whenExpression) - if (bindingContext == BindingContext.EMPTY) return val elseEntry = whenExpression.entries.lastOrNull { it.isElse } ?: return val compilerReports = bindingContext.diagnostics.forElement(elseEntry) if (compilerReports.any { it.factory == Errors.REDUNDANT_ELSE_IN_WHEN }) { diff --git a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/UnnecessaryNotNullOperator.kt b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/UnnecessaryNotNullOperator.kt index d6c60d4319bd..5e3e1bf0a6c6 100644 --- a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/UnnecessaryNotNullOperator.kt +++ b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/UnnecessaryNotNullOperator.kt @@ -10,6 +10,7 @@ import io.gitlab.arturbosch.detekt.api.Severity import io.gitlab.arturbosch.detekt.api.internal.ActiveByDefault import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtUnaryExpression import org.jetbrains.kotlin.resolve.BindingContext @@ -37,9 +38,10 @@ class UnnecessaryNotNullOperator(config: Config = Config.empty) : Rule(config) { Debt.FIVE_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitUnaryExpression(expression: KtUnaryExpression) { super.visitUnaryExpression(expression) - if (bindingContext == BindingContext.EMPTY) return val compilerReports = bindingContext.diagnostics.forElement(expression.operationReference) if (compilerReports.any { it.factory == Errors.UNNECESSARY_NOT_NULL_ASSERTION }) { diff --git a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/UnnecessarySafeCall.kt b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/UnnecessarySafeCall.kt index 290723135eb3..54dd6c132215 100644 --- a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/UnnecessarySafeCall.kt +++ b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/UnnecessarySafeCall.kt @@ -12,6 +12,7 @@ import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution import org.jetbrains.kotlin.com.intellij.psi.impl.source.tree.LeafPsiElement import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.lexer.KtTokens +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtSafeQualifiedExpression import org.jetbrains.kotlin.psi.psiUtil.getChildOfType import org.jetbrains.kotlin.resolve.BindingContext @@ -40,12 +41,11 @@ class UnnecessarySafeCall(config: Config = Config.empty) : Rule(config) { Debt.FIVE_MINS ) - @Suppress("ReturnCount") + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitSafeQualifiedExpression(expression: KtSafeQualifiedExpression) { super.visitSafeQualifiedExpression(expression) - if (bindingContext == BindingContext.EMPTY) return - val safeAccessElement = expression.getChildOfType() if (safeAccessElement == null || safeAccessElement.elementType != KtTokens.SAFE_ACCESS) { return diff --git a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/UnreachableCatchBlock.kt b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/UnreachableCatchBlock.kt index 6846f42cd13a..6ce7b961496c 100644 --- a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/UnreachableCatchBlock.kt +++ b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/UnreachableCatchBlock.kt @@ -12,6 +12,7 @@ import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution import io.gitlab.arturbosch.detekt.rules.safeAs import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.psi.KtCatchClause +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtTryExpression import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType import org.jetbrains.kotlin.resolve.BindingContext @@ -57,10 +58,11 @@ class UnreachableCatchBlock(config: Config = Config.empty) : Rule(config) { Debt.FIVE_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + @Suppress("ReturnCount") override fun visitCatchSection(catchClause: KtCatchClause) { super.visitCatchSection(catchClause) - if (bindingContext == BindingContext.EMPTY) return val tryExpression = catchClause.getStrictParentOfType() ?: return val prevCatchClauses = tryExpression.catchClauses.takeWhile { it != catchClause } diff --git a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/UnreachableCode.kt b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/UnreachableCode.kt index 5dac3f7bf149..89f8bc34a1e0 100644 --- a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/UnreachableCode.kt +++ b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/UnreachableCode.kt @@ -11,6 +11,7 @@ import io.gitlab.arturbosch.detekt.api.internal.ActiveByDefault import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.resolve.BindingContext /** @@ -44,11 +45,11 @@ class UnreachableCode(config: Config = Config.empty) : Rule(config) { Debt.TEN_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitExpression(expression: KtExpression) { super.visitExpression(expression) - if (bindingContext != BindingContext.EMPTY && - bindingContext.diagnostics.forElement(expression).any { it.factory == Errors.UNREACHABLE_CODE } - ) { + if (bindingContext.diagnostics.forElement(expression).any { it.factory == Errors.UNREACHABLE_CODE }) { report( CodeSmell( issue, diff --git a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/UnsafeCallOnNullableType.kt b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/UnsafeCallOnNullableType.kt index f05ff1ec2e98..2c3fe18fe367 100644 --- a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/UnsafeCallOnNullableType.kt +++ b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/UnsafeCallOnNullableType.kt @@ -10,6 +10,7 @@ import io.gitlab.arturbosch.detekt.api.Severity import io.gitlab.arturbosch.detekt.api.internal.ActiveByDefault import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution import org.jetbrains.kotlin.lexer.KtTokens +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtPostfixExpression import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.calls.util.getType @@ -44,9 +45,10 @@ class UnsafeCallOnNullableType(config: Config = Config.empty) : Rule(config) { Debt.TWENTY_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitPostfixExpression(expression: KtPostfixExpression) { super.visitPostfixExpression(expression) - if (bindingContext == BindingContext.EMPTY) return if (expression.operationToken == KtTokens.EXCLEXCL && expression.baseExpression?.getType(bindingContext)?.nullability() == TypeNullability.NULLABLE ) { diff --git a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/UnsafeCast.kt b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/UnsafeCast.kt index b80155cfa46d..9ad3c7ef6647 100644 --- a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/UnsafeCast.kt +++ b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/UnsafeCast.kt @@ -11,6 +11,7 @@ import io.gitlab.arturbosch.detekt.api.internal.ActiveByDefault import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.psi.KtBinaryExpressionWithTypeRHS +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.resolve.BindingContext /** @@ -45,9 +46,9 @@ class UnsafeCast(config: Config = Config.empty) : Rule(config) { Debt.TWENTY_MINS ) - override fun visitBinaryWithTypeRHSExpression(expression: KtBinaryExpressionWithTypeRHS) { - if (bindingContext == BindingContext.EMPTY) return + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitBinaryWithTypeRHSExpression(expression: KtBinaryExpressionWithTypeRHS) { if (bindingContext.diagnostics.forElement(expression.operationReference) .any { it.factory == Errors.CAST_NEVER_SUCCEEDS } ) { diff --git a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/UnusedUnaryOperator.kt b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/UnusedUnaryOperator.kt index da3b6e64487f..bb5cd5ff0918 100644 --- a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/UnusedUnaryOperator.kt +++ b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/UnusedUnaryOperator.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtBinaryExpression import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtPrefixExpression import org.jetbrains.kotlin.psi.psiUtil.leaves import org.jetbrains.kotlin.psi.psiUtil.parents @@ -48,10 +49,11 @@ class UnusedUnaryOperator(config: Config = Config.empty) : Rule(config) { Debt.FIVE_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + @Suppress("ReturnCount") override fun visitPrefixExpression(expression: KtPrefixExpression) { super.visitPrefixExpression(expression) - if (bindingContext == BindingContext.EMPTY) return if (expression.baseExpression == null) return val operationToken = expression.operationToken diff --git a/detekt-rules-exceptions/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/exceptions/ObjectExtendsThrowable.kt b/detekt-rules-exceptions/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/exceptions/ObjectExtendsThrowable.kt index e07a9f94466c..913b09fb3f7f 100644 --- a/detekt-rules-exceptions/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/exceptions/ObjectExtendsThrowable.kt +++ b/detekt-rules-exceptions/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/exceptions/ObjectExtendsThrowable.kt @@ -8,6 +8,7 @@ import io.gitlab.arturbosch.detekt.api.Issue import io.gitlab.arturbosch.detekt.api.Rule import io.gitlab.arturbosch.detekt.api.Severity import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtObjectDeclaration import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.types.typeUtil.isNotNullThrowable @@ -53,9 +54,10 @@ class ObjectExtendsThrowable(config: Config = Config.empty) : Rule(config) { debt = Debt.TEN_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitObjectDeclaration(declaration: KtObjectDeclaration) { super.visitObjectDeclaration(declaration) - if (bindingContext == BindingContext.EMPTY) return if (!declaration.isObjectLiteral() && declaration.isSubtypeOfThrowable()) { report( CodeSmell( diff --git a/detekt-rules-exceptions/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/exceptions/ReturnFromFinally.kt b/detekt-rules-exceptions/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/exceptions/ReturnFromFinally.kt index 6e92d8cab796..c9372a5dcc90 100644 --- a/detekt-rules-exceptions/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/exceptions/ReturnFromFinally.kt +++ b/detekt-rules-exceptions/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/exceptions/ReturnFromFinally.kt @@ -12,6 +12,7 @@ import io.gitlab.arturbosch.detekt.api.internal.ActiveByDefault import io.gitlab.arturbosch.detekt.api.internal.Configuration import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution import org.jetbrains.kotlin.psi.KtBlockExpression +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFinallySection import org.jetbrains.kotlin.psi.KtReturnExpression import org.jetbrains.kotlin.psi.KtTryExpression @@ -55,9 +56,10 @@ class ReturnFromFinally(config: Config = Config.empty) : Rule(config) { @Configuration("ignores labeled return statements") private val ignoreLabeled: Boolean by config(false) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitTryExpression(expression: KtTryExpression) { super.visitTryExpression(expression) - if (bindingContext == BindingContext.EMPTY) return val finallyBlock = expression.finallyBlock ?: return diff --git a/detekt-rules-naming/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/naming/BooleanPropertyNaming.kt b/detekt-rules-naming/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/naming/BooleanPropertyNaming.kt index 2bb5c283402d..718a3e9601e1 100644 --- a/detekt-rules-naming/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/naming/BooleanPropertyNaming.kt +++ b/detekt-rules-naming/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/naming/BooleanPropertyNaming.kt @@ -15,6 +15,7 @@ import io.gitlab.arturbosch.detekt.rules.identifierName import io.gitlab.arturbosch.detekt.rules.isConstant import io.gitlab.arturbosch.detekt.rules.isOverride import org.jetbrains.kotlin.psi.KtCallableDeclaration +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtParameter import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.resolve.BindingContext @@ -47,6 +48,8 @@ class BooleanPropertyNaming(config: Config = Config.empty) : Rule(config) { Debt.FIVE_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitParameter(parameter: KtParameter) { super.visitParameter(parameter) @@ -62,10 +65,6 @@ class BooleanPropertyNaming(config: Config = Config.empty) : Rule(config) { } private fun validateDeclaration(declaration: KtCallableDeclaration) { - if (bindingContext == BindingContext.EMPTY) { - return - } - val name = declaration.identifierName() val typeName = getTypeName(declaration) val isBooleanType = diff --git a/detekt-rules-naming/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/naming/NoNameShadowing.kt b/detekt-rules-naming/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/naming/NoNameShadowing.kt index e66e0321345c..b3d8a06608cf 100644 --- a/detekt-rules-naming/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/naming/NoNameShadowing.kt +++ b/detekt-rules-naming/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/naming/NoNameShadowing.kt @@ -13,6 +13,7 @@ import io.gitlab.arturbosch.detekt.rules.hasImplicitParameterReference import io.gitlab.arturbosch.detekt.rules.implicitParameter import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.psi.KtDestructuringDeclarationEntry +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtLambdaExpression import org.jetbrains.kotlin.psi.KtNamedDeclaration import org.jetbrains.kotlin.psi.KtParameter @@ -59,6 +60,8 @@ class NoNameShadowing(config: Config = Config.empty) : Rule(config) { Debt.FIVE_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitProperty(property: KtProperty) { super.visitProperty(property) checkNameShadowing(property) @@ -76,16 +79,13 @@ class NoNameShadowing(config: Config = Config.empty) : Rule(config) { private fun checkNameShadowing(declaration: KtNamedDeclaration) { val nameIdentifier = declaration.nameIdentifier ?: return - if (bindingContext != BindingContext.EMPTY && - bindingContext.diagnostics.forElement(declaration).any { it.factory == Errors.NAME_SHADOWING } - ) { + if (bindingContext.diagnostics.forElement(declaration).any { it.factory == Errors.NAME_SHADOWING }) { report(CodeSmell(issue, Entity.from(nameIdentifier), "Name shadowed: ${nameIdentifier.text}")) } } override fun visitLambdaExpression(lambdaExpression: KtLambdaExpression) { super.visitLambdaExpression(lambdaExpression) - if (bindingContext == BindingContext.EMPTY) return val implicitParameter = lambdaExpression.implicitParameter(bindingContext) ?: return if (lambdaExpression.hasImplicitParameterReference(implicitParameter, bindingContext) && lambdaExpression.hasParentImplicitParameterLambda() diff --git a/detekt-rules-naming/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/naming/NonBooleanPropertyPrefixedWithIs.kt b/detekt-rules-naming/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/naming/NonBooleanPropertyPrefixedWithIs.kt index e8c17808be66..afebf0a84640 100644 --- a/detekt-rules-naming/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/naming/NonBooleanPropertyPrefixedWithIs.kt +++ b/detekt-rules-naming/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/naming/NonBooleanPropertyPrefixedWithIs.kt @@ -12,6 +12,7 @@ import io.gitlab.arturbosch.detekt.rules.fqNameOrNull import io.gitlab.arturbosch.detekt.rules.identifierName import org.jetbrains.kotlin.builtins.isFunctionOrKFunctionTypeWithAnySuspendability import org.jetbrains.kotlin.psi.KtCallableDeclaration +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtParameter import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.resolve.BindingContext @@ -44,6 +45,8 @@ class NonBooleanPropertyPrefixedWithIs(config: Config = Config.empty) : Rule(con debt = Debt.FIVE_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitParameter(parameter: KtParameter) { super.visitParameter(parameter) @@ -59,10 +62,6 @@ class NonBooleanPropertyPrefixedWithIs(config: Config = Config.empty) : Rule(con } private fun validateDeclaration(declaration: KtCallableDeclaration) { - if (bindingContext == BindingContext.EMPTY) { - return - } - val name = declaration.identifierName() if (name.startsWith("is") && name.length > 2 && !name[2].isLowerCase()) { diff --git a/detekt-rules-performance/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/performance/ArrayPrimitive.kt b/detekt-rules-performance/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/performance/ArrayPrimitive.kt index da59b1c587c7..35f1d74846d0 100644 --- a/detekt-rules-performance/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/performance/ArrayPrimitive.kt +++ b/detekt-rules-performance/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/performance/ArrayPrimitive.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtCallExpression import org.jetbrains.kotlin.psi.KtCallableDeclaration +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtNamedDeclaration import org.jetbrains.kotlin.psi.KtTypeReference import org.jetbrains.kotlin.psi.psiUtil.collectDescendantsOfType @@ -51,9 +52,10 @@ class ArrayPrimitive(config: Config = Config.empty) : Rule(config) { Debt.FIVE_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitCallExpression(expression: KtCallExpression) { super.visitCallExpression(expression) - if (bindingContext == BindingContext.EMPTY) return if (expression.calleeExpression?.text !in factoryMethodNames) return val descriptor = expression.getResolvedCall(bindingContext)?.resultingDescriptor diff --git a/detekt-rules-performance/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/performance/CouldBeSequence.kt b/detekt-rules-performance/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/performance/CouldBeSequence.kt index 178cded16eb2..8a6bd3d82275 100644 --- a/detekt-rules-performance/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/performance/CouldBeSequence.kt +++ b/detekt-rules-performance/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/performance/CouldBeSequence.kt @@ -13,6 +13,7 @@ import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtCallExpression import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForReceiver import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelectorOrThis import org.jetbrains.kotlin.resolve.BindingContext @@ -47,12 +48,11 @@ class CouldBeSequence(config: Config = Config.empty) : Rule(config) { private var visitedCallExpressions = mutableListOf() - @Suppress("ReturnCount") + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitCallExpression(expression: KtCallExpression) { super.visitCallExpression(expression) - if (bindingContext == BindingContext.EMPTY) return - if (visitedCallExpressions.contains(expression)) return if (!expression.isCalling(operationsFqNames)) return diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/CanBeNonNullable.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/CanBeNonNullable.kt index a65ed2e7cebd..155afca69253 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/CanBeNonNullable.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/CanBeNonNullable.kt @@ -124,6 +124,8 @@ class CanBeNonNullable(config: Config = Config.empty) : Rule(config) { Debt.TEN_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitKtFile(file: KtFile) { super.visitKtFile(file) PropertyCheckVisitor().visitKtFile(file) diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/ExplicitCollectionElementAccessMethod.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/ExplicitCollectionElementAccessMethod.kt index 58e7eaeb37a4..9bf4795f61d7 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/ExplicitCollectionElementAccessMethod.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/ExplicitCollectionElementAccessMethod.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.load.java.isFromJava import org.jetbrains.kotlin.psi.KtBlockExpression import org.jetbrains.kotlin.psi.KtCallExpression import org.jetbrains.kotlin.psi.KtDotQualifiedExpression +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelector import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall @@ -50,9 +51,10 @@ class ExplicitCollectionElementAccessMethod(config: Config = Config.empty) : Rul Debt.FIVE_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitDotQualifiedExpression(expression: KtDotQualifiedExpression) { super.visitDotQualifiedExpression(expression) - if (bindingContext == BindingContext.EMPTY) return val call = expression.selectorExpression as? KtCallExpression ?: return if (isIndexGetterRecommended(call) || isIndexSetterRecommended(call)) { report(CodeSmell(issue, Entity.from(expression), issue.description)) diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/ForbiddenMethodCall.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/ForbiddenMethodCall.kt index a49cfb05eb21..22d11967d209 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/ForbiddenMethodCall.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/ForbiddenMethodCall.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.psi.KtCallExpression import org.jetbrains.kotlin.psi.KtCallableReferenceExpression import org.jetbrains.kotlin.psi.KtDotQualifiedExpression import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtPostfixExpression import org.jetbrains.kotlin.psi.KtPrefixExpression import org.jetbrains.kotlin.psi.psiUtil.isDotSelector @@ -72,6 +73,8 @@ class ForbiddenMethodCall(config: Config = Config.empty) : Rule(config) { list.map { Forbidden(fromFunctionSignature(it.value), it.reason) } } + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitCallExpression(expression: KtCallExpression) { super.visitCallExpression(expression) check(expression) @@ -105,8 +108,6 @@ class ForbiddenMethodCall(config: Config = Config.empty) : Rule(config) { } private fun check(expression: KtExpression) { - if (bindingContext == BindingContext.EMPTY) return - val descriptors = expression.getResolvedCall(bindingContext)?.resultingDescriptor?.let { val foundDescriptors = if (it is PropertyDescriptor) { listOfNotNull(it.unwrappedGetMethod, it.unwrappedSetMethod) diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/ForbiddenVoid.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/ForbiddenVoid.kt index 6e67b33309a0..3e9cb1bfc486 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/ForbiddenVoid.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/ForbiddenVoid.kt @@ -14,6 +14,7 @@ import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution import io.gitlab.arturbosch.detekt.rules.fqNameOrNull import io.gitlab.arturbosch.detekt.rules.isOverride import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.KtParameter import org.jetbrains.kotlin.psi.KtTypeArgumentList @@ -55,9 +56,10 @@ class ForbiddenVoid(config: Config = Config.empty) : Rule(config) { @Configuration("ignore void types as generic arguments") private val ignoreUsageInGenerics: Boolean by config(false) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + @Suppress("ReturnCount") override fun visitTypeReference(typeReference: KtTypeReference) { - if (bindingContext == BindingContext.EMPTY) return val kotlinType = typeReference.getAbbreviatedTypeOrType(bindingContext) ?: return if (kotlinType.fqNameOrNull() == VOID_FQ_NAME) { diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/LibraryCodeMustSpecifyReturnType.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/LibraryCodeMustSpecifyReturnType.kt index d63904568d40..ae135b266437 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/LibraryCodeMustSpecifyReturnType.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/LibraryCodeMustSpecifyReturnType.kt @@ -10,6 +10,7 @@ import io.gitlab.arturbosch.detekt.api.Severity import io.gitlab.arturbosch.detekt.api.internal.ActiveByDefault import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution import org.jetbrains.kotlin.psi.KtCallableDeclaration +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.resolve.BindingContext @@ -53,10 +54,9 @@ class LibraryCodeMustSpecifyReturnType(config: Config = Config.empty) : Rule(con Debt.FIVE_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitProperty(property: KtProperty) { - if (bindingContext == BindingContext.EMPTY) { - return - } if (property.explicitReturnTypeRequired()) { report( CodeSmell( @@ -70,9 +70,6 @@ class LibraryCodeMustSpecifyReturnType(config: Config = Config.empty) : Rule(con } override fun visitNamedFunction(function: KtNamedFunction) { - if (bindingContext == BindingContext.EMPTY) { - return - } if (function.explicitReturnTypeRequired()) { report( CodeSmell( diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/MaxChainedCallsOnSameLine.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/MaxChainedCallsOnSameLine.kt index f64f09a2974b..83e6b97c42b9 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/MaxChainedCallsOnSameLine.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/MaxChainedCallsOnSameLine.kt @@ -12,6 +12,7 @@ import io.gitlab.arturbosch.detekt.api.internal.Configuration import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution import org.jetbrains.kotlin.descriptors.PackageViewDescriptor import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtImportDirective import org.jetbrains.kotlin.psi.KtPackageDirective import org.jetbrains.kotlin.psi.KtQualifiedExpression @@ -43,12 +44,11 @@ class MaxChainedCallsOnSameLine(config: Config = Config.empty) : Rule(config) { @Configuration("maximum chained calls allowed on a single line") private val maxChainedCalls: Int by config(defaultValue = 5) - @Suppress("ReturnCount") + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitQualifiedExpression(expression: KtQualifiedExpression) { super.visitQualifiedExpression(expression) - if (bindingContext == BindingContext.EMPTY) return - val parent = expression.parent // skip if the parent is also a call on the same line to avoid duplicated warnings diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/MultilineLambdaItParameter.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/MultilineLambdaItParameter.kt index 3c6d898bd6c7..fca31efd2fed 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/MultilineLambdaItParameter.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/MultilineLambdaItParameter.kt @@ -11,6 +11,7 @@ import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution import io.gitlab.arturbosch.detekt.rules.IT_LITERAL import io.gitlab.arturbosch.detekt.rules.hasImplicitParameterReference import io.gitlab.arturbosch.detekt.rules.implicitParameter +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtLambdaExpression import org.jetbrains.kotlin.resolve.BindingContext @@ -73,9 +74,10 @@ class MultilineLambdaItParameter(val config: Config) : Rule(config) { Debt.FIVE_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitLambdaExpression(lambdaExpression: KtLambdaExpression) { super.visitLambdaExpression(lambdaExpression) - if (bindingContext == BindingContext.EMPTY) return val size = lambdaExpression.bodyExpression?.statements?.size if (size == null || size <= 1) return diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/NullableBooleanCheck.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/NullableBooleanCheck.kt index c70b79712508..3e322f887d7f 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/NullableBooleanCheck.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/NullableBooleanCheck.kt @@ -12,6 +12,8 @@ import org.jetbrains.kotlin.KtNodeTypes import org.jetbrains.kotlin.com.intellij.psi.PsiElement import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtBinaryExpression +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.calls.util.getType import org.jetbrains.kotlin.types.typeUtil.isBooleanOrNullableBoolean @@ -41,6 +43,8 @@ class NullableBooleanCheck(config: Config = Config.empty) : Rule(config) { Debt.FIVE_MINS, ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitBinaryExpression(expression: KtBinaryExpression) { if (expression.operationToken == KtTokens.ELVIS && expression.right?.isBooleanConstant() == true && diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/ObjectLiteralToLambda.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/ObjectLiteralToLambda.kt index c4bbb2625272..e0d3e1b7604e 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/ObjectLiteralToLambda.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/ObjectLiteralToLambda.kt @@ -13,6 +13,7 @@ import io.gitlab.arturbosch.detekt.rules.isOverride import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.load.java.sam.JavaSingleAbstractMethodUtils import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.KtObjectDeclaration import org.jetbrains.kotlin.psi.KtObjectLiteralExpression @@ -94,9 +95,10 @@ class ObjectLiteralToLambda(config: Config = Config.empty) : Rule(config) { !functionBody.containsMethodOf(this) } + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitObjectLiteralExpression(expression: KtObjectLiteralExpression) { super.visitObjectLiteralExpression(expression) - if (bindingContext == BindingContext.EMPTY) return val declaration = expression.objectDeclaration if ( diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/RedundantExplicitType.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/RedundantExplicitType.kt index bf41d0411310..d9cb1b9059ff 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/RedundantExplicitType.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/RedundantExplicitType.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.KtNodeTypes import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.psi.KtCallExpression import org.jetbrains.kotlin.psi.KtConstantExpression +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtNameReferenceExpression import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.KtStringTemplateExpression @@ -52,9 +53,10 @@ class RedundantExplicitType(config: Config) : Rule(config) { Debt.FIVE_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + @Suppress("ReturnCount", "ComplexMethod") override fun visitProperty(property: KtProperty) { - if (bindingContext == BindingContext.EMPTY) return if (!property.isLocal) return val typeReference = property.typeReference ?: return val type = diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/RedundantHigherOrderMapUsage.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/RedundantHigherOrderMapUsage.kt index 75f53400749c..2d223ec397f6 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/RedundantHigherOrderMapUsage.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/RedundantHigherOrderMapUsage.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtCallExpression import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFunctionLiteral import org.jetbrains.kotlin.psi.KtLambdaExpression import org.jetbrains.kotlin.psi.KtNameReferenceExpression @@ -84,9 +85,10 @@ class RedundantHigherOrderMapUsage(config: Config = Config.empty) : Rule(config) Debt.FIVE_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitCallExpression(expression: KtCallExpression) { super.visitCallExpression(expression) - if (bindingContext == BindingContext.EMPTY) return val calleeExpression = expression.calleeExpression if (calleeExpression?.text != "map") return diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnnecessaryApply.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnnecessaryApply.kt index dc9a4647843b..5cf2f932aa1a 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnnecessaryApply.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnnecessaryApply.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtBinaryExpression import org.jetbrains.kotlin.psi.KtCallExpression import org.jetbrains.kotlin.psi.KtDotQualifiedExpression +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtNameReferenceExpression import org.jetbrains.kotlin.psi.KtReferenceExpression import org.jetbrains.kotlin.psi.KtSafeQualifiedExpression @@ -53,11 +54,11 @@ class UnnecessaryApply(config: Config) : Rule(config) { Debt.FIVE_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitCallExpression(expression: KtCallExpression) { super.visitCallExpression(expression) - if (bindingContext == BindingContext.EMPTY) return - if (expression.isApplyExpr() && expression.hasOnlyOneMemberAccessStatement() && !expression.receiverIsUsed(bindingContext) diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnnecessaryFilter.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnnecessaryFilter.kt index 9fdf56e03e55..f3c1b9c2861d 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnnecessaryFilter.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnnecessaryFilter.kt @@ -12,6 +12,7 @@ import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtCallExpression import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtLambdaExpression import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForReceiver import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelectorOrThis @@ -54,10 +55,11 @@ class UnnecessaryFilter(config: Config = Config.empty) : Rule(config) { Debt.FIVE_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + @Suppress("ReturnCount") override fun visitCallExpression(expression: KtCallExpression) { super.visitCallExpression(expression) - if (bindingContext == BindingContext.EMPTY) return if (!expression.isCalling(filterFqNames)) return val lambdaArgumentText = expression.lambda()?.text ?: return diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnnecessaryInnerClass.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnnecessaryInnerClass.kt index 3b4ea4c6f0a3..c06aa05485af 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnnecessaryInnerClass.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnnecessaryInnerClass.kt @@ -54,10 +54,7 @@ class UnnecessaryInnerClass(config: Config = Config.empty) : Rule(config) { Debt.FIVE_MINS ) - override fun visit(root: KtFile) { - if (bindingContext == BindingContext.EMPTY) return - super.visit(root) - } + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) override fun visitClass(klass: KtClass) { classChain.add(klass) diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnnecessaryLet.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnnecessaryLet.kt index b6698e4e6af3..5df595b30140 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnnecessaryLet.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnnecessaryLet.kt @@ -18,6 +18,7 @@ import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl import org.jetbrains.kotlin.psi.KtBlockExpression import org.jetbrains.kotlin.psi.KtCallExpression import org.jetbrains.kotlin.psi.KtDotQualifiedExpression +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtLambdaExpression import org.jetbrains.kotlin.psi.KtSafeQualifiedExpression import org.jetbrains.kotlin.psi.KtSimpleNameExpression @@ -57,11 +58,11 @@ class UnnecessaryLet(config: Config) : Rule(config) { Debt.FIVE_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitCallExpression(expression: KtCallExpression) { super.visitCallExpression(expression) - if (bindingContext == BindingContext.EMPTY) return - if (!expression.isLetExpr()) return val lambdaExpr = expression.firstLambdaArg diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseAnyOrNoneInsteadOfFind.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseAnyOrNoneInsteadOfFind.kt index 87be6f8cf936..5e3026f8a3f2 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseAnyOrNoneInsteadOfFind.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseAnyOrNoneInsteadOfFind.kt @@ -15,6 +15,7 @@ import io.gitlab.arturbosch.detekt.rules.isNullCheck import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtBinaryExpression import org.jetbrains.kotlin.psi.KtCallExpression +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtQualifiedExpression import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType import org.jetbrains.kotlin.resolve.BindingContext @@ -42,10 +43,11 @@ class UseAnyOrNoneInsteadOfFind(config: Config = Config.empty) : Rule(config) { Debt.FIVE_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + @Suppress("ReturnCount") override fun visitCallExpression(expression: KtCallExpression) { super.visitCallExpression(expression) - if (bindingContext == BindingContext.EMPTY) return val functionName = expression.calleeExpression?.text ?: return val qualifiedOrThis = expression.getStrictParentOfType() ?: expression diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseCheckNotNull.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseCheckNotNull.kt index 9b64c40222fa..b994c934a0e6 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseCheckNotNull.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseCheckNotNull.kt @@ -12,6 +12,7 @@ import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution import io.gitlab.arturbosch.detekt.rules.isCallingWithNonNullCheckArgument import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtCallExpression +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.resolve.BindingContext /** @@ -35,9 +36,10 @@ class UseCheckNotNull(config: Config = Config.empty) : Rule(config) { Debt.FIVE_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitCallExpression(expression: KtCallExpression) { super.visitCallExpression(expression) - if (bindingContext == BindingContext.EMPTY) return if (expression.isCallingWithNonNullCheckArgument(checkFunctionFqName, bindingContext)) { report(CodeSmell(issue, Entity.from(expression), issue.description)) } diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseEmptyCounterpart.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseEmptyCounterpart.kt index 97a20b5b6449..f4ec103c25c9 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseEmptyCounterpart.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseEmptyCounterpart.kt @@ -10,6 +10,8 @@ import io.gitlab.arturbosch.detekt.api.Severity import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtCallExpression +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameOrNull @@ -43,6 +45,8 @@ class UseEmptyCounterpart(config: Config) : Rule(config) { Debt.FIVE_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + @Suppress("ReturnCount") override fun visitCallExpression(expression: KtCallExpression) { super.visitCallExpression(expression) diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseIfEmptyOrIfBlank.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseIfEmptyOrIfBlank.kt index 8b0c14352b5c..5f859f07de4a 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseIfEmptyOrIfBlank.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseIfEmptyOrIfBlank.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtCallExpression 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.KtPrefixExpression import org.jetbrains.kotlin.psi.KtThisExpression @@ -57,9 +58,10 @@ class UseIfEmptyOrIfBlank(config: Config = Config.empty) : Rule(config) { Debt.FIVE_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitIfExpression(expression: KtIfExpression) { super.visitIfExpression(expression) - if (bindingContext == BindingContext.EMPTY) return if (expression.isElseIf()) return val thenExpression = expression.then ?: return diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseIsNullOrEmpty.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseIsNullOrEmpty.kt index b10efcc64aef..22150327ecfd 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseIsNullOrEmpty.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseIsNullOrEmpty.kt @@ -18,6 +18,7 @@ import org.jetbrains.kotlin.psi.KtBinaryExpression import org.jetbrains.kotlin.psi.KtCallExpression import org.jetbrains.kotlin.psi.KtDotQualifiedExpression import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtSimpleNameExpression import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall @@ -56,10 +57,11 @@ class UseIsNullOrEmpty(config: Config = Config.empty) : Rule(config) { Debt.FIVE_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + @Suppress("ReturnCount") override fun visitBinaryExpression(expression: KtBinaryExpression) { super.visitBinaryExpression(expression) - if (bindingContext == BindingContext.EMPTY) return if (expression.operationToken != KtTokens.OROR) return val left = expression.left as? KtBinaryExpression ?: return diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseOrEmpty.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseOrEmpty.kt index 8f4e7a697982..b139aba299b1 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseOrEmpty.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseOrEmpty.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.psi.KtArrayAccessExpression import org.jetbrains.kotlin.psi.KtBinaryExpression import org.jetbrains.kotlin.psi.KtCallExpression import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtStringTemplateExpression import org.jetbrains.kotlin.psi2ir.deparenthesize import org.jetbrains.kotlin.resolve.BindingContext @@ -54,10 +55,11 @@ class UseOrEmpty(config: Config = Config.empty) : Rule(config) { Debt.FIVE_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + @Suppress("ReturnCount") override fun visitBinaryExpression(expression: KtBinaryExpression) { super.visitBinaryExpression(expression) - if (bindingContext == BindingContext.EMPTY) return if (expression.operationToken != KtTokens.ELVIS) return val left = expression.left ?: return diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseRequireNotNull.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseRequireNotNull.kt index d2eec9f51c03..0d80810206bd 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseRequireNotNull.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseRequireNotNull.kt @@ -12,6 +12,7 @@ import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution import io.gitlab.arturbosch.detekt.rules.isCallingWithNonNullCheckArgument import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtCallExpression +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.resolve.BindingContext /** @@ -35,9 +36,10 @@ class UseRequireNotNull(config: Config = Config.empty) : Rule(config) { Debt.FIVE_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitCallExpression(expression: KtCallExpression) { super.visitCallExpression(expression) - if (bindingContext == BindingContext.EMPTY) return if (expression.isCallingWithNonNullCheckArgument(requireFunctionFqName, bindingContext)) { report(CodeSmell(issue, Entity.from(expression), issue.description)) } diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UselessCallOnNotNull.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UselessCallOnNotNull.kt index 8f6e0eb6a920..178c1b586ac1 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UselessCallOnNotNull.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UselessCallOnNotNull.kt @@ -11,6 +11,7 @@ import io.gitlab.arturbosch.detekt.api.internal.ActiveByDefault import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtCallExpression +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtQualifiedExpression import org.jetbrains.kotlin.psi.KtSafeQualifiedExpression import org.jetbrains.kotlin.psi.ValueArgument @@ -58,10 +59,11 @@ class UselessCallOnNotNull(config: Config = Config.empty) : Rule(config) { Debt.FIVE_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + @Suppress("ReturnCount") override fun visitQualifiedExpression(expression: KtQualifiedExpression) { super.visitQualifiedExpression(expression) - if (bindingContext == BindingContext.EMPTY) return val safeExpression = expression as? KtSafeQualifiedExpression val notNullType = expression.receiverExpression.getType(bindingContext)?.isNullable() == false diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/VarCouldBeVal.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/VarCouldBeVal.kt index 8bc2fc7c2f48..dfa340d3ba0d 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/VarCouldBeVal.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/VarCouldBeVal.kt @@ -74,9 +74,10 @@ class VarCouldBeVal(config: Config = Config.empty) : Rule(config) { @Configuration("Whether to ignore uninitialized lateinit vars") private val ignoreLateinitVar: Boolean by config(defaultValue = false) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitKtFile(file: KtFile) { super.visitKtFile(file) - if (bindingContext == BindingContext.EMPTY) return val assignmentVisitor = AssignmentVisitor(bindingContext, ignoreLateinitVar) file.accept(assignmentVisitor) diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/optional/PreferToOverPairSyntax.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/optional/PreferToOverPairSyntax.kt index 37228a57b851..2b1671428fa5 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/optional/PreferToOverPairSyntax.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/optional/PreferToOverPairSyntax.kt @@ -12,6 +12,7 @@ import io.gitlab.arturbosch.detekt.rules.safeAs import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtCallExpression +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameOrNull @@ -39,10 +40,11 @@ class PreferToOverPairSyntax(config: Config = Config.empty) : Rule(config) { Debt.FIVE_MINS ) + override fun visitCondition(root: KtFile) = bindingContext != BindingContext.EMPTY && super.visitCondition(root) + override fun visitCallExpression(expression: KtCallExpression) { super.visitCallExpression(expression) - if (bindingContext == BindingContext.EMPTY) return if (expression.isPairConstructor()) { val arg = expression.valueArguments.joinToString(" to ") { it.text } report(