diff --git a/java/java-impl/src/com/intellij/codeInspection/streamToLoop/FunctionHelper.java b/java/java-impl/src/com/intellij/codeInspection/streamToLoop/FunctionHelper.java index 1d1ccd9f7be9..bd52e4cbeb6f 100644 --- a/java/java-impl/src/com/intellij/codeInspection/streamToLoop/FunctionHelper.java +++ b/java/java-impl/src/com/intellij/codeInspection/streamToLoop/FunctionHelper.java @@ -115,6 +115,14 @@ abstract class FunctionHelper { return candidates; } + private static void suggestFromExpression(StreamVariable var, Project project, PsiExpression expression) { + SuggestedNameInfo info = JavaCodeStyleManager.getInstance(project) + .suggestVariableName(VariableKind.LOCAL_VARIABLE, null, expression, null, true); + for (String name : info.names) { + var.addOtherNameCandidate(name); + } + } + @Contract("null, _ -> null") @Nullable static FunctionHelper create(PsiExpression expression, int paramCount) { @@ -296,6 +304,22 @@ abstract class FunctionHelper { .forKeyValue((param, newName) -> myExpression = renameVarReference(myExpression, param.getName(), newName, context)); } + @Override + void suggestOutputNames(StreamVariable var) { + // myMethodRef is physical at this point + Project project = myMethodRef.getProject(); + PsiTypeCastExpression castExpr = (PsiTypeCastExpression)JavaPsiFacade.getElementFactory(project) + .createExpressionFromText("(" + myType + ")" + myMethodRef.getText(), myMethodRef); + PsiMethodReferenceExpression methodRef = (PsiMethodReferenceExpression)castExpr.getOperand(); + PsiLambdaExpression lambda = LambdaRefactoringUtil.convertMethodReferenceToLambda(methodRef, true, true); + if(lambda != null) { + PsiElement body = lambda.getBody(); + if(body instanceof PsiExpression) { + suggestFromExpression(var, project, (PsiExpression)body); + } + } + } + @NotNull private PsiMethodReferenceExpression fromText(StreamToLoopReplacementContext context, String text) { PsiTypeCastExpression castExpr = (PsiTypeCastExpression)context.createExpression("(" + myType + ")" + text); @@ -483,14 +507,9 @@ abstract class FunctionHelper { @Override void suggestOutputNames(StreamVariable var) { - String text = "("+var.getType()+")"+getText(); Project project = myBody.getProject(); - PsiExpression expr = JavaPsiFacade.getElementFactory(project).createExpressionFromText(text, myBody); - SuggestedNameInfo info = - JavaCodeStyleManager.getInstance(project).suggestVariableName(VariableKind.LOCAL_VARIABLE, null, expr, null, true); - for (String name : info.names) { - var.addOtherNameCandidate(name); - } + PsiExpression expr = JavaPsiFacade.getElementFactory(project).createExpressionFromText("(" + var.getType() + ")" + getText(), myBody); + suggestFromExpression(var, project, expr); } } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/afterMaxDouble.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/afterMaxDouble.java index 9046a32d28ca..b9405dbd683b 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/afterMaxDouble.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/afterMaxDouble.java @@ -9,10 +9,10 @@ public class Main { boolean seen = false; double best = 0; for (String string : strings) { - double v = string.length(); - if (!seen || Double.compare(v, best) > 0) { + double length = string.length(); + if (!seen || Double.compare(length, best) > 0) { seen = true; - best = v; + best = length; } } return (seen ? OptionalDouble.of(best) : OptionalDouble.empty()).orElse(-1); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/afterMinInt.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/afterMinInt.java index 109c40cd5604..70462d50a0e7 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/afterMinInt.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/afterMinInt.java @@ -9,10 +9,10 @@ public class Main { boolean seen = false; int best = 0; for (String string : strings) { - int i = string.length(); - if (!seen || i < best) { + int length = string.length(); + if (!seen || length < best) { seen = true; - best = i; + best = length; } } return (seen ? OptionalInt.of(best) : OptionalInt.empty()).orElse(-1);