From d6b15746b40f78f85ba1bafa18e37e41aafb0915 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 20 Aug 2013 21:23:12 +0400 Subject: [PATCH] extract method: avoid invalid elements (IDEA-112311) --- .../extractMethod/ExtractMethodProcessor.java | 12 +++++- .../refactoring/extractMethod/Expression.java | 35 +++++++++++++++++ .../extractMethod/Expression_after.java | 39 +++++++++++++++++++ .../refactoring/ExtractMethodTest.java | 4 ++ 4 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/refactoring/extractMethod/Expression.java create mode 100644 java/java-tests/testData/refactoring/extractMethod/Expression_after.java 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 7279f901a7bc..eee40ea2d34c 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java @@ -1239,8 +1239,16 @@ public class ExtractMethodProcessor implements MatchProvider { public boolean isDeclaredInside(PsiVariable variable) { if (variable instanceof ImplicitVariable) return false; - int startOffset = myElements[0].getTextRange().getStartOffset(); - int endOffset = myElements[myElements.length - 1].getTextRange().getEndOffset(); + int startOffset; + int endOffset; + if (myExpression != null) { + final TextRange range = myExpression.getTextRange(); + startOffset = range.getStartOffset(); + endOffset = range.getEndOffset(); + } else { + startOffset = myElements[0].getTextRange().getStartOffset(); + endOffset = myElements[myElements.length - 1].getTextRange().getEndOffset(); + } PsiIdentifier nameIdentifier = variable.getNameIdentifier(); if (nameIdentifier == null) return false; final TextRange range = nameIdentifier.getTextRange(); diff --git a/java/java-tests/testData/refactoring/extractMethod/Expression.java b/java/java-tests/testData/refactoring/extractMethod/Expression.java new file mode 100644 index 000000000000..452a7b9c8519 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethod/Expression.java @@ -0,0 +1,35 @@ +public class AnnotationArgConverter { + public GrAnnotationMemberValue convert(PsiAnnotationMemberValue value) { + final StringBuilder buffer = new StringBuilder(); + + buffer.append("@A("); + + value.accept(new JavaElementVisitor() { + @Override + public void visitExpression(PsiExpression expression) { + buffer.append(expression.getText()); + } + + @Override + public void visitNewExpression(PsiNewExpression expression) { + PsiArrayInitializerExpression arrayInitializer = expression.getArrayInitializer(); + if (arrayInitializer == null) { + super.visitNewExpression(expression); + } + else { + buffer.append(")"); + } + } + + }); + + buffer.append(")"); + + try { + return GroovyPsiElementFactory.getInstance(value.getProject()).createAnnotationFromText(buffer.toString()); + } + catch (IncorrectOperationException e) { + return null; + } + } +} diff --git a/java/java-tests/testData/refactoring/extractMethod/Expression_after.java b/java/java-tests/testData/refactoring/extractMethod/Expression_after.java new file mode 100644 index 000000000000..03f14023885c --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethod/Expression_after.java @@ -0,0 +1,39 @@ +public class AnnotationArgConverter { + public GrAnnotationMemberValue convert(PsiAnnotationMemberValue value) { + final StringBuilder buffer = new StringBuilder(); + + buffer.append("@A("); + + newMethod(value, buffer); + + buffer.append(")"); + + try { + return GroovyPsiElementFactory.getInstance(value.getProject()).createAnnotationFromText(buffer.toString()); + } + catch (IncorrectOperationException e) { + return null; + } + } + + private void newMethod(PsiAnnotationMemberValue value, final StringBuilder buffer) { + value.accept(new JavaElementVisitor() { + @Override + public void visitExpression(PsiExpression expression) { + buffer.append(expression.getText()); + } + + @Override + public void visitNewExpression(PsiNewExpression expression) { + PsiArrayInitializerExpression arrayInitializer = expression.getArrayInitializer(); + if (arrayInitializer == null) { + super.visitNewExpression(expression); + } + else { + buffer.append(")"); + } + } + + }); + } +} diff --git a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java index 88537b77e8ea..b56646516390 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java @@ -591,6 +591,10 @@ public class ExtractMethodTest extends LightCodeInsightTestCase { doTest(); } + public void testExpression() throws Exception { + doTest(); + } + private void doTestDisabledParam() throws PrepareFailedException { final CodeStyleSettings settings = CodeStyleSettingsManager.getSettings(getProject()); settings.ELSE_ON_NEW_LINE = true;