From a65304556c9d19926f1837ebf5af83dbb39747fa Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Sat, 23 Dec 2017 07:05:43 +0300 Subject: [PATCH] CFG: provide "used as expression" in enum constant constructor This allows to avoid "unused return value of a function with lambda expression body" for such a situation So #KT-20429 Fixed --- .../jetbrains/kotlin/cfg/ControlFlowProcessor.kt | 8 ++++++++ .../unusedLambdaExpressionBody/.inspection | 1 + .../unusedLambdaExpressionBody/inEnumEntry.kt | 7 +++++++ .../inspections/LocalInspectionTestGenerated.java | 15 +++++++++++++++ 4 files changed, 31 insertions(+) create mode 100644 idea/testData/inspectionsLocal/unusedLambdaExpressionBody/.inspection create mode 100644 idea/testData/inspectionsLocal/unusedLambdaExpressionBody/inEnumEntry.kt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowProcessor.kt b/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowProcessor.kt index 3afaeb581d8..78f0d1f9ef0 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowProcessor.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowProcessor.kt @@ -1447,6 +1447,14 @@ class ControlFlowProcessor(private val trace: BindingTrace) { generateCallOrMarkUnresolved(call) } + override fun visitInitializerList(list: KtInitializerList) { + list.initializers + .filterIsInstance() + .forEach { + generateCallOrMarkUnresolved(it) + } + } + private fun generateCallOrMarkUnresolved(call: KtCallElement) { if (!generateCall(call)) { val arguments = call.valueArguments.mapNotNull(ValueArgument::getArgumentExpression) diff --git a/idea/testData/inspectionsLocal/unusedLambdaExpressionBody/.inspection b/idea/testData/inspectionsLocal/unusedLambdaExpressionBody/.inspection new file mode 100644 index 00000000000..607b45277a6 --- /dev/null +++ b/idea/testData/inspectionsLocal/unusedLambdaExpressionBody/.inspection @@ -0,0 +1 @@ +org.jetbrains.kotlin.idea.inspections.UnusedLambdaExpressionBodyInspection \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/unusedLambdaExpressionBody/inEnumEntry.kt b/idea/testData/inspectionsLocal/unusedLambdaExpressionBody/inEnumEntry.kt new file mode 100644 index 00000000000..768d976cba1 --- /dev/null +++ b/idea/testData/inspectionsLocal/unusedLambdaExpressionBody/inEnumEntry.kt @@ -0,0 +1,7 @@ +// PROBLEM: none + +enum class Test(f: () -> Unit) { + A(getFunc()) +} + +fun getFunc(): () -> Unit = {} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java index bd2b05cdf1a..afbe1ab748e 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java @@ -3861,6 +3861,21 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest { } } + @TestMetadata("idea/testData/inspectionsLocal/unusedLambdaExpressionBody") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class UnusedLambdaExpressionBody extends AbstractLocalInspectionTest { + public void testAllFilesPresentInUnusedLambdaExpressionBody() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/inspectionsLocal/unusedLambdaExpressionBody"), Pattern.compile("^([\\w\\-_]+)\\.(kt|kts)$"), TargetBackend.ANY, true); + } + + @TestMetadata("inEnumEntry.kt") + public void testInEnumEntry() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspectionsLocal/unusedLambdaExpressionBody/inEnumEntry.kt"); + doTest(fileName); + } + } + @TestMetadata("idea/testData/inspectionsLocal/unusedReceiverParameter") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)