From 13975778c535c76a1c4c545af1edf3033a2a97ef Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 10 Aug 2016 15:44:53 +0300 Subject: [PATCH] Unused symbol: handling of import as alias not only for objects / enums #KT-11933 Fixed --- .../idea/inspections/UnusedSymbolInspection.kt | 6 +++--- .../quickfix/removeUnused/usedClassAsAlias.kt | 10 ++++++++++ .../quickfix/removeUnused/usedFunAsAlias.kt | 11 +++++++++++ ...usedObjectAsAliasMulti.before.Dependency.kt | 5 +++++ .../usedObjectAsAliasMulti.before.Main.kt | 3 +++ .../quickfix/removeUnused/usedVarAsAlias.kt | 9 +++++++++ .../QuickFixMultiFileTestGenerated.java | 15 +++++++++++++++ .../idea/quickfix/QuickFixTestGenerated.java | 18 ++++++++++++++++++ 8 files changed, 74 insertions(+), 3 deletions(-) create mode 100644 idea/testData/quickfix/removeUnused/usedClassAsAlias.kt create mode 100644 idea/testData/quickfix/removeUnused/usedFunAsAlias.kt create mode 100644 idea/testData/quickfix/removeUnused/usedObjectAsAliasMulti.before.Dependency.kt create mode 100644 idea/testData/quickfix/removeUnused/usedObjectAsAliasMulti.before.Main.kt create mode 100644 idea/testData/quickfix/removeUnused/usedVarAsAlias.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedSymbolInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedSymbolInspection.kt index aaf67fea070..a65f1702848 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedSymbolInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedSymbolInspection.kt @@ -244,6 +244,9 @@ class UnusedSymbolInspection : AbstractKotlinInspection() { val import = ref.element.getParentOfType(false) if (import != null) { + if (import.aliasName != null && import.aliasName != declaration.name) { + return false + } // check if we import member(s) from object or enum and search for their usages if (declaration is KtObjectDeclaration || (declaration is KtClass && declaration.isEnum())) { if (import.isAllUnder) { @@ -251,9 +254,6 @@ class UnusedSymbolInspection : AbstractKotlinInspection() { as? KtClassOrObject ?: return true return importedFrom.declarations.none { it is KtNamedDeclaration && hasNonTrivialUsages(it) } } - else if (import.aliasName != null && import.aliasName != declaration.name) { - return false - } else { if (import.importedFqName != declaration.fqName) { val importedDeclaration = import.importedReference?.getQualifiedElementSelector()?.mainReference?.resolve() as? KtNamedDeclaration diff --git a/idea/testData/quickfix/removeUnused/usedClassAsAlias.kt b/idea/testData/quickfix/removeUnused/usedClassAsAlias.kt new file mode 100644 index 00000000000..8edabb624e2 --- /dev/null +++ b/idea/testData/quickfix/removeUnused/usedClassAsAlias.kt @@ -0,0 +1,10 @@ +// "Safe delete 'Imported'" "false" +// ACTION: Create test +// ACTION: Move 'ImportedClass' to separate file +import ImportedClass as ClassAlias + +class ImportedClass + +fun use() { + ClassAlias().hashCode() +} \ No newline at end of file diff --git a/idea/testData/quickfix/removeUnused/usedFunAsAlias.kt b/idea/testData/quickfix/removeUnused/usedFunAsAlias.kt new file mode 100644 index 00000000000..2c24f062f3e --- /dev/null +++ b/idea/testData/quickfix/removeUnused/usedFunAsAlias.kt @@ -0,0 +1,11 @@ +// "Safe delete 'useMe'" "false" +// ACTION: Convert function to property +// ACTION: Convert to block body +// ACTION: Create test +// ACTION: Specify return type explicitly + +import useMe as used + +fun useMe() = 0 + +fun foo() = used() \ No newline at end of file diff --git a/idea/testData/quickfix/removeUnused/usedObjectAsAliasMulti.before.Dependency.kt b/idea/testData/quickfix/removeUnused/usedObjectAsAliasMulti.before.Dependency.kt new file mode 100644 index 00000000000..01cb271c16c --- /dev/null +++ b/idea/testData/quickfix/removeUnused/usedObjectAsAliasMulti.before.Dependency.kt @@ -0,0 +1,5 @@ +import Imported as Alias + +fun foo() { + Alias.hashCode() +} diff --git a/idea/testData/quickfix/removeUnused/usedObjectAsAliasMulti.before.Main.kt b/idea/testData/quickfix/removeUnused/usedObjectAsAliasMulti.before.Main.kt new file mode 100644 index 00000000000..506b2eb6698 --- /dev/null +++ b/idea/testData/quickfix/removeUnused/usedObjectAsAliasMulti.before.Main.kt @@ -0,0 +1,3 @@ +// "Safe delete 'Imported'" "false" +// ACTION: Create test +object Imported \ No newline at end of file diff --git a/idea/testData/quickfix/removeUnused/usedVarAsAlias.kt b/idea/testData/quickfix/removeUnused/usedVarAsAlias.kt new file mode 100644 index 00000000000..468c7aa3e5d --- /dev/null +++ b/idea/testData/quickfix/removeUnused/usedVarAsAlias.kt @@ -0,0 +1,9 @@ +// "Safe delete 'usedVar'" "false" +// ACTION: Specify type explicitly +import usedVar as used + +var usedVar = 0 + +fun foo() { + used++ +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java index 71f2af679b4..68a82071ad6 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java @@ -1529,6 +1529,21 @@ public class QuickFixMultiFileTestGenerated extends AbstractQuickFixMultiFileTes } + @TestMetadata("idea/testData/quickfix/removeUnused") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class RemoveUnused extends AbstractQuickFixMultiFileTest { + public void testAllFilesPresentInRemoveUnused() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/removeUnused"), Pattern.compile("^(\\w+)\\.((before\\.Main\\.\\w+)|(test))$"), true); + } + + @TestMetadata("usedObjectAsAliasMulti.before.Main.kt") + public void testUsedObjectAsAliasMulti() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/removeUnused/usedObjectAsAliasMulti.before.Main.kt"); + doTestWithExtraFile(fileName); + } + } + @TestMetadata("idea/testData/quickfix/suppress") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index c1bccd30971..c55c2d471e5 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -6856,11 +6856,29 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("usedClassAsAlias.kt") + public void testUsedClassAsAlias() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/removeUnused/usedClassAsAlias.kt"); + doTest(fileName); + } + + @TestMetadata("usedFunAsAlias.kt") + public void testUsedFunAsAlias() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/removeUnused/usedFunAsAlias.kt"); + doTest(fileName); + } + @TestMetadata("usedObjectAsAlias.kt") public void testUsedObjectAsAlias() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/removeUnused/usedObjectAsAlias.kt"); doTest(fileName); } + + @TestMetadata("usedVarAsAlias.kt") + public void testUsedVarAsAlias() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/removeUnused/usedVarAsAlias.kt"); + doTest(fileName); + } } @TestMetadata("idea/testData/quickfix/removeUnusedReceiver")