From 5e742cdfacca2e166f0760447c9fd4269f31510b Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Fri, 30 Dec 2016 15:09:55 +0700 Subject: [PATCH] StreamToLoopInspection: reuse final variable as non-final (removing "final" keyword) (IDEA-CR-17006) --- .../streamToLoop/StreamToLoopInspection.java | 10 +++++++--- .../streamToLoop/afterFindFirstAssignFinal.java | 8 +++----- .../streamToLoop/beforeFindFirstAssignFinal.java | 1 - 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInspection/streamToLoop/StreamToLoopInspection.java b/java/java-impl/src/com/intellij/codeInspection/streamToLoop/StreamToLoopInspection.java index 8cfa8db63193..de959da07e4e 100644 --- a/java/java-impl/src/com/intellij/codeInspection/streamToLoop/StreamToLoopInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/streamToLoop/StreamToLoopInspection.java @@ -479,6 +479,12 @@ public class StreamToLoopInspection extends BaseJavaBatchLocalInspectionTool { if(declaration.getDeclaredElements().length == 1) { myPlaceholder = declaration; PsiVariable copy = (PsiVariable)var.copy(); + if (kind == ResultKind.NON_FINAL) { + PsiModifierList modifierList = copy.getModifierList(); + if (modifierList != null) { + modifierList.setModifierProperty(PsiModifier.FINAL, false); + } + } PsiExpression oldInitializer = copy.getInitializer(); LOG.assertTrue(oldInitializer != null); oldInitializer.replace(createExpression(initializer)); @@ -498,9 +504,7 @@ public class StreamToLoopInspection extends BaseJavaBatchLocalInspectionTool { @Contract("null -> false") private static boolean canUseAsNonFinal(PsiVariable var) { - if(!(var instanceof PsiLocalVariable) || var.hasModifierProperty(PsiModifier.FINAL)) { - return false; - } + if (!(var instanceof PsiLocalVariable)) return false; PsiElement block = PsiUtil.getVariableCodeBlock(var, null); return block != null && ReferencesSearch.search(var).forEach(ref -> { PsiElement context = PsiTreeUtil.getParentOfType(ref.getElement(), PsiClass.class, PsiLambdaExpression.class); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/afterFindFirstAssignFinal.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/afterFindFirstAssignFinal.java index f3db10be427a..ba6a80ae3226 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/afterFindFirstAssignFinal.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/afterFindFirstAssignFinal.java @@ -4,16 +4,14 @@ import java.util.List; public class Main { public void test(List list) { - // Cannot reuse the variable as user explicitly marked it as final - String found = ""; + String res = ""; for (String s : list) { String trim = s.trim(); if (!trim.isEmpty()) { - found = trim; + res = trim; break; } } - final String res = found; - System.out.println(res); + System.out.println(res); } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/beforeFindFirstAssignFinal.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/beforeFindFirstAssignFinal.java index 24e0e8b2dc53..293ad8350d17 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/beforeFindFirstAssignFinal.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/beforeFindFirstAssignFinal.java @@ -4,7 +4,6 @@ import java.util.List; public class Main { public void test(List list) { - // Cannot reuse the variable as user explicitly marked it as final final String res = list.stream().map(String::trim).filter(trim -> !trim.isEmpty()).findFirst().orElse(""); System.out.println(res); }