diff --git a/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/JavaCodeStyleManagerImpl.java b/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/JavaCodeStyleManagerImpl.java index b09b988ec4d7..fd641a836de6 100644 --- a/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/JavaCodeStyleManagerImpl.java +++ b/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/JavaCodeStyleManagerImpl.java @@ -891,8 +891,10 @@ public class JavaCodeStyleManagerImpl extends JavaCodeStyleManager { try { run.accept(new JavaRecursiveElementWalkingVisitor() { @Override - public void visitAnonymousClass(final PsiAnonymousClass aClass) { - } + public void visitClass(final PsiClass aClass) {} + + @Override + public void visitForeachStatement(PsiForeachStatement statement) {} @Override public void visitVariable(PsiVariable variable) { if (name1.equals(variable.getName())) { diff --git a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java index 0f993afc87a7..7f24eb5155d8 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java @@ -760,8 +760,8 @@ public class ExtractMethodProcessor implements MatchProvider { CodeStyleManager.getInstance(myProject).reformat(ifStatement); } else if (myNotNullConditionalCheck) { - final String varName = myOutputVariable.getName(); - declareVariableAtMethodCallLocation(varName, myReturnType instanceof PsiPrimitiveType ? ((PsiPrimitiveType)myReturnType).getBoxedType(myCodeFragmentMember) : myReturnType); + String varName = myOutputVariable.getName(); + varName = declareVariableAtMethodCallLocation(varName, myReturnType instanceof PsiPrimitiveType ? ((PsiPrimitiveType)myReturnType).getBoxedType(myCodeFragmentMember) : myReturnType); addToMethodCallLocation(myElementFactory.createStatementFromText("if (" + varName + " != null) return " + varName + ";", null)); } else if (myGenerateConditionalExit) { @@ -903,12 +903,17 @@ public class ExtractMethodProcessor implements MatchProvider { declareVariableAtMethodCallLocation(name, myOutputVariable.getType()); } - private void declareVariableAtMethodCallLocation(String name, PsiType type) { + private String declareVariableAtMethodCallLocation(String name, PsiType type) { + if (myControlFlowWrapper.getOutputVariables(false).length == 0) { + PsiElement lastStatement = myEnclosingBlockStatement != null ? myEnclosingBlockStatement : myElements[myElements.length - 1]; + name = JavaCodeStyleManager.getInstance(myProject).suggestUniqueVariableName(name, lastStatement, true); + } PsiDeclarationStatement statement = myElementFactory.createVariableDeclarationStatement(name, type, myMethodCall); statement = (PsiDeclarationStatement)addToMethodCallLocation(statement); PsiVariable var = (PsiVariable)statement.getDeclaredElements()[0]; myMethodCall = (PsiMethodCallExpression)var.getInitializer(); var.getModifierList().replace(myOutputVariable.getModifierList()); + return name; } private void adjustFinalParameters(final PsiMethod method) throws IncorrectOperationException { diff --git a/java/java-tests/testData/refactoring/extractMethod/ExitPoints9_after.java b/java/java-tests/testData/refactoring/extractMethod/ExitPoints9_after.java index 0c50b6d78882..a1d04f76241b 100644 --- a/java/java-tests/testData/refactoring/extractMethod/ExitPoints9_after.java +++ b/java/java-tests/testData/refactoring/extractMethod/ExitPoints9_after.java @@ -12,8 +12,8 @@ class Main { public static Result doIt(String name) { Result result; - Result result = newMethod(name); - if (result != null) return result; + Result result1 = newMethod(name); + if (result1 != null) return result1; result = new Result("Name is " + name); return result; diff --git a/java/java-tests/testData/refactoring/extractMethod/NotNullCheckNameConflicts.java b/java/java-tests/testData/refactoring/extractMethod/NotNullCheckNameConflicts.java new file mode 100644 index 000000000000..c0ff1577b712 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethod/NotNullCheckNameConflicts.java @@ -0,0 +1,30 @@ +import org.jetbrains.annotations.NotNull; + +class X { + @NotNull + public X fun1(int x) { + return this; + } + + public X fun2(boolean b) { + + if (b) { + int x = 1; + return fun1(x); + } + + int x = 0; + return null; + } + + + + + void foo(int i, int j) { + bar(i, j); + } + + private void bar(int i, int j) { + + } +} diff --git a/java/java-tests/testData/refactoring/extractMethod/NotNullCheckNameConflicts_after.java b/java/java-tests/testData/refactoring/extractMethod/NotNullCheckNameConflicts_after.java new file mode 100644 index 000000000000..54cdd6f72cbc --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethod/NotNullCheckNameConflicts_after.java @@ -0,0 +1,36 @@ +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +class X { + @NotNull + public X fun1(int x) { + return this; + } + + public X fun2(boolean b) { + + X x1 = newMethod(b); + if (x1 != null) return x1; + + int x = 0; + return null; + } + + @Nullable + private X newMethod(boolean b) { + if (b) { + int x = 1; + return fun1(x); + } + return null; + } + + + void foo(int i, int j) { + bar(i, j); + } + + private void bar(int i, int j) { + + } +} diff --git a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java index 7275ca944a75..bc44a8b9c3c4 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java @@ -87,6 +87,10 @@ public class ExtractMethodTest extends LightCodeInsightTestCase { doTest(); } + public void testNotNullCheckNameConflicts() throws Exception { + doTest(); + } + public void testContinueInside() throws Exception { doTest(); }