diff --git a/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java b/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java index a5b7e7014801..06204c6338ea 100644 --- a/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java @@ -190,6 +190,21 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor { } } + final PsiReturnStatement[] returnStatements = RefactoringUtil.findReturnStatements(myMethod); + for (PsiReturnStatement statement : returnStatements) { + PsiExpression value = statement.getReturnValue(); + if (value != null && !(value instanceof PsiCallExpression)) { + for (UsageInfo info : usagesIn) { + PsiReference reference = info.getReference(); + InlineUtil.TailCallType type = InlineUtil.getTailCallType(reference); + if (type == InlineUtil.TailCallType.Simple) { + conflicts.putValue(statement, "Inlined result won't be a valid statement"); + break; + } + } + } + } + addInaccessibleMemberConflicts(myMethod, usagesIn, new ReferencedElementsCollector(), conflicts); addInaccessibleSuperCallsConflicts(usagesIn, conflicts); @@ -730,7 +745,7 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor { if (returnValue == null) continue; PsiStatement statement; if (tailCallType == InlineUtil.TailCallType.Simple) { - if (returnValue instanceof PsiCallExpression) { + if (returnValue instanceof PsiExpression) { PsiExpressionStatement exprStatement = (PsiExpressionStatement) myFactory.createStatementFromText("a;", null); exprStatement.getExpression().replace(returnValue); returnStatement.getParent().addBefore(exprStatement, returnStatement); diff --git a/java/java-tests/testData/refactoring/inlineMethod/NotAStatement.java b/java/java-tests/testData/refactoring/inlineMethod/NotAStatement.java new file mode 100644 index 000000000000..f8871bcd6e8a --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/NotAStatement.java @@ -0,0 +1,26 @@ +class AAA { + void fff(Project myProject) { + ensureFilesWritable(myProject, new String[1]); + } + + private boolean ensureFilesWritable(final Project project, final String... strings) { + return !ensureFilesWritable(strings).hasReadonlyFiles(); + } + + private Status ensureFilesWritable(final String[] strings) { + return new Status(strings); + } + + class Status { + public Status(final String[] strings) { + //To change body of created methods use File | Settings | File Templates. + } + + boolean hasReadonlyFiles() { + return true; + } + } + + class Project { + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineMethod/TailCallSimple.java b/java/java-tests/testData/refactoring/inlineMethod/TailCallSimple.java index 19c2ca640958..e4d4c46c9be2 100644 --- a/java/java-tests/testData/refactoring/inlineMethod/TailCallSimple.java +++ b/java/java-tests/testData/refactoring/inlineMethod/TailCallSimple.java @@ -7,6 +7,6 @@ class A { } public String method(boolean b) { - toInline(b); + return toInline(b); } } \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineMethod/TailCallSimple.java.after b/java/java-tests/testData/refactoring/inlineMethod/TailCallSimple.java.after index b2ea0510adb0..61dc1de01396 100644 --- a/java/java-tests/testData/refactoring/inlineMethod/TailCallSimple.java.after +++ b/java/java-tests/testData/refactoring/inlineMethod/TailCallSimple.java.after @@ -2,7 +2,8 @@ class A { public String method(boolean b) { if (b) { - return; + return "b"; } + return "a"; } } \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineMethodTest.java b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineMethodTest.java index 8870d33c8791..fb492a2be56e 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineMethodTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineMethodTest.java @@ -185,12 +185,20 @@ public class InlineMethodTest extends LightRefactoringTestCase { } public void testMethodUsedInJavadoc() throws Exception { + doTestConflict("Inlined method is used in javadoc"); + } + + public void testNotAStatement() throws Exception { + doTestConflict("Inlined result won't be a valid statement"); + } + + private void doTestConflict(final String conflict) throws Exception { try { doTest(); fail("Conflict was not detected"); } catch (BaseRefactoringProcessor.ConflictsInTestsException e) { - assertEquals("Inlined method is used in javadoc", e.getMessage()); + assertEquals(conflict, e.getMessage()); } }