Unused object.
unusedButEntryPointMain for class was actually a wrong test: it didn't check anything, because objects are were not checked for unusedness before.
This commit is contained in:
@@ -118,6 +118,7 @@ goto.super.property.chooser.title=Choose super property
|
|||||||
goto.super.class.chooser.title=Choose super class or interface
|
goto.super.class.chooser.title=Choose super class or interface
|
||||||
|
|
||||||
unused.class=Class ''{0}'' is never used
|
unused.class=Class ''{0}'' is never used
|
||||||
|
unused.object=Object ''{0}'' is never used
|
||||||
unused.function=Function ''{0}'' is never used
|
unused.function=Function ''{0}'' is never used
|
||||||
unused.property=Property ''{0}'' is never used
|
unused.property=Property ''{0}'' is never used
|
||||||
unused.type.parameter=Type parameter ''{0}'' is never used
|
unused.type.parameter=Type parameter ''{0}'' is never used
|
||||||
|
|||||||
@@ -59,6 +59,8 @@ import com.intellij.codeInsight.daemon.QuickFixBundle
|
|||||||
import com.intellij.codeInsight.FileModificationService
|
import com.intellij.codeInsight.FileModificationService
|
||||||
import com.intellij.refactoring.safeDelete.SafeDeleteHandler
|
import com.intellij.refactoring.safeDelete.SafeDeleteHandler
|
||||||
import org.jetbrains.kotlin.psi.JetPsiUtil
|
import org.jetbrains.kotlin.psi.JetPsiUtil
|
||||||
|
import org.jetbrains.kotlin.psi.JetObjectDeclaration
|
||||||
|
import org.jetbrains.kotlin.psi.JetClassOrObject
|
||||||
|
|
||||||
public class UnusedSymbolInspection : AbstractKotlinInspection() {
|
public class UnusedSymbolInspection : AbstractKotlinInspection() {
|
||||||
private val javaInspection = UnusedDeclarationInspection()
|
private val javaInspection = UnusedDeclarationInspection()
|
||||||
@@ -83,6 +85,7 @@ public class UnusedSymbolInspection : AbstractKotlinInspection() {
|
|||||||
override fun visitNamedDeclaration(declaration: JetNamedDeclaration) {
|
override fun visitNamedDeclaration(declaration: JetNamedDeclaration) {
|
||||||
val messageKey = when (declaration) {
|
val messageKey = when (declaration) {
|
||||||
is JetClass -> "unused.class"
|
is JetClass -> "unused.class"
|
||||||
|
is JetObjectDeclaration -> "unused.object"
|
||||||
is JetNamedFunction -> "unused.function"
|
is JetNamedFunction -> "unused.function"
|
||||||
is JetProperty, is JetParameter -> "unused.property"
|
is JetProperty, is JetParameter -> "unused.property"
|
||||||
is JetTypeParameter -> "unused.type.parameter"
|
is JetTypeParameter -> "unused.type.parameter"
|
||||||
@@ -104,7 +107,7 @@ public class UnusedSymbolInspection : AbstractKotlinInspection() {
|
|||||||
|
|
||||||
// Main checks: finding reference usages && text usages
|
// Main checks: finding reference usages && text usages
|
||||||
if (hasNonTrivialUsages(declaration)) return
|
if (hasNonTrivialUsages(declaration)) return
|
||||||
if (declaration is JetClass && classHasTextUsages(declaration)) return
|
if (declaration is JetClassOrObject && classOrObjectHasTextUsages(declaration)) return
|
||||||
|
|
||||||
holder.registerProblem(
|
holder.registerProblem(
|
||||||
declaration.getNameIdentifier(),
|
declaration.getNameIdentifier(),
|
||||||
@@ -118,23 +121,23 @@ public class UnusedSymbolInspection : AbstractKotlinInspection() {
|
|||||||
|
|
||||||
private fun isEntryPoint(declaration: JetNamedDeclaration): Boolean {
|
private fun isEntryPoint(declaration: JetNamedDeclaration): Boolean {
|
||||||
val lightElement: PsiElement? = when (declaration) {
|
val lightElement: PsiElement? = when (declaration) {
|
||||||
is JetClass -> declaration.toLightClass()
|
is JetClassOrObject -> declaration.toLightClass()
|
||||||
is JetNamedFunction -> LightClassUtil.getLightClassMethod(declaration)
|
is JetNamedFunction -> LightClassUtil.getLightClassMethod(declaration)
|
||||||
else -> return false
|
else -> return false
|
||||||
}
|
}
|
||||||
return lightElement != null && javaInspection.isEntryPoint(lightElement)
|
return lightElement != null && javaInspection.isEntryPoint(lightElement)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun classHasTextUsages(klass: JetClass): Boolean {
|
private fun classOrObjectHasTextUsages(classOrObject: JetClassOrObject): Boolean {
|
||||||
var hasTextUsages = false
|
var hasTextUsages = false
|
||||||
|
|
||||||
// Finding text usages
|
// Finding text usages
|
||||||
if (klass.getUseScope() is GlobalSearchScope) {
|
if (classOrObject.getUseScope() is GlobalSearchScope) {
|
||||||
val findClassUsagesHandler = KotlinFindClassUsagesHandler(klass, KotlinFindUsagesHandlerFactory(klass.getProject()))
|
val findClassUsagesHandler = KotlinFindClassUsagesHandler(classOrObject, KotlinFindUsagesHandlerFactory(classOrObject.getProject()))
|
||||||
findClassUsagesHandler.processUsagesInText(
|
findClassUsagesHandler.processUsagesInText(
|
||||||
klass,
|
classOrObject,
|
||||||
{ hasTextUsages = true; false },
|
{ hasTextUsages = true; false },
|
||||||
GlobalSearchScope.projectScope(klass.getProject())
|
GlobalSearchScope.projectScope(classOrObject.getProject())
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
object EntryPoint {
|
|
||||||
fun main(args: Array<String>) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
<problems>
|
||||||
|
<problem>
|
||||||
|
<file>unused.kt</file>
|
||||||
|
<line>1</line>
|
||||||
|
<module>light_idea_test_case</module>
|
||||||
|
<entry_point TYPE="file" FQNAME="temp:///src/unused.kt" />
|
||||||
|
<problem_class severity="WARNING" attribute_key="NOT_USED_ELEMENT_ATTRIBUTES">Unused Symbol</problem_class>
|
||||||
|
<description>Object 'A' is never used</description>
|
||||||
|
</problem>
|
||||||
|
<problem>
|
||||||
|
<file>usedOnlyInside.kt</file>
|
||||||
|
<line>1</line>
|
||||||
|
<module>light_idea_test_case</module>
|
||||||
|
<entry_point TYPE="file" FQNAME="temp:///src/usedOnlyInside.kt" />
|
||||||
|
<problem_class severity="WARNING" attribute_key="NOT_USED_ELEMENT_ATTRIBUTES">Unused Symbol</problem_class>
|
||||||
|
<description>Object 'A' is never used</description>
|
||||||
|
</problem>
|
||||||
|
<problem>
|
||||||
|
<file>usedInTextByShortName.kt</file>
|
||||||
|
<line>3</line>
|
||||||
|
<module>light_idea_test_case</module>
|
||||||
|
<entry_point TYPE="file" FQNAME="temp:///src/usedInTextByShortName.kt" />
|
||||||
|
<problem_class severity="WARNING" attribute_key="NOT_USED_ELEMENT_ATTRIBUTES">Unused Symbol</problem_class>
|
||||||
|
<description>Object 'UsedInTextByShortName' is never used</description>
|
||||||
|
</problem>
|
||||||
|
<problem>
|
||||||
|
<file>usedOnlyInImport.kt</file>
|
||||||
|
<line>3</line>
|
||||||
|
<module>light_idea_test_case</module>
|
||||||
|
<entry_point TYPE="file" FQNAME="temp:///src/usedOnlyInImport.kt" />
|
||||||
|
<problem_class severity="WARNING" attribute_key="NOT_USED_ELEMENT_ATTRIBUTES">Unused Symbol</problem_class>
|
||||||
|
<description>Object 'A' is never used</description>
|
||||||
|
</problem>
|
||||||
|
</problems>
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
// INSPECTION_CLASS: org.jetbrains.kotlin.idea.inspections.UnusedSymbolInspection
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
object A
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package entryPoint
|
||||||
|
|
||||||
|
// WITH_RUNTIME
|
||||||
|
|
||||||
|
import kotlin.platform.platformStatic
|
||||||
|
|
||||||
|
object EntryPoint {
|
||||||
|
platformStatic public fun main(args: Array<String>) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
object A
|
||||||
|
|
||||||
|
fun main(args: Array<String>) {
|
||||||
|
val x = A
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
class RandomJavaClass {
|
||||||
|
void f() {
|
||||||
|
foo.UsedInJava.INSTANCE$.bar();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package foo
|
||||||
|
|
||||||
|
object UsedInJava {
|
||||||
|
fun bar() {
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
package foo
|
||||||
|
|
||||||
|
object UsedInTextOnly
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
foo.UsedInTextOnly
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
package foo
|
||||||
|
|
||||||
|
object UsedInTextByShortName
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
UsedInTextByShortName
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
package foo
|
||||||
|
|
||||||
|
object UsedInXmlOnly
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
<a b="foo.UsedInXmlOnly"/>
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
import A
|
||||||
|
|
||||||
|
object A {
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
object A {
|
||||||
|
fun foo() {
|
||||||
|
A.bar()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun bar() {
|
||||||
|
A.foo()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -90,6 +90,12 @@ public class JetInspectionTestGenerated extends AbstractJetInspectionTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("unusedSymbol/object/inspectionData/inspections.test")
|
||||||
|
public void testUnusedSymbol_object_inspectionData_Inspections_test() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/inspections/unusedSymbol/object/inspectionData/inspections.test");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("unusedSymbol/parameter/inspectionData/inspections.test")
|
@TestMetadata("unusedSymbol/parameter/inspectionData/inspections.test")
|
||||||
public void testUnusedSymbol_parameter_inspectionData_Inspections_test() throws Exception {
|
public void testUnusedSymbol_parameter_inspectionData_Inspections_test() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/inspections/unusedSymbol/parameter/inspectionData/inspections.test");
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/inspections/unusedSymbol/parameter/inspectionData/inspections.test");
|
||||||
|
|||||||
Reference in New Issue
Block a user