diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/VariableAccessFromInnerClassFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/VariableAccessFromInnerClassFix.java index be2243a30235..98a271629093 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/VariableAccessFromInnerClassFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/VariableAccessFromInnerClassFix.java @@ -30,6 +30,7 @@ import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.controlFlow.ControlFlowUtil; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; +import com.intellij.refactoring.util.RefactoringUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.ConcurrentWeakHashMap; import gnu.trove.THashMap; @@ -204,9 +205,13 @@ public class VariableAccessFromInnerClassFix implements IntentionAction { PsiUtil.setModifierProperty(newVariable, PsiModifier.FINAL, true); PsiElement statement = getStatementToInsertBefore(); if (statement == null) return; - statement.getParent().addBefore(copyDecl, statement); PsiExpression newExpression = factory.createExpressionFromText(newName, myVariable); replaceReferences(myClass, myVariable, newExpression); + if (RefactoringUtil.isLoopOrIf(statement.getParent())) { + RefactoringUtil.putStatementInLoopBody(copyDecl, statement.getParent(), statement); + } else { + statement.getParent().addBefore(copyDecl, statement); + } } private PsiElement getStatementToInsertBefore() { @@ -217,7 +222,7 @@ public class VariableAccessFromInnerClassFix implements IntentionAction { PsiElement statement = myClass; nextInnerClass: do { - statement = PsiUtil.getEnclosingStatement(statement); + statement = RefactoringUtil.getParentStatement(statement, false); if (statement == null || statement.getParent() == null) { return null; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mustBeFinal/afterLoop.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mustBeFinal/afterLoop.java new file mode 100644 index 000000000000..69e9f8c34d40 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mustBeFinal/afterLoop.java @@ -0,0 +1,17 @@ +// "Copy 'i' to temp final variable" "true" +class ParamTypeBug { + private static String strings[] = new String[]{ "a", "b", "c" }; + + public static void main(final String ... args){ + if (args.length == 1){ + for(int i = 0; i < strings.length; i++) { + final int finalI = i; + new Thread(){ + public void run(){ + new String(strings[finalI]); + } + }.start(); + } + } + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mustBeFinal/beforeLoop.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mustBeFinal/beforeLoop.java new file mode 100644 index 000000000000..770526f55f29 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mustBeFinal/beforeLoop.java @@ -0,0 +1,15 @@ +// "Copy 'i' to temp final variable" "true" +class ParamTypeBug { + private static String strings[] = new String[]{ "a", "b", "c" }; + + public static void main(final String ... args){ + if (args.length == 1){ + for(int i = 0; i < strings.length; i++) + new Thread(){ + public void run(){ + new String(strings[i]); + } + }.start(); + } + } +}