From de83ec00698976406f69af2cabb86e0a6487fdbd Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 15 Sep 2025 22:10:54 +0200 Subject: [PATCH] [kotlin] unused symbol: disable for parameters of anonymous functions - it's not cheap to check if the function has an explicit expected type, k1 ignored parameters anyway ^KTIJ-35651 fixed GitOrigin-RevId: b1798d0a67e14fbf4abb798168be71848b86d549 --- .../K2UnusedSymbolHighlightingTestGenerated.java | 10 ++++++++++ .../kotlin/idea/highlighting/K2UnusedSymbolUtil.kt | 3 +++ .../inspections/LocalInspectionTestGenerated.java | 10 ++++++++++ .../unusedSymbol/anonymousFunction.kt | 13 +++++++++++++ .../unusedSymbol/anonymousFunction1.kt | 7 +++++++ 5 files changed, 43 insertions(+) create mode 100644 plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedSymbol/anonymousFunction.kt create mode 100644 plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedSymbol/anonymousFunction1.kt diff --git a/plugins/kotlin/code-insight/inspections-k2/tests/test/org/jetbrains/kotlin/idea/k2/inspections/tests/K2UnusedSymbolHighlightingTestGenerated.java b/plugins/kotlin/code-insight/inspections-k2/tests/test/org/jetbrains/kotlin/idea/k2/inspections/tests/K2UnusedSymbolHighlightingTestGenerated.java index 28305fe34903..aa8d5dda15b8 100644 --- a/plugins/kotlin/code-insight/inspections-k2/tests/test/org/jetbrains/kotlin/idea/k2/inspections/tests/K2UnusedSymbolHighlightingTestGenerated.java +++ b/plugins/kotlin/code-insight/inspections-k2/tests/test/org/jetbrains/kotlin/idea/k2/inspections/tests/K2UnusedSymbolHighlightingTestGenerated.java @@ -202,6 +202,16 @@ public abstract class K2UnusedSymbolHighlightingTestGenerated extends AbstractK2 runTest("../../../idea/tests/testData/inspectionsLocal/unusedSymbol/annotationWithUseSiteTarget.kt"); } + @TestMetadata("anonymousFunction.kt") + public void testAnonymousFunction() throws Exception { + runTest("../../../idea/tests/testData/inspectionsLocal/unusedSymbol/anonymousFunction.kt"); + } + + @TestMetadata("anonymousFunction1.kt") + public void testAnonymousFunction1() throws Exception { + runTest("../../../idea/tests/testData/inspectionsLocal/unusedSymbol/anonymousFunction1.kt"); + } + @TestMetadata("arrayAccessOperator.kt") public void testArrayAccessOperator() throws Exception { runTest("../../../idea/tests/testData/inspectionsLocal/unusedSymbol/arrayAccessOperator.kt"); diff --git a/plugins/kotlin/highlighting/highlighting-k2/src/org/jetbrains/kotlin/idea/highlighting/K2UnusedSymbolUtil.kt b/plugins/kotlin/highlighting/highlighting-k2/src/org/jetbrains/kotlin/idea/highlighting/K2UnusedSymbolUtil.kt index 818c9ec9fba1..6302ff33bad6 100644 --- a/plugins/kotlin/highlighting/highlighting-k2/src/org/jetbrains/kotlin/idea/highlighting/K2UnusedSymbolUtil.kt +++ b/plugins/kotlin/highlighting/highlighting-k2/src/org/jetbrains/kotlin/idea/highlighting/K2UnusedSymbolUtil.kt @@ -103,6 +103,9 @@ object K2UnusedSymbolUtil { if (isExpectedOrActual(containingClass)) return false } } else if (ownerFunction is KtFunction) { + if (ownerFunction.name == null) { + return false + } if (ownerFunction.hasModifier(KtTokens.OPERATOR_KEYWORD)) { // operator parameters are hardcoded to be used since they can't be removed at will, because operator convention would break return false diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java index 9473b87c1969..5a511db5d880 100644 --- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java @@ -16610,6 +16610,16 @@ public abstract class LocalInspectionTestGenerated extends AbstractLocalInspecti runTest("testData/inspectionsLocal/unusedSymbol/annotationWithUseSiteTarget.kt"); } + @TestMetadata("anonymousFunction.kt") + public void testAnonymousFunction() throws Exception { + runTest("testData/inspectionsLocal/unusedSymbol/anonymousFunction.kt"); + } + + @TestMetadata("anonymousFunction1.kt") + public void testAnonymousFunction1() throws Exception { + runTest("testData/inspectionsLocal/unusedSymbol/anonymousFunction1.kt"); + } + @TestMetadata("arrayAccessOperator.kt") public void testArrayAccessOperator() throws Exception { runTest("testData/inspectionsLocal/unusedSymbol/arrayAccessOperator.kt"); diff --git a/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedSymbol/anonymousFunction.kt b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedSymbol/anonymousFunction.kt new file mode 100644 index 000000000000..9f477b04b8ea --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedSymbol/anonymousFunction.kt @@ -0,0 +1,13 @@ +// PROBLEM: none +// WITH_STDLIB +fun foo(p: (String) -> Unit) { + p("") +} + +fun use() { + foo( + fun(it: String) { + print("foo") + }, + ) +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedSymbol/anonymousFunction1.kt b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedSymbol/anonymousFunction1.kt new file mode 100644 index 000000000000..9f5118d2869b --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedSymbol/anonymousFunction1.kt @@ -0,0 +1,7 @@ +// PROBLEM: none +// WITH_STDLIB +fun use() { + val f = fun(it: String) { + print("foo") + } +} \ No newline at end of file