diff --git a/plugins/kotlin/fir/src/org/jetbrains/kotlin/idea/fir/applicators/ApplicabilityRanges.kt b/plugins/kotlin/fir/src/org/jetbrains/kotlin/idea/fir/applicators/ApplicabilityRanges.kt index 0ac7e1ba6ea7..0acb01da4945 100644 --- a/plugins/kotlin/fir/src/org/jetbrains/kotlin/idea/fir/applicators/ApplicabilityRanges.kt +++ b/plugins/kotlin/fir/src/org/jetbrains/kotlin/idea/fir/applicators/ApplicabilityRanges.kt @@ -7,11 +7,9 @@ import com.intellij.psi.PsiElement import com.intellij.psi.tree.TokenSet import org.jetbrains.kotlin.idea.fir.api.applicator.applicabilityRanges import org.jetbrains.kotlin.idea.fir.api.applicator.applicabilityTarget +import org.jetbrains.kotlin.idea.util.nameIdentifierTextRangeInThis import org.jetbrains.kotlin.lexer.KtTokens -import org.jetbrains.kotlin.psi.KtCallableDeclaration -import org.jetbrains.kotlin.psi.KtLambdaExpression -import org.jetbrains.kotlin.psi.KtModifierListOwner -import org.jetbrains.kotlin.psi.KtValueArgument +import org.jetbrains.kotlin.psi.* object ApplicabilityRanges { val SELF = applicabilityTarget { it } @@ -37,4 +35,8 @@ object ApplicabilityRanges { listOf(TextRange(0, element.textLength)) } } + + val DECLARATION_NAME = applicabilityTarget { element -> + element.nameIdentifier + } } \ No newline at end of file diff --git a/plugins/kotlin/fir/src/org/jetbrains/kotlin/idea/fir/inspections/diagnosticBased/HLUnusedVariableInspection.kt b/plugins/kotlin/fir/src/org/jetbrains/kotlin/idea/fir/inspections/diagnosticBased/HLUnusedVariableInspection.kt new file mode 100644 index 000000000000..848b46d71a55 --- /dev/null +++ b/plugins/kotlin/fir/src/org/jetbrains/kotlin/idea/fir/inspections/diagnosticBased/HLUnusedVariableInspection.kt @@ -0,0 +1,50 @@ +// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. + +package org.jetbrains.kotlin.idea.fir.inspections.diagnosticBased + +import org.jetbrains.kotlin.idea.quickfix.RemovePsiElementSimpleFix +import com.intellij.codeInspection.ProblemHighlightType +import org.jetbrains.kotlin.analysis.api.fir.diagnostics.KtFirDiagnostic +import org.jetbrains.kotlin.idea.KotlinBundle +import org.jetbrains.kotlin.idea.api.applicator.HLApplicator +import org.jetbrains.kotlin.idea.api.applicator.HLApplicatorInput +import org.jetbrains.kotlin.idea.api.applicator.applicator +import org.jetbrains.kotlin.idea.fir.api.AbstractHLDiagnosticBasedInspection +import org.jetbrains.kotlin.idea.fir.api.HLInputByDiagnosticProvider +import org.jetbrains.kotlin.idea.fir.api.applicator.HLApplicabilityRange +import org.jetbrains.kotlin.idea.fir.api.applicator.HLPresentation +import org.jetbrains.kotlin.idea.fir.api.applicator.presentation +import org.jetbrains.kotlin.idea.fir.api.inputByDiagnosticProvider +import org.jetbrains.kotlin.idea.fir.applicators.ApplicabilityRanges +import org.jetbrains.kotlin.idea.util.isExplicitTypeReferenceNeededForTypeInference +import org.jetbrains.kotlin.psi.KtNamedDeclaration +import org.jetbrains.kotlin.psi.KtProperty + +class HLUnusedVariableInspection : + AbstractHLDiagnosticBasedInspection( + elementType = KtNamedDeclaration::class, + diagnosticType = KtFirDiagnostic.UnusedVariable::class, + ) { + override val inputByDiagnosticProvider: HLInputByDiagnosticProvider + get() = inputByDiagnosticProvider { diagnostic -> + val ktProperty = diagnostic.psi as? KtProperty ?: return@inputByDiagnosticProvider null + if (ktProperty.isExplicitTypeReferenceNeededForTypeInference()) return@inputByDiagnosticProvider null + HLApplicatorInput.Empty + } + override val presentation: HLPresentation + get() = presentation { + highlightType(ProblemHighlightType.LIKE_UNUSED_SYMBOL) + } + override val applicabilityRange: HLApplicabilityRange + get() = ApplicabilityRanges.DECLARATION_NAME + override val applicator: HLApplicator + get() = applicator { + familyName(KotlinBundle.message("remove.element")) + actionName { psi, _ -> + KotlinBundle.message("remove.variable.0", psi.name.toString()) + } + applyTo { psi, _ -> + RemovePsiElementSimpleFix.RemoveVariableFactory.removeProperty(psi as KtProperty) + } + } +} \ No newline at end of file diff --git a/plugins/kotlin/fir/src/org/jetbrains/kotlin/idea/quickfix/MainKtQuickFixRegistrar.kt b/plugins/kotlin/fir/src/org/jetbrains/kotlin/idea/quickfix/MainKtQuickFixRegistrar.kt index 03f28a624b69..6d2d61d1180f 100644 --- a/plugins/kotlin/fir/src/org/jetbrains/kotlin/idea/quickfix/MainKtQuickFixRegistrar.kt +++ b/plugins/kotlin/fir/src/org/jetbrains/kotlin/idea/quickfix/MainKtQuickFixRegistrar.kt @@ -176,10 +176,6 @@ class MainKtQuickFixRegistrar : KtQuickFixRegistrar() { registerPsiQuickFixes(KtFirDiagnostic.NonVarargSpread::class, RemovePsiElementSimpleFix.RemoveSpreadFactory) } - private val unused = KtQuickFixesListBuilder.registerPsiQuickFix { - registerPsiQuickFixes(KtFirDiagnostic.UnusedVariable::class, RemovePsiElementSimpleFix.RemoveVariableFactory) - } - override val list: KtQuickFixesList = KtQuickFixesList.createCombined( keywords, propertyInitialization, @@ -191,6 +187,5 @@ class MainKtQuickFixRegistrar : KtQuickFixRegistrar() { typeMismatch, superKeyword, vararg, - unused, ) } diff --git a/plugins/kotlin/fir/test/org/jetbrains/kotlin/idea/fir/inspections/HLLocalInspectionTestGenerated.java b/plugins/kotlin/fir/test/org/jetbrains/kotlin/idea/fir/inspections/HLLocalInspectionTestGenerated.java index 2ecf8f74d03e..aa015567112e 100644 --- a/plugins/kotlin/fir/test/org/jetbrains/kotlin/idea/fir/inspections/HLLocalInspectionTestGenerated.java +++ b/plugins/kotlin/fir/test/org/jetbrains/kotlin/idea/fir/inspections/HLLocalInspectionTestGenerated.java @@ -18,6 +18,64 @@ import org.junit.runner.RunWith; @TestDataPath("$CONTENT_ROOT") @RunWith(JUnit3RunnerWithInners.class) public abstract class HLLocalInspectionTestGenerated extends AbstractHLLocalInspectionTest { + @RunWith(JUnit3RunnerWithInners.class) + @TestMetadata("../idea/tests/testData/inspectionsLocal/unusedVariable") + public static class UnusedVariable extends AbstractHLLocalInspectionTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); + } + + @TestMetadata("unusedVariableInDestructuringDeclaration.kt") + public void testUnusedVariableInDestructuringDeclaration() throws Exception { + runTest("../idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableInDestructuringDeclaration.kt"); + } + + @TestMetadata("unusedVariableWithAnonymousFunctionInitialize1.kt") + public void testUnusedVariableWithAnonymousFunctionInitialize1() throws Exception { + runTest("../idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithAnonymousFunctionInitialize1.kt"); + } + + @TestMetadata("unusedVariableWithAnonymousFunctionInitialize2.kt") + public void testUnusedVariableWithAnonymousFunctionInitialize2() throws Exception { + runTest("../idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithAnonymousFunctionInitialize2.kt"); + } + + @TestMetadata("unusedVariableWithConstantInitializer.kt") + public void testUnusedVariableWithConstantInitializer() throws Exception { + runTest("../idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithConstantInitializer.kt"); + } + + @TestMetadata("unusedVariableWithInitializer.kt") + public void testUnusedVariableWithInitializer() throws Exception { + runTest("../idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithInitializer.kt"); + } + + @TestMetadata("unusedVariableWithInitializerAndComment.kt") + public void testUnusedVariableWithInitializerAndComment() throws Exception { + runTest("../idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithInitializerAndComment.kt"); + } + + @TestMetadata("unusedVariableWithLambdaInitializer1.kt") + public void testUnusedVariableWithLambdaInitializer1() throws Exception { + runTest("../idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithLambdaInitializer1.kt"); + } + + @TestMetadata("unusedVariableWithLambdaInitializer2.kt") + public void testUnusedVariableWithLambdaInitializer2() throws Exception { + runTest("../idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithLambdaInitializer2.kt"); + } + + @TestMetadata("unusedVariableWithNullInitializer.kt") + public void testUnusedVariableWithNullInitializer() throws Exception { + runTest("../idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithNullInitializer.kt"); + } + + @TestMetadata("unusedVariableWithoutInitializer.kt") + public void testUnusedVariableWithoutInitializer() throws Exception { + runTest("../idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithoutInitializer.kt"); + } + } + @RunWith(JUnit3RunnerWithInners.class) @TestMetadata("../idea/tests/testData/inspectionsLocal/redundantVisibilityModifier") public static class RedundantVisibilityModifier extends AbstractHLLocalInspectionTest { diff --git a/plugins/kotlin/fir/test/org/jetbrains/kotlin/idea/fir/quickfix/HighLevelQuickFixTestGenerated.java b/plugins/kotlin/fir/test/org/jetbrains/kotlin/idea/fir/quickfix/HighLevelQuickFixTestGenerated.java index fb29f14a1bdf..396ad18ed39a 100644 --- a/plugins/kotlin/fir/test/org/jetbrains/kotlin/idea/fir/quickfix/HighLevelQuickFixTestGenerated.java +++ b/plugins/kotlin/fir/test/org/jetbrains/kotlin/idea/fir/quickfix/HighLevelQuickFixTestGenerated.java @@ -1750,64 +1750,6 @@ public abstract class HighLevelQuickFixTestGenerated extends AbstractHighLevelQu } } - @RunWith(JUnit3RunnerWithInners.class) - @TestMetadata("../idea/tests/testData/quickfix/variables") - public static class Variables extends AbstractHighLevelQuickFixTest { - private void runTest(String testDataFilePath) throws Exception { - KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); - } - - @TestMetadata("unusedVariableInDestructuringDeclaration.kt") - public void testUnusedVariableInDestructuringDeclaration() throws Exception { - runTest("../idea/tests/testData/quickfix/variables/unusedVariableInDestructuringDeclaration.kt"); - } - - @TestMetadata("unusedVariableWithAnonymousFunctionInitialize1.kt") - public void testUnusedVariableWithAnonymousFunctionInitialize1() throws Exception { - runTest("../idea/tests/testData/quickfix/variables/unusedVariableWithAnonymousFunctionInitialize1.kt"); - } - - @TestMetadata("unusedVariableWithAnonymousFunctionInitialize2.kt") - public void testUnusedVariableWithAnonymousFunctionInitialize2() throws Exception { - runTest("../idea/tests/testData/quickfix/variables/unusedVariableWithAnonymousFunctionInitialize2.kt"); - } - - @TestMetadata("unusedVariableWithConstantInitializer.kt") - public void testUnusedVariableWithConstantInitializer() throws Exception { - runTest("../idea/tests/testData/quickfix/variables/unusedVariableWithConstantInitializer.kt"); - } - - @TestMetadata("unusedVariableWithInitializer.kt") - public void testUnusedVariableWithInitializer() throws Exception { - runTest("../idea/tests/testData/quickfix/variables/unusedVariableWithInitializer.kt"); - } - - @TestMetadata("unusedVariableWithInitializerAndComment.kt") - public void testUnusedVariableWithInitializerAndComment() throws Exception { - runTest("../idea/tests/testData/quickfix/variables/unusedVariableWithInitializerAndComment.kt"); - } - - @TestMetadata("unusedVariableWithLambdaInitializer1.kt") - public void testUnusedVariableWithLambdaInitializer1() throws Exception { - runTest("../idea/tests/testData/quickfix/variables/unusedVariableWithLambdaInitializer1.kt"); - } - - @TestMetadata("unusedVariableWithLambdaInitializer2.kt") - public void testUnusedVariableWithLambdaInitializer2() throws Exception { - runTest("../idea/tests/testData/quickfix/variables/unusedVariableWithLambdaInitializer2.kt"); - } - - @TestMetadata("unusedVariableWithNullInitializer.kt") - public void testUnusedVariableWithNullInitializer() throws Exception { - runTest("../idea/tests/testData/quickfix/variables/unusedVariableWithNullInitializer.kt"); - } - - @TestMetadata("unusedVariableWithoutInitializer.kt") - public void testUnusedVariableWithoutInitializer() throws Exception { - runTest("../idea/tests/testData/quickfix/variables/unusedVariableWithoutInitializer.kt"); - } - } - @RunWith(JUnit3RunnerWithInners.class) @TestMetadata("../idea/tests/testData/quickfix/variables/changeMutability") public static class ChangeMutability extends AbstractHighLevelQuickFixTest { diff --git a/plugins/kotlin/frontend-independent/resources-en/messages/KotlinBundle.properties b/plugins/kotlin/frontend-independent/resources-en/messages/KotlinBundle.properties index 31894452c7e3..ae13303dbe42 100644 --- a/plugins/kotlin/frontend-independent/resources-en/messages/KotlinBundle.properties +++ b/plugins/kotlin/frontend-independent/resources-en/messages/KotlinBundle.properties @@ -2257,6 +2257,7 @@ inspection.overriding.deprecated.member.display.name=Overriding deprecated membe inspection.unsafe.cast.from.dynamic.display.name=Implicit (unsafe) cast from dynamic type inspection.redundant.sam.constructor.display.name=Redundant SAM constructor inspection.kotlin.unused.import.display.name=Unused import directive +inspection.kotlin.unused.variable.display.name=Unused variable inspection.unused.receiver.parameter.display.name=Unused receiver parameter inspection.unused.symbol.display.name=Unused symbol inspection.use.property.access.syntax.display.name=Accessor call that can be replaced with property access syntax diff --git a/plugins/kotlin/generators/test/org/jetbrains/kotlin/testGenerator/GenerateTests.kt b/plugins/kotlin/generators/test/org/jetbrains/kotlin/testGenerator/GenerateTests.kt index 5868066b72b3..7cddefff6190 100644 --- a/plugins/kotlin/generators/test/org/jetbrains/kotlin/testGenerator/GenerateTests.kt +++ b/plugins/kotlin/generators/test/org/jetbrains/kotlin/testGenerator/GenerateTests.kt @@ -182,10 +182,10 @@ import org.jetbrains.kotlin.testGenerator.model.Patterns.KTS import org.jetbrains.kotlin.testGenerator.model.Patterns.KT_OR_KTS import org.jetbrains.kotlin.testGenerator.model.Patterns.KT_OR_KTS_WITHOUT_DOTS import org.jetbrains.kotlin.testGenerator.model.Patterns.KT_WITHOUT_DOTS +import org.jetbrains.kotlin.testGenerator.model.Patterns.KT_WITHOUT_DOT_AND_FIR_PREFIX import org.jetbrains.kotlin.testGenerator.model.Patterns.KT_WITHOUT_FIR_PREFIX import org.jetbrains.kotlin.testGenerator.model.Patterns.TEST import org.jetbrains.kotlin.testGenerator.model.Patterns.WS_KTS -import org.jetbrains.kotlin.testGenerator.model.Patterns.KT_WITHOUT_DOT_AND_FIR_PREFIX import org.jetbrains.kotlin.tools.projectWizard.cli.AbstractProjectTemplateBuildFileGenerationTest import org.jetbrains.kotlin.tools.projectWizard.cli.AbstractYamlBuildFileGenerationTest import org.jetbrains.kotlin.tools.projectWizard.wizard.AbstractProjectTemplateNewWizardProjectImportTest @@ -516,7 +516,11 @@ private fun assembleWorkspace(): TWorkspace = workspace { } testClass { - model("inspectionsLocal", pattern = Patterns.forRegex("^([\\w\\-_]+)\\.(kt|kts)$")) + model( + "inspectionsLocal", pattern = Patterns.forRegex("^([\\w\\-_]+)\\.(kt|kts)$"), + // In FE1.0, this is a quickfix rather than a local inspection + excludedDirectories = listOf("unusedVariable") + ) } testClass { @@ -1079,7 +1083,6 @@ private fun assembleWorkspace(): TWorkspace = workspace { model("quickfix/replaceWithDotCall", pattern = pattern) model("quickfix/replaceWithSafeCall", pattern = pattern) model("quickfix/supercalls", pattern = pattern) - model("quickfix/variables", pattern = pattern, isRecursive = false) model("quickfix/variables/changeMutability", pattern = pattern, isRecursive = false) model("quickfix/variables/removeValVarFromParameter", pattern = pattern) model("quickfix/when", pattern = pattern) @@ -1133,6 +1136,7 @@ private fun assembleWorkspace(): TWorkspace = workspace { /*testGroup("fir", testDataPath = "..") { testClass { val pattern = Patterns.forRegex("^([\\w\\-_]+)\\.(kt|kts)$") + model("idea/tests/testData/inspectionsLocal/unusedVariable", pattern = pattern) model("idea/tests/testData/inspectionsLocal/redundantVisibilityModifier", pattern = pattern) model("fir/testData/inspectionsLocal", pattern = pattern) } diff --git a/plugins/kotlin/idea/resources-en/inspectionDescriptions/HLUnusedVariable.html b/plugins/kotlin/idea/resources-en/inspectionDescriptions/HLUnusedVariable.html new file mode 100644 index 000000000000..a33cebf9a390 --- /dev/null +++ b/plugins/kotlin/idea/resources-en/inspectionDescriptions/HLUnusedVariable.html @@ -0,0 +1,5 @@ + + +This inspection reports variables that are not used. + + diff --git a/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/.firInspection b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/.firInspection new file mode 100644 index 000000000000..da78fe3a1999 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/.firInspection @@ -0,0 +1 @@ +org.jetbrains.kotlin.idea.fir.inspections.diagnosticBased.HLUnusedVariableInspection \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableInDestructuringDeclaration.kt b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableInDestructuringDeclaration.kt new file mode 100644 index 000000000000..07402b5edd32 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableInDestructuringDeclaration.kt @@ -0,0 +1,11 @@ +// PROBLEM: none +fun test(condition: Boolean, foo: Foo) { + val v = if (condition) { + val (one, two) = foo + two + } else { + null + } +} + +data class Foo(val one: String, val two: String) \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithAnonymousFunctionInitialize1.kt b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithAnonymousFunctionInitialize1.kt new file mode 100644 index 000000000000..9fffcdcca09c --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithAnonymousFunctionInitialize1.kt @@ -0,0 +1,4 @@ +// PROBLEM: none +fun test() { + val a: (String) -> Unit = fun(s) { s + s } +} diff --git a/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithAnonymousFunctionInitialize2.kt b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithAnonymousFunctionInitialize2.kt new file mode 100644 index 000000000000..a0464f5cf4e3 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithAnonymousFunctionInitialize2.kt @@ -0,0 +1,4 @@ +// "Remove variable 'a'" "true" +fun test() { + val a: (String) -> Unit = fun(s: String) { s + s } +} diff --git a/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithAnonymousFunctionInitialize2.kt.after b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithAnonymousFunctionInitialize2.kt.after new file mode 100644 index 000000000000..8933379190e7 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithAnonymousFunctionInitialize2.kt.after @@ -0,0 +1,4 @@ +// "Remove variable 'a'" "true" +fun test() { + fun(s: String) { s + s } +} diff --git a/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithConstantInitializer.kt b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithConstantInitializer.kt new file mode 100644 index 000000000000..0acfc253a5ef --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithConstantInitializer.kt @@ -0,0 +1,5 @@ +// "Remove variable 'flag'" "true" + +fun foo() { + val flag = true +} diff --git a/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithConstantInitializer.kt.after b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithConstantInitializer.kt.after new file mode 100644 index 000000000000..a0905fe8e41d --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithConstantInitializer.kt.after @@ -0,0 +1,4 @@ +// "Remove variable 'flag'" "true" + +fun foo() { +} diff --git a/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithInitializer.kt b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithInitializer.kt new file mode 100644 index 000000000000..0eaf2a53580c --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithInitializer.kt @@ -0,0 +1,6 @@ +// "Remove variable 'a'" "true" +var cnt = 5 +fun getCnt() = cnt++ +fun f() { + var a = getCnt() +} diff --git a/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithInitializer.kt.after b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithInitializer.kt.after new file mode 100644 index 000000000000..8af106e51a20 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithInitializer.kt.after @@ -0,0 +1,6 @@ +// "Remove variable 'a'" "true" +var cnt = 5 +fun getCnt() = cnt++ +fun f() { + getCnt() +} diff --git a/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithInitializerAndComment.kt b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithInitializerAndComment.kt new file mode 100644 index 000000000000..08824484aa31 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithInitializerAndComment.kt @@ -0,0 +1,6 @@ +// "Remove variable 'a'" "true" +var cnt = 5 +fun getCnt() = cnt++ +fun f() { + var a = getCnt() // comment +} diff --git a/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithInitializerAndComment.kt.after b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithInitializerAndComment.kt.after new file mode 100644 index 000000000000..bed29b592e09 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithInitializerAndComment.kt.after @@ -0,0 +1,6 @@ +// "Remove variable 'a'" "true" +var cnt = 5 +fun getCnt() = cnt++ +fun f() { + getCnt() // comment +} diff --git a/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithLambdaInitializer1.kt b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithLambdaInitializer1.kt new file mode 100644 index 000000000000..05cdc4c771ac --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithLambdaInitializer1.kt @@ -0,0 +1,4 @@ +// PROBLEM: none +fun test() { + val a: (String) -> Unit = { s -> s + s } +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithLambdaInitializer2.kt b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithLambdaInitializer2.kt new file mode 100644 index 000000000000..541049a28afd --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithLambdaInitializer2.kt @@ -0,0 +1,4 @@ +// "Remove variable 'a'" "true" +fun test() { + val a: (String) -> Unit = { s: String -> s + s } +} diff --git a/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithLambdaInitializer2.kt.after b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithLambdaInitializer2.kt.after new file mode 100644 index 000000000000..ee97798cd8f1 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithLambdaInitializer2.kt.after @@ -0,0 +1,4 @@ +// "Remove variable 'a'" "true" +fun test() { + { s: String -> s + s } +} diff --git a/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithNullInitializer.kt b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithNullInitializer.kt new file mode 100644 index 000000000000..fbcfea360ed6 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithNullInitializer.kt @@ -0,0 +1,5 @@ +// "Remove variable 'i'" "true" + +fun foo() { + val i: Int? = null +} diff --git a/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithNullInitializer.kt.after b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithNullInitializer.kt.after new file mode 100644 index 000000000000..7fe4bf1df892 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithNullInitializer.kt.after @@ -0,0 +1,4 @@ +// "Remove variable 'i'" "true" + +fun foo() { +} diff --git a/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithoutInitializer.kt b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithoutInitializer.kt new file mode 100644 index 000000000000..a128a4643a26 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithoutInitializer.kt @@ -0,0 +1,4 @@ +// "Remove variable 'test'" "true" +fun f() { + val test: Int +} diff --git a/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithoutInitializer.kt.after b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithoutInitializer.kt.after new file mode 100644 index 000000000000..d472d0924a0c --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedVariable/unusedVariableWithoutInitializer.kt.after @@ -0,0 +1,3 @@ +// "Remove variable 'test'" "true" +fun f() { +} diff --git a/plugins/kotlin/resources-fir/resources/META-INF/firInspections.xml b/plugins/kotlin/resources-fir/resources/META-INF/firInspections.xml index c28557947988..177f6a9faef3 100644 --- a/plugins/kotlin/resources-fir/resources/META-INF/firInspections.xml +++ b/plugins/kotlin/resources-fir/resources/META-INF/firInspections.xml @@ -26,5 +26,14 @@ level="WARNING" language="kotlin" key="inspection.kotlin.unused.import.display.name" bundle="messages.KotlinBundle"/> + + \ No newline at end of file