diff --git a/java/java-impl/src/com/intellij/codeInspection/optionalToIf/IntermediateOperation.java b/java/java-impl/src/com/intellij/codeInspection/optionalToIf/IntermediateOperation.java index 1eb6c0208261..dbe9e25a1216 100644 --- a/java/java-impl/src/com/intellij/codeInspection/optionalToIf/IntermediateOperation.java +++ b/java/java-impl/src/com/intellij/codeInspection/optionalToIf/IntermediateOperation.java @@ -235,8 +235,9 @@ abstract class IntermediateOperation implements Operation { @Override public void preprocessVariables(@NotNull ChainVariable inVar, @NotNull ChainVariable outVar, @NotNull OptionalToIfContext context) { String name = myFn.getParameterName(0); - if (name != null) { + if (name != null && !context.isUsedLambdaVarName(name)) { inVar.addBestNameCandidate(name); + context.addLambdaVarName(name); } } } diff --git a/java/java-impl/src/com/intellij/codeInspection/optionalToIf/OptionalToIfContext.java b/java/java-impl/src/com/intellij/codeInspection/optionalToIf/OptionalToIfContext.java index 6e51f6077821..33836a27b5fb 100644 --- a/java/java-impl/src/com/intellij/codeInspection/optionalToIf/OptionalToIfContext.java +++ b/java/java-impl/src/com/intellij/codeInspection/optionalToIf/OptionalToIfContext.java @@ -13,7 +13,9 @@ import com.siyeh.ig.psiutils.VariableAccessUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import static com.intellij.util.ObjectUtils.tryCast; @@ -26,6 +28,7 @@ class OptionalToIfContext extends ChainContext { private String myInitializer; private String myElseBranch; + private List myLambdaNames = new ArrayList<>(); OptionalToIfContext(@NotNull PsiExpression chainExpression, @NotNull ChainExpressionModel model) { super(chainExpression); @@ -84,6 +87,14 @@ class OptionalToIfContext extends ChainContext { code; } + boolean isUsedLambdaVarName(String name) { + return myLambdaNames.contains(name); + } + + void addLambdaVarName(@NotNull String name) { + myLambdaNames.add(name); + } + @Nullable static OptionalToIfContext create(@NotNull PsiExpression chainExpression) { PsiStatement chainStatement = PsiTreeUtil.getParentOfType(chainExpression, PsiStatement.class); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/optionalToIf/afterFlatMap.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/optionalToIf/afterFlatMap.java index 2aa60e71fc33..20a7081a1543 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/optionalToIf/afterFlatMap.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/optionalToIf/afterFlatMap.java @@ -58,6 +58,13 @@ class Test { } } + void flatMapsWithSameParamName(String param0) { + if (param0 == null) throw new NullPointerException(); + String s = "foo"; + String toLowerCase = ("foo").toLowerCase(); + String bar = "bar"; + } + String flatMapWithOrInside() { Object o1 = null; String empty = null; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/optionalToIf/beforeFlatMap.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/optionalToIf/beforeFlatMap.java index b8adf24ee1a7..e714ca2255c1 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/optionalToIf/beforeFlatMap.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/optionalToIf/beforeFlatMap.java @@ -40,6 +40,12 @@ class Test { .isPresent(); } + void flatMapsWithSameParamName(String param0) { + Optional.of(param0) + .flatMap(var0 -> Optional.of("foo").map(s -> ("foo").toLowerCase())) + .flatMap(var0 -> Optional.of("bar")).get() + } + String flatMapWithOrInside() { return Optional.empty().flatMap(s1 -> Optional.empty().or(() -> Optional.empty())).get(); }