diff --git a/java/java-impl/src/com/intellij/refactoring/inline/InlineLocalHandler.java b/java/java-impl/src/com/intellij/refactoring/inline/InlineLocalHandler.java index 07b63f7d0003..4b5f32ccf1b5 100644 --- a/java/java-impl/src/com/intellij/refactoring/inline/InlineLocalHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/inline/InlineLocalHandler.java @@ -16,6 +16,7 @@ */ package com.intellij.refactoring.inline; +import com.intellij.codeInsight.ExceptionUtil; import com.intellij.codeInsight.TargetElementUtilBase; import com.intellij.codeInsight.highlighting.HighlightManager; import com.intellij.codeInsight.intention.QuickFixFactory; @@ -153,6 +154,12 @@ public class InlineLocalHandler extends JavaInlineActionHandler { return; } + PsiTryStatement tryStatement = PsiTreeUtil.getParentOfType(defToInline, PsiTryStatement.class); + if (tryStatement != null) { + if (ExceptionUtil.getThrownExceptions(defToInline).isEmpty()) { + tryStatement = null; + } + } PsiFile workingFile = local.getContainingFile(); for (PsiElement ref : refsToInline) { final PsiFile otherFile = ref.getContainingFile(); @@ -161,6 +168,10 @@ public class InlineLocalHandler extends JavaInlineActionHandler { CommonRefactoringUtil.showErrorHint(project, editor, message, REFACTORING_NAME, HelpID.INLINE_VARIABLE); return; } + if (tryStatement != null && !PsiTreeUtil.isAncestor(tryStatement, ref, false)) { + CommonRefactoringUtil.showErrorHint(project, editor, "Unable to inline outside try/catch statement", REFACTORING_NAME, HelpID.INLINE_VARIABLE); + return; + } } for (final PsiElement ref : refsToInline) { diff --git a/java/java-tests/testData/refactoring/inlineLocal/InlineFromTryCatch.java b/java/java-tests/testData/refactoring/inlineLocal/InlineFromTryCatch.java new file mode 100644 index 000000000000..8c224240f414 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineLocal/InlineFromTryCatch.java @@ -0,0 +1,18 @@ +import java.io.*; + +class Test { + private static InputStream getInputUnchecked() throws IOException { + InputStream in; + try { + in = ff(); + } + catch (IOException e) { + throw new IOException(); + } + return in; + } + + static InputStream ff() throws IOException { + return null; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineLocal/InlineFromTryCatchAvailable.java b/java/java-tests/testData/refactoring/inlineLocal/InlineFromTryCatchAvailable.java new file mode 100644 index 000000000000..41164ea97600 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineLocal/InlineFromTryCatchAvailable.java @@ -0,0 +1,15 @@ +import java.io.*; + +class Test { + private static InputStream getInputUnchecked(InputStream inputSupplier) throws IOException { + InputStream in; + try { + in = null; + } + catch (IOException e) { + throw new IOException(); + } + return in; + } + +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineLocal/InlineFromTryCatchAvailable.java.after b/java/java-tests/testData/refactoring/inlineLocal/InlineFromTryCatchAvailable.java.after new file mode 100644 index 000000000000..1853d8acca74 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineLocal/InlineFromTryCatchAvailable.java.after @@ -0,0 +1,13 @@ +import java.io.*; + +class Test { + private static InputStream getInputUnchecked(InputStream inputSupplier) throws IOException { + try { + } + catch (IOException e) { + throw new IOException(); + } + return null; + } + +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineLocalTest.java b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineLocalTest.java index 7cd884aab33c..e312ee81defa 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineLocalTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineLocalTest.java @@ -147,6 +147,14 @@ public class InlineLocalTest extends LightCodeInsightTestCase { doTest(false, "Cannot perform refactoring.\n" + "Variable 'x' is accessed for writing."); } + + public void testInlineFromTryCatch() throws Exception { + doTest(true, "Unable to inline outside try/catch statement"); + } + + public void testInlineFromTryCatchAvailable() throws Exception { + doTest(true); + } public void testConditionExpr() throws Exception { doTest(true);