diff --git a/java/java-impl/src/com/intellij/codeInspection/util/OptionalRefactoringUtil.java b/java/java-impl/src/com/intellij/codeInspection/util/OptionalRefactoringUtil.java index d1333f185618..b7adffcab318 100644 --- a/java/java-impl/src/com/intellij/codeInspection/util/OptionalRefactoringUtil.java +++ b/java/java-impl/src/com/intellij/codeInspection/util/OptionalRefactoringUtil.java @@ -9,10 +9,7 @@ import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.TypeConversionUtil; import com.intellij.refactoring.util.RefactoringUtil; import com.intellij.util.ObjectUtils; -import com.siyeh.ig.psiutils.BoolUtils; -import com.siyeh.ig.psiutils.ExpressionUtils; -import com.siyeh.ig.psiutils.JavaPsiMathUtil; -import com.siyeh.ig.psiutils.StreamApiUtil; +import com.siyeh.ig.psiutils.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -122,7 +119,7 @@ public class OptionalRefactoringUtil { } } String flatMapOperationName = StreamRefactoringUtil.getFlatMapOperationName(var.getType(), elementType); - if(flatMapOperationName != null) { + if(flatMapOperationName != null && !SideEffectChecker.mayHaveSideEffects(trueExpression)) { return qualifier + ".stream()."+flatMapOperationName+"(" + LambdaUtil.createLambda(var, trueExpression) + ")"; } } diff --git a/java/java-tests/testData/inspection/optionalChains/afterStreamJava9.java b/java/java-tests/testData/inspection/optionalChains/afterStreamJava9.java index fc61ac021f16..37acdc108224 100644 --- a/java/java-tests/testData/inspection/optionalChains/afterStreamJava9.java +++ b/java/java-tests/testData/inspection/optionalChains/afterStreamJava9.java @@ -15,7 +15,19 @@ public final class MyClass { p.name().stream().mapToInt(String::length).forEach(System.out::println); p.name().stream().flatMapToInt(String::chars).forEach(System.out::println); p.name().filter(n -> !n.isEmpty()).stream().forEach(System.out::println); + + p.name().stream().flatMap(MyClass::createStream); + p.name().map(m -> createStreamSideEffect(m)).orElse(Stream.empty()); Stream stream = opt.stream(); } + + static Stream createStream(String s) { + return Stream.of(s, s); + } + + static Stream createStreamSideEffect(String s) { + System.out.println(s); + return Stream.of(s, s); + } } \ No newline at end of file diff --git a/java/java-tests/testData/inspection/optionalChains/beforeStreamJava9.java b/java/java-tests/testData/inspection/optionalChains/beforeStreamJava9.java index c989c77ff3ca..4170f7ac73f2 100644 --- a/java/java-tests/testData/inspection/optionalChains/beforeStreamJava9.java +++ b/java/java-tests/testData/inspection/optionalChains/beforeStreamJava9.java @@ -15,7 +15,19 @@ public final class MyClass { p.name().map(n -> IntStream.of(n.length())).orElseGet(IntStream::empty).forEach(System.out::println); p.name().map(String::chars).orElseGet(IntStream::empty).forEach(System.out::println); p.name().map(n -> n.isEmpty() ? Stream.empty() : Stream.of(n)).orElseGet(Stream::empty).forEach(System.out::println); + + p.name().map(m -> createStream(m)).orElse(Stream.empty()); + p.name().map(m -> createStreamSideEffect(m)).orElse(Stream.empty()); Stream stream = opt.map(Stream::of).orElseGet(Stream::empty); } + + static Stream createStream(String s) { + return Stream.of(s, s); + } + + static Stream createStreamSideEffect(String s) { + System.out.println(s); + return Stream.of(s, s); + } } \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/SimplifyOptionalCallChainsInspectionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/SimplifyOptionalCallChainsInspectionTest.java index 656151365048..b8ed02798951 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/SimplifyOptionalCallChainsInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/SimplifyOptionalCallChainsInspectionTest.java @@ -20,12 +20,13 @@ import com.intellij.codeInspection.LocalInspectionTool; import com.intellij.codeInspection.SimplifyOptionalCallChainsInspection; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.testFramework.IdeaTestUtil; +import com.intellij.testFramework.PsiTestUtil; import org.jetbrains.annotations.NotNull; public class SimplifyOptionalCallChainsInspectionTest extends LightQuickFixParameterizedTestCase { @Override protected Sdk getProjectJDK() { - return IdeaTestUtil.getMockJdk9(); + return PsiTestUtil.addJdkAnnotations(IdeaTestUtil.getMockJdk9()); } @NotNull