Skip to content

Commit

Permalink
feature/rule-6.2.2(#447)
Browse files Browse the repository at this point in the history
### What's done:
  * Added rule logic
  * Added warn tests
  • Loading branch information
aktsay6 committed Nov 7, 2020
1 parent 0af4041 commit 946c05f
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ import org.jetbrains.kotlin.psi.KtClass
import org.jetbrains.kotlin.psi.KtNamedFunction

typealias RelatedClasses = List<Pair<String, String>>
typealias SimilarSignatures = List<Pair<ExtensionFunctionsSameNameRule.ExtensionFunction, ExtensionFunctionsSameNameRule.ExtensionFunction>>
typealias SimilarSignatures = List<Pair<ExtensionFunctionsSameNameRule.ExtensionFunction, ExtensionFunctionsSameNameRule.ExtensionFunction>>

/**
* This rule checks if extension functions with the same signature don't have related classes
Expand All @@ -42,7 +42,7 @@ class ExtensionFunctionsSameNameRule(private val configRules: List<RulesConfig>)
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
*/
Expand Down Expand Up @@ -76,26 +76,27 @@ class ExtensionFunctionsSameNameRule(private val configRules: List<RulesConfig>)

private fun collectAllExtensionFunctions(node: ASTNode) : SimilarSignatures {
val extensionFunctionList = node.findAllNodesWithSpecificType(FUN).filter { it.hasChildOfType(TYPE_REFERENCE) && it.hasChildOfType(DOT) }
val distinctFunctionSignatures = mutableMapOf<FunctionSignature, ASTNode>()
val extensionFunctions = mutableListOf<Pair<ExtensionFunction, ExtensionFunction>>()
val distinctFunctionSignatures = mutableMapOf<FunctionSignature, ASTNode>() // maps function signatures on node it is used by
val extensionFunctionsPairs = mutableListOf<Pair<ExtensionFunction, ExtensionFunction>>() // pairs extension functions with same signature

extensionFunctionList.forEach {
val functionName = (it.psi as KtNamedFunction).name!!
val params = it.getFirstChildWithType(VALUE_PARAMETER_LIST)!!.text
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 {
distinctFunctionSignatures[signature] = it
}
}

return extensionFunctions
return extensionFunctionsPairs
}

private fun handleFunctions(relatedClasses: RelatedClasses, functions: SimilarSignatures) {
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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(
"""
Expand All @@ -31,6 +33,7 @@ class ExtensionFunctionsSameNameWarnTest : LintTestBase(::ExtensionFunctionsSame
}

@Test
@Tag(EXTENSION_FUNCTION_SAME_SIGNATURE)
fun `should not trigger on functions with different signatures`() {
lintMethod(
"""
Expand All @@ -48,6 +51,7 @@ class ExtensionFunctionsSameNameWarnTest : LintTestBase(::ExtensionFunctionsSame
}

@Test
@Tag(EXTENSION_FUNCTION_SAME_SIGNATURE)
fun `should not trigger on functions with unrelated classes`() {
lintMethod(
"""
Expand All @@ -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()
)
}
}

0 comments on commit 946c05f

Please sign in to comment.