From 82108b7d24794288571a2f5bd6100b6417a67b5c Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Sun, 21 Jun 2020 16:24:42 +0900 Subject: [PATCH] UnusedPrivateClass: don't report imported classes (#2812) --- .../detekt/rules/style/UnusedPrivateClass.kt | 15 +++++++++++- .../rules/style/UnusedPrivateClassSpec.kt | 23 +++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/detekt-rules/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnusedPrivateClass.kt b/detekt-rules/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnusedPrivateClass.kt index 1b81d198f..863d4f44c 100644 --- a/detekt-rules/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnusedPrivateClass.kt +++ b/detekt-rules/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnusedPrivateClass.kt @@ -18,6 +18,7 @@ import org.jetbrains.kotlin.psi.KtDoubleColonExpression import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFunctionType +import org.jetbrains.kotlin.psi.KtImportDirective import org.jetbrains.kotlin.psi.KtNameReferenceExpression import org.jetbrains.kotlin.psi.KtNamedDeclaration import org.jetbrains.kotlin.psi.KtNamedFunction @@ -63,9 +64,16 @@ class UnusedPrivateClass(config: Config = Config.empty) : Rule(config) { private val privateClasses = mutableSetOf() private val namedClasses = mutableSetOf() + private val importDirectives = mutableSetOf() fun getUnusedClasses(): List { - return privateClasses.filter { it.nameAsSafeName.identifier !in namedClasses } + return privateClasses.filter { !it.isUsed() } + } + + private fun KtNamedDeclaration.isUsed(): Boolean { + if (nameAsSafeName.identifier in namedClasses) return true + val fqName = fqName?.asString() + return fqName != null && importDirectives.any { it.startsWith(fqName) } } override fun visitClass(klass: KtClass) { @@ -78,6 +86,11 @@ class UnusedPrivateClass(config: Config = Config.empty) : Rule(config) { super.visitClass(klass) } + override fun visitImportDirective(importDirective: KtImportDirective) { + importDirectives.addIfNotNull(importDirective.importedFqName?.asString()) + super.visitImportDirective(importDirective) + } + override fun visitAnnotationEntry(annotationEntry: KtAnnotationEntry) { namedClasses.addIfNotNull(annotationEntry.typeReference?.text) super.visitAnnotationEntry(annotationEntry) diff --git a/detekt-rules/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnusedPrivateClassSpec.kt b/detekt-rules/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnusedPrivateClassSpec.kt index ccd77fc90..37aaedb75 100644 --- a/detekt-rules/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnusedPrivateClassSpec.kt +++ b/detekt-rules/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnusedPrivateClassSpec.kt @@ -1,6 +1,7 @@ package io.gitlab.arturbosch.detekt.rules.style import io.gitlab.arturbosch.detekt.test.compileAndLint +import io.gitlab.arturbosch.detekt.test.lint import org.assertj.core.api.Assertions.assertThat import org.spekframework.spek2.Spek import org.spekframework.spek2.style.specification.describe @@ -361,5 +362,27 @@ class UnusedPrivateClassSpec : Spek({ assertThat(findings).isEmpty() } + + it("does not report imported enum class - #2809") { + val code = """ + package com.example + + import com.example.C.E.E1 + + class C { + fun test() { + println(E1) + } + + private enum class E { + E1, + E2, + E3 + } + } + """ + val findings = UnusedPrivateClass().lint(code) + assertThat(findings).isEmpty() + } } })