From b2f96963b6694efc5539d9a57c0bbcb81890b0cb Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Wed, 13 Sep 2017 10:25:44 +0700 Subject: [PATCH 1/4] JavaSdkImpl: toString for MockSdk, cosmetics --- .../intellij/openapi/projectRoots/impl/JavaSdkImpl.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/java/java-impl/src/com/intellij/openapi/projectRoots/impl/JavaSdkImpl.java b/java/java-impl/src/com/intellij/openapi/projectRoots/impl/JavaSdkImpl.java index 0e9de2c563fa..13330c14052e 100644 --- a/java/java-impl/src/com/intellij/openapi/projectRoots/impl/JavaSdkImpl.java +++ b/java/java-impl/src/com/intellij/openapi/projectRoots/impl/JavaSdkImpl.java @@ -576,6 +576,7 @@ public class JavaSdkImpl extends JavaSdk { return myJdkName; } + @NotNull @Override public String getVersionString() { return myVersionString; @@ -600,7 +601,7 @@ public class JavaSdkImpl extends JavaSdk { @NotNull @Override - public Object clone() { + public Sdk clone() { return new MockSdk(myJdkName, myHomePath, myVersionString, new MultiMap<>(myRoots), myIsJre){ @NotNull @Override @@ -715,5 +716,10 @@ public class JavaSdkImpl extends JavaSdk { public void putUserData(@NotNull Key key, @Nullable T value) { throwReadOnly(); } + + @Override + public String toString() { + return "MockSDK[" + myJdkName + "]"; + } } } \ No newline at end of file From 626278150e600d2535723309bc616afe546f9094 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Wed, 13 Sep 2017 10:27:14 +0700 Subject: [PATCH 2/4] IDEA-178846 False positive "Excessive lambda usage" inspection --- .../ExcessiveLambdaUsageInspection.java | 2 +- .../beforeJUnit5AssertTimeout.java | 17 +++++++++++++++++ .../ExcessiveLambdaUsageInspectionTest.java | 7 +++++++ 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/excessiveLambdaUsage/beforeJUnit5AssertTimeout.java diff --git a/java/java-impl/src/com/intellij/codeInspection/ExcessiveLambdaUsageInspection.java b/java/java-impl/src/com/intellij/codeInspection/ExcessiveLambdaUsageInspection.java index cffed20e7c7e..12e2f4ab5f65 100644 --- a/java/java-impl/src/com/intellij/codeInspection/ExcessiveLambdaUsageInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/ExcessiveLambdaUsageInspection.java @@ -42,7 +42,7 @@ public class ExcessiveLambdaUsageInspection extends BaseJavaBatchLocalInspection new ExcessiveLambdaInfo("java.util.OptionalDouble", "orElseGet", "orElse", 0, true), new ExcessiveLambdaInfo("com.google.common.base.Optional", "or", "*", 0, true), new ExcessiveLambdaInfo("java.util.Objects", "requireNonNull", "*", 1, true), - new ExcessiveLambdaInfo("org.junit.jupiter.api.Assertions", "assert.*|fail", "*", -1, true), + new ExcessiveLambdaInfo("org.junit.jupiter.api.Assertions", "assert(?!Timeout).*|fail", "*", -1, true), new ExcessiveLambdaInfo("org.junit.jupiter.api.Assertions", "assert(True|False)", "*", 0, true), }; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/excessiveLambdaUsage/beforeJUnit5AssertTimeout.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/excessiveLambdaUsage/beforeJUnit5AssertTimeout.java new file mode 100644 index 000000000000..9bea3a2baa52 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/excessiveLambdaUsage/beforeJUnit5AssertTimeout.java @@ -0,0 +1,17 @@ +// "Fix all 'Excessive lambda usage' problems in file" "false" +package org.junit.jupiter.api; + +interface Supplier { + T supply(); +} + +class Assertions { + static void assertTimeout(Object duration, String message) {}; + static void assertTimeout(Object duration, Supplier message) {}; +} + +class Test { + public void test() { + Assertions.assertTimeout(null, () -> "a result"); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/quickFix/ExcessiveLambdaUsageInspectionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/quickFix/ExcessiveLambdaUsageInspectionTest.java index d0d4b0e0f88d..b81759f59c94 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/quickFix/ExcessiveLambdaUsageInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/quickFix/ExcessiveLambdaUsageInspectionTest.java @@ -18,6 +18,8 @@ package com.intellij.java.codeInsight.daemon.quickFix; import com.intellij.codeInsight.daemon.quickFix.LightQuickFixParameterizedTestCase; import com.intellij.codeInspection.ExcessiveLambdaUsageInspection; import com.intellij.codeInspection.LocalInspectionTool; +import com.intellij.openapi.projectRoots.Sdk; +import com.intellij.testFramework.IdeaTestUtil; import org.jetbrains.annotations.NotNull; @@ -30,6 +32,11 @@ public class ExcessiveLambdaUsageInspectionTest extends LightQuickFixParameteriz }; } + @Override + protected Sdk getProjectJDK() { + return IdeaTestUtil.getMockJdk9(); + } + public void test() { doAllTests(); } @Override From 308e007dd889ac394f0d62f34397c08aee5d4d55 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Wed, 13 Sep 2017 10:46:01 +0700 Subject: [PATCH 3/4] ExcessiveLambdaUsageInspection: support Java 9 requireNonNullElseGet --- .../codeInspection/ExcessiveLambdaUsageInspection.java | 1 + .../excessiveLambdaUsage/afterRequireNonNullElseGet.java | 9 +++++++++ .../beforeRequireNonNullElseGet.java | 9 +++++++++ 3 files changed, 19 insertions(+) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/excessiveLambdaUsage/afterRequireNonNullElseGet.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/excessiveLambdaUsage/beforeRequireNonNullElseGet.java diff --git a/java/java-impl/src/com/intellij/codeInspection/ExcessiveLambdaUsageInspection.java b/java/java-impl/src/com/intellij/codeInspection/ExcessiveLambdaUsageInspection.java index 12e2f4ab5f65..d5e9987f8f88 100644 --- a/java/java-impl/src/com/intellij/codeInspection/ExcessiveLambdaUsageInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/ExcessiveLambdaUsageInspection.java @@ -42,6 +42,7 @@ public class ExcessiveLambdaUsageInspection extends BaseJavaBatchLocalInspection new ExcessiveLambdaInfo("java.util.OptionalDouble", "orElseGet", "orElse", 0, true), new ExcessiveLambdaInfo("com.google.common.base.Optional", "or", "*", 0, true), new ExcessiveLambdaInfo("java.util.Objects", "requireNonNull", "*", 1, true), + new ExcessiveLambdaInfo("java.util.Objects", "requireNonNullElseGet", "requireNonNullElse", 1, true), new ExcessiveLambdaInfo("org.junit.jupiter.api.Assertions", "assert(?!Timeout).*|fail", "*", -1, true), new ExcessiveLambdaInfo("org.junit.jupiter.api.Assertions", "assert(True|False)", "*", 0, true), }; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/excessiveLambdaUsage/afterRequireNonNullElseGet.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/excessiveLambdaUsage/afterRequireNonNullElseGet.java new file mode 100644 index 000000000000..949b97c83f8f --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/excessiveLambdaUsage/afterRequireNonNullElseGet.java @@ -0,0 +1,9 @@ +// "Use 'requireNonNullElse' method without lambda" "true" + +import java.util.*; + +class Test { + public String test(String foo, String bar) { + return Objects.requireNonNullElse(foo, bar); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/excessiveLambdaUsage/beforeRequireNonNullElseGet.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/excessiveLambdaUsage/beforeRequireNonNullElseGet.java new file mode 100644 index 000000000000..16a7215fb7ac --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/excessiveLambdaUsage/beforeRequireNonNullElseGet.java @@ -0,0 +1,9 @@ +// "Use 'requireNonNullElse' method without lambda" "true" + +import java.util.*; + +class Test { + public String test(String foo, String bar) { + return Objects.requireNonNullElseGet(foo, () -> bar); + } +} \ No newline at end of file From cb8a02e657252a00663defa59d30ef1e6fff8f95 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Wed, 13 Sep 2017 11:09:28 +0700 Subject: [PATCH 4/4] PointlessBooleanExpression: tests fixed; now warning issued on fields as well (after 6e87cb9bfd86) --- .../SideEffectsField.after.java | 28 +++++++++++++++++ .../pointlessboolean/SideEffectsField.java | 23 ++++++++++++++ .../PointlessBooleanExpression.java | 31 +++++++++++++++---- .../PointlessBooleanExpressionFixTest.java | 3 ++ 4 files changed, 79 insertions(+), 6 deletions(-) create mode 100644 plugins/InspectionGadgets/test/com/siyeh/igfixes/pointlessboolean/SideEffectsField.after.java create mode 100644 plugins/InspectionGadgets/test/com/siyeh/igfixes/pointlessboolean/SideEffectsField.java diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/pointlessboolean/SideEffectsField.after.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/pointlessboolean/SideEffectsField.after.java new file mode 100644 index 000000000000..157f6c690f88 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/pointlessboolean/SideEffectsField.after.java @@ -0,0 +1,28 @@ +/* + * Copyright 2000-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +class C { + double sideEffect(int x) { + System.out.println("Side effect"+x); + return Math.random(); + } + + boolean field; + + { + sideEffect(4); + field = false; + } +} diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/pointlessboolean/SideEffectsField.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/pointlessboolean/SideEffectsField.java new file mode 100644 index 000000000000..29e83094790b --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/pointlessboolean/SideEffectsField.java @@ -0,0 +1,23 @@ +/* + * Copyright 2000-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +class C { + double sideEffect(int x) { + System.out.println("Side effect"+x); + return Math.random(); + } + + boolean field = sideEffect(4) > 0.5 && false; +} diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/controlflow/pointless_boolean_expression/PointlessBooleanExpression.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/controlflow/pointless_boolean_expression/PointlessBooleanExpression.java index 13414778edd8..ae688bed4c3c 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/controlflow/pointless_boolean_expression/PointlessBooleanExpression.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/controlflow/pointless_boolean_expression/PointlessBooleanExpression.java @@ -34,12 +34,31 @@ class PointlessBooleanExpression { return Math.random() > 0.5; } - // side-effect cannot be extracted from field declaration - boolean field = sideEffect() && false; - boolean field1 = false & sideEffect(); - // no side-effect extraction necessary - boolean field2 = sideEffect() && true; - boolean field3 = false && sideEffect(); + class X { + X(boolean b) {} + } + + class Y extends X { + Y(int i) { + // side-effect cannot be extracted from super call + super(sideEffect() && false); + } + + Y(long l) { + // side-effect cannot be extracted from super call + super(false & sideEffect()); + } + + Y(double d) { + // no side-effect extraction necessary + super(sideEffect() && true); + } + + Y(float f) { + // no side-effect extraction necessary + super(false && sideEffect()); + } + } void method() { if(sideEffect() && false) { diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/PointlessBooleanExpressionFixTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/PointlessBooleanExpressionFixTest.java index 98e970976c23..32b90a530cf0 100644 --- a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/PointlessBooleanExpressionFixTest.java +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/PointlessBooleanExpressionFixTest.java @@ -35,4 +35,7 @@ public class PointlessBooleanExpressionFixTest extends IGQuickFixesTestCase { public void testSideEffects() { doTest(InspectionGadgetsBundle.message("constant.conditional.expression.simplify.quickfix.sideEffect")); } + public void testSideEffectsField() { + doTest(InspectionGadgetsBundle.message("constant.conditional.expression.simplify.quickfix.sideEffect")); + } }