From 05b90b10a39fbae5450e3c82a04df39882760154 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 16 Dec 2015 15:57:06 +0100 Subject: [PATCH] introduce: shrink selection to exclude whitespaces and comments (IDEA-149120) --- .../introduceVariable/IntroduceVariableBase.java | 11 ++++++++++- ...nWithSpacesInSelectionAndTailingComment.after.java | 8 ++++++++ ...ressionWithSpacesInSelectionAndTailingComment.java | 7 +++++++ .../intellij/refactoring/IntroduceVariableTest.java | 4 ++++ 4 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/refactoring/introduceVariable/SubexpressionWithSpacesInSelectionAndTailingComment.after.java create mode 100644 java/java-tests/testData/refactoring/introduceVariable/SubexpressionWithSpacesInSelectionAndTailingComment.java diff --git a/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java b/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java index e401a679f87d..6220a00869f9 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java @@ -302,7 +302,11 @@ public abstract class IntroduceVariableBase extends IntroduceHandlerBase { final InjectedLanguageManager injectedLanguageManager = InjectedLanguageManager.getInstance(project); PsiElement elementAtStart = file.findElementAt(startOffset); if (elementAtStart == null || elementAtStart instanceof PsiWhiteSpace || elementAtStart instanceof PsiComment) { - elementAtStart = PsiTreeUtil.skipSiblingsForward(elementAtStart, PsiWhiteSpace.class, PsiComment.class); + final PsiElement element = PsiTreeUtil.skipSiblingsForward(elementAtStart, PsiWhiteSpace.class, PsiComment.class); + if (element != null) { + startOffset = element.getTextOffset(); + elementAtStart = file.findElementAt(startOffset); + } if (elementAtStart == null) { if (injectedLanguageManager.isInjectedFragment(file)) { return getSelectionFromInjectedHost(project, file, injectedLanguageManager, startOffset, endOffset); @@ -323,6 +327,11 @@ public abstract class IntroduceVariableBase extends IntroduceHandlerBase { PsiElement elementAt = PsiTreeUtil.findCommonParent(elementAtStart, elementAtEnd); final PsiExpression containingExpression = PsiTreeUtil.getParentOfType(elementAt, PsiExpression.class, false); + + if (containingExpression != null && containingExpression == elementAtEnd && startOffset == containingExpression.getTextOffset()) { + return containingExpression; + } + if (containingExpression == null || containingExpression instanceof PsiLambdaExpression) { if (injectedLanguageManager.isInjectedFragment(file)) { return getSelectionFromInjectedHost(project, file, injectedLanguageManager, startOffset, endOffset); diff --git a/java/java-tests/testData/refactoring/introduceVariable/SubexpressionWithSpacesInSelectionAndTailingComment.after.java b/java/java-tests/testData/refactoring/introduceVariable/SubexpressionWithSpacesInSelectionAndTailingComment.after.java new file mode 100644 index 000000000000..d69f3f6af288 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceVariable/SubexpressionWithSpacesInSelectionAndTailingComment.after.java @@ -0,0 +1,8 @@ +class Test { + { + final String ab = "".substring(1) + .substring(1); + ab // comment + .notify() + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/introduceVariable/SubexpressionWithSpacesInSelectionAndTailingComment.java b/java/java-tests/testData/refactoring/introduceVariable/SubexpressionWithSpacesInSelectionAndTailingComment.java new file mode 100644 index 000000000000..1c58a8bec362 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceVariable/SubexpressionWithSpacesInSelectionAndTailingComment.java @@ -0,0 +1,7 @@ +class Test { + { + "".substring(1) + .substring(1) // comment + .notify() + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java index f84ec7a34264..a486f2b3a7fd 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java @@ -313,6 +313,10 @@ public class IntroduceVariableTest extends LightCodeInsightTestCase { doTest(new MockIntroduceVariableHandler("ab", true, true, false, "boolean")); } + public void testSubexpressionWithSpacesInSelectionAndTailingComment() { + doTest(new MockIntroduceVariableHandler("ab", true, true, false, CommonClassNames.JAVA_LANG_STRING)); + } + public void testDuplicatesAnonymousClassCreationWithSimilarParameters () { doTest(new MockIntroduceVariableHandler("foo1", true, true, false, "Foo")); }