Skip to content

Commit

Permalink
Redundant qualifier name: don't report for EnumClass.Companion
Browse files Browse the repository at this point in the history
#KT-37181 Fixed
  • Loading branch information
t-kameyama authored and vladimirdolzhenko committed Apr 16, 2020
1 parent f747f85 commit 831fbba
Show file tree
Hide file tree
Showing 5 changed files with 77 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import org.jetbrains.kotlin.resolve.ImportedFromObjectCallableDescriptor
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
import org.jetbrains.kotlin.resolve.descriptorUtil.isCompanionObject
import org.jetbrains.kotlin.resolve.scopes.utils.findFirstClassifierWithDeprecationStatus
import org.jetbrains.kotlin.utils.addToStdlib.safeAs

class RemoveRedundantQualifierNameInspection : AbstractKotlinInspection(), CleanupLocalInspectionTool {
companion object {
Expand All @@ -48,15 +49,17 @@ class RemoveRedundantQualifierNameInspection : AbstractKotlinInspection(), Clean
else
expressionForAnalyze

val receiverReference = expressionForAnalyze.receiverExpression.mainReference?.resolve()
val receiverReference = expressionForAnalyze.receiverExpression.let {
it.safeAs<KtQualifiedExpression>()?.receiverExpression ?: it
}.mainReference?.resolve()
val parentEnumEntry = expressionForAnalyze.getStrictParentOfType<KtEnumEntry>()
if (parentEnumEntry != null) {
val companionObject = (receiverReference as? KtObjectDeclaration)?.takeIf { it.isCompanion() }
if (companionObject?.containingClass() == parentEnumEntry.getStrictParentOfType<KtClass>()) return
}
if ((receiverReference as? KtClass)?.isEnum() == true
if (receiverReference?.safeAs<KtClass>()?.isEnum() == true
&& expressionForAnalyze.getParentOfTypesAndPredicate(true, KtClass::class.java) { it.isEnum() } != receiverReference
&& expressionForAnalyze.isEnumStaticMethodCall()
&& (expressionForAnalyze.isEnumStaticMethodCall() || expressionForAnalyze.isCompanionObjectReference())
) return

val context = originalExpression.analyze()
Expand Down Expand Up @@ -87,6 +90,11 @@ class RemoveRedundantQualifierNameInspection : AbstractKotlinInspection(), Clean
}

private fun KtDotQualifiedExpression.isEnumStaticMethodCall() = callExpression?.calleeExpression?.text in ENUM_STATIC_METHODS

private fun KtDotQualifiedExpression.isCompanionObjectReference(): Boolean {
val selector = receiverExpression.safeAs<KtDotQualifiedExpression>()?.selectorExpression ?: selectorExpression
return selector?.referenceExpression()?.mainReference?.resolve()?.safeAs<KtObjectDeclaration>()?.isCompanion() == true
}
}

private tailrec fun KtDotQualifiedExpression.firstExpressionWithoutReceiver(): KtDotQualifiedExpression? = if (hasNotReceiver())
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// PROBLEM: none
package foo.bar

import foo.bar.MyEnum.*

enum class MyEnum(val id: Int) {
A(1),
B(2);

companion object {
fun baz() = ""
}
}

fun test() {
<caret>MyEnum.Companion::baz
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// PROBLEM: none
package foo.bar

import foo.bar.MyEnum.*

enum class MyEnum(val id: Int) {
A(1),
B(2);

companion object O {
fun baz() = ""
}
}

fun test() {
<caret>MyEnum.O::baz
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// PROBLEM: none
package foo.bar

import foo.bar.MyEnum.*

enum class MyEnum(val id: Int) {
A(1),
B(2);

companion object {
fun baz() = ""
}
}

fun test() {
<caret>MyEnum.Companion.baz()
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 831fbba

Please sign in to comment.