From 946c05f19ce21657b530ab68b054d257928704f0 Mon Sep 17 00:00:00 2001 From: soWhoAmI Date: Sat, 7 Nov 2020 11:23:21 +0300 Subject: [PATCH] feature/rule-6.2.2(#447) ### What's done: * Added rule logic * Added warn tests --- .../rules/ExtensionFunctionsSameNameRule.kt | 13 ++++++----- .../ExtensionFunctionsSameNameWarnTest.kt | 23 +++++++++++++++++++ 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/diktat-rules/src/main/kotlin/org/cqfn/diktat/ruleset/rules/ExtensionFunctionsSameNameRule.kt b/diktat-rules/src/main/kotlin/org/cqfn/diktat/ruleset/rules/ExtensionFunctionsSameNameRule.kt index c13d8db63c..5ac867b023 100644 --- a/diktat-rules/src/main/kotlin/org/cqfn/diktat/ruleset/rules/ExtensionFunctionsSameNameRule.kt +++ b/diktat-rules/src/main/kotlin/org/cqfn/diktat/ruleset/rules/ExtensionFunctionsSameNameRule.kt @@ -26,7 +26,7 @@ import org.jetbrains.kotlin.psi.KtClass import org.jetbrains.kotlin.psi.KtNamedFunction typealias RelatedClasses = List> -typealias SimilarSignatures = List> +typealias SimilarSignatures = List> /** * This rule checks if extension functions with the same signature don't have related classes @@ -42,7 +42,7 @@ class ExtensionFunctionsSameNameRule(private val configRules: List) isFixMode = autoCorrect /** - * 1) Collect all classes that extend other classes + * 1) Collect all classes that extend other classes (collect related classes) * 2) Collect all extension functions with same signature * 3) Check if classes of functions are related */ @@ -76,8 +76,8 @@ class ExtensionFunctionsSameNameRule(private val configRules: List) private fun collectAllExtensionFunctions(node: ASTNode) : SimilarSignatures { val extensionFunctionList = node.findAllNodesWithSpecificType(FUN).filter { it.hasChildOfType(TYPE_REFERENCE) && it.hasChildOfType(DOT) } - val distinctFunctionSignatures = mutableMapOf() - val extensionFunctions = mutableListOf>() + val distinctFunctionSignatures = mutableMapOf() // maps function signatures on node it is used by + val extensionFunctionsPairs = mutableListOf>() // pairs extension functions with same signature extensionFunctionList.forEach { val functionName = (it.psi as KtNamedFunction).name!! @@ -85,9 +85,10 @@ class ExtensionFunctionsSameNameRule(private val configRules: List) val returnType = it.findChildAfter(COLON, TYPE_REFERENCE)?.text val className = it.findChildBefore(DOT, TYPE_REFERENCE)!!.text val signature = FunctionSignature(functionName, params, returnType) + if (distinctFunctionSignatures.contains(signature)) { val secondFuncClassName = distinctFunctionSignatures[signature]!!.findChildBefore(DOT, TYPE_REFERENCE)!!.text - extensionFunctions.add(Pair( + extensionFunctionsPairs.add(Pair( ExtensionFunction(secondFuncClassName, signature, distinctFunctionSignatures[signature]!!), ExtensionFunction(className, signature, it))) } else { @@ -95,7 +96,7 @@ class ExtensionFunctionsSameNameRule(private val configRules: List) } } - return extensionFunctions + return extensionFunctionsPairs } private fun handleFunctions(relatedClasses: RelatedClasses, functions: SimilarSignatures) { diff --git a/diktat-rules/src/test/kotlin/org/cqfn/diktat/ruleset/chapter6/ExtensionFunctionsSameNameWarnTest.kt b/diktat-rules/src/test/kotlin/org/cqfn/diktat/ruleset/chapter6/ExtensionFunctionsSameNameWarnTest.kt index 28f2d3decf..6711367634 100644 --- a/diktat-rules/src/test/kotlin/org/cqfn/diktat/ruleset/chapter6/ExtensionFunctionsSameNameWarnTest.kt +++ b/diktat-rules/src/test/kotlin/org/cqfn/diktat/ruleset/chapter6/ExtensionFunctionsSameNameWarnTest.kt @@ -1,6 +1,7 @@ package org.cqfn.diktat.ruleset.chapter6 import com.pinterest.ktlint.core.LintError +import generated.WarningNames.EXTENSION_FUNCTION_SAME_SIGNATURE import org.cqfn.diktat.ruleset.constants.Warnings import org.cqfn.diktat.ruleset.rules.DIKTAT_RULE_SET_ID import org.cqfn.diktat.ruleset.rules.ExtensionFunctionsSameNameRule @@ -12,6 +13,7 @@ class ExtensionFunctionsSameNameWarnTest : LintTestBase(::ExtensionFunctionsSame private val ruleId = "$DIKTAT_RULE_SET_ID:extension-functions-same-name" @Test + @Tag(EXTENSION_FUNCTION_SAME_SIGNATURE) fun `should trigger on functions with same signatures`() { lintMethod( """ @@ -31,6 +33,7 @@ class ExtensionFunctionsSameNameWarnTest : LintTestBase(::ExtensionFunctionsSame } @Test + @Tag(EXTENSION_FUNCTION_SAME_SIGNATURE) fun `should not trigger on functions with different signatures`() { lintMethod( """ @@ -48,6 +51,7 @@ class ExtensionFunctionsSameNameWarnTest : LintTestBase(::ExtensionFunctionsSame } @Test + @Tag(EXTENSION_FUNCTION_SAME_SIGNATURE) fun `should not trigger on functions with unrelated classes`() { lintMethod( """ @@ -64,4 +68,23 @@ class ExtensionFunctionsSameNameWarnTest : LintTestBase(::ExtensionFunctionsSame """.trimMargin() ) } + + @Test + @Tag(EXTENSION_FUNCTION_SAME_SIGNATURE) + fun `should not trigger on regular func`() { + lintMethod( + """ + |interface A + |class B: A + |class C + | + |fun foo() = "C" + |fun bar() = "B" + | + |fun printClassName(s: A) { print(s.foo()) } + | + |fun main() { printClassName(B()) } + """.trimMargin() + ) + } } \ No newline at end of file