Create rule S6519(Kotlin): Structural equality tests should use "==" (#1630)

This commit is contained in:
github-actions[bot] 2023-03-21 10:20:03 +01:00 committed by GitHub
parent c5f9eb2b0c
commit e2e03e117d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 84 additions and 0 deletions

View File

@ -0,0 +1,17 @@
{
"title": "Structural equality tests should use \"==\"",
"type": "CODE_SMELL",
"status": "ready",
"remediation": {
"func": "Constant\/Issue",
"constantCost": "5min"
},
"tags": [
],
"defaultSeverity": "Major",
"ruleSpecification": "RSPEC-6519",
"sqKey": "S6519",
"scope": "All",
"defaultQualityProfiles": ["Sonar way"],
"quickfix": "unknown"
}

View File

@ -0,0 +1,65 @@
== Why is this an issue?
In Kotlin, `==` means structural equality and maps to the left-side term's `equals()` function.
It is, therefore, redundant to call `equals()` as a function.
Also, `==` is more general than `equals()` because it allows either of both operands to be `null`.
Developers using `equals()` instead of `==` is often the result of adapting
styles from other languages like Java, where `==` means reference equality.
=== What is the potential impact?
==== Wrong logic
`==` allows either of both operands to be `null`, while `equals()` doesn't.
==== Readability and Understanding
The `==` operator is a more concise and elegant way to test structural equality than calling a function.
== How to fix it
Replace `a.equals(b)` with `a == b`.
=== Code examples
==== Noncompliant code example
[source,kotlin]
----
data class Person(
val name: String,
val firstName: String,
val age: Int,
val address: String
)
----
[source,kotlin,diff-id=1,diff-type=noncompliant]
----
fun checkEquality() {
val personA = Person("Claus", "Santa", 200, "North Pole")
val personB = Person("Nicholas", "Saint", 1700, "Myra")
personA.name.equals(personB.name) // Noncompliant, should use `==` instead
personA.equals(personB) // Noncompliant, should use `==` instead
}
----
==== Compliant solution
[source,kotlin,diff-id=1,diff-type=compliant]
----
fun checkEquality() {
val personA = Person("Claus", "Santa", 200, "North Pole")
val personB = Person("Nicholas", "Saint", 1700, "Myra")
personA.name == personB.name // Compliant
personA == personB // Compliant
}
----
== Resources
=== Documentation
* https://kotlinlang.org/docs/operator-overloading.html#equality-and-inequality-operators[Kotlin Docs, Equality and inequality operators]

View File

@ -0,0 +1,2 @@
{
}