From 9d0ea65bdb3d7b952828b6b63756caeb6b7e9ac1 Mon Sep 17 00:00:00 2001 From: Mikhail Golubev Date: Thu, 28 Aug 2014 20:30:35 +0400 Subject: [PATCH] PY-12409 Automatically reformat statements modified during "Inline local" refactoring --- .../inline/PyInlineLocalHandler.java | 21 ++++++++++++++----- .../refactoring/inlinelocal/py5832.after.py | 2 ++ .../resultExceedsRightMargin.after.py | 3 +++ .../resultExceedsRightMargin.before.py | 3 +++ .../python/refactoring/PyInlineLocalTest.java | 11 ++++++++++ 5 files changed, 35 insertions(+), 5 deletions(-) create mode 100644 python/testData/refactoring/inlinelocal/resultExceedsRightMargin.after.py create mode 100644 python/testData/refactoring/inlinelocal/resultExceedsRightMargin.before.py diff --git a/python/src/com/jetbrains/python/refactoring/inline/PyInlineLocalHandler.java b/python/src/com/jetbrains/python/refactoring/inline/PyInlineLocalHandler.java index 6fe407dbedb8..4f2dc65a22d3 100644 --- a/python/src/com/jetbrains/python/refactoring/inline/PyInlineLocalHandler.java +++ b/python/src/com/jetbrains/python/refactoring/inline/PyInlineLocalHandler.java @@ -29,18 +29,19 @@ import com.intellij.openapi.editor.markup.TextAttributes; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.TextRange; import com.intellij.openapi.wm.WindowManager; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiFile; -import com.intellij.psi.PsiReference; -import com.intellij.psi.PsiWhiteSpace; +import com.intellij.psi.*; +import com.intellij.psi.codeStyle.CodeStyleManager; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.util.CommonRefactoringUtil; import com.intellij.refactoring.util.RefactoringMessageDialog; +import com.intellij.util.Function; import com.intellij.util.Query; +import com.intellij.util.containers.ContainerUtil; import com.jetbrains.python.PyBundle; import com.jetbrains.python.PyTokenTypes; import com.jetbrains.python.PythonLanguage; @@ -62,7 +63,7 @@ import java.util.List; */ public class PyInlineLocalHandler extends InlineActionHandler { private static final Logger LOG = Logger.getInstance(PyInlineLocalHandler.class.getName()); - + private static final String REFACTORING_NAME = RefactoringBundle.message("inline.variable.title"); private static final Pair EMPTY_DEF_RESULT = Pair.create(null, false); private static final String HELP_ID = "python.reference.inline"; @@ -206,6 +207,16 @@ public class PyInlineLocalHandler extends InlineActionHandler { PyPsiUtils.removeElements(next); } PyPsiUtils.removeElements(def); + + final List ranges = ContainerUtil.mapNotNull(exprs, new Function() { + @Override + public TextRange fun(PsiElement element) { + final PyStatement parentalStatement = PsiTreeUtil.getParentOfType(element, PyStatement.class, false); + return parentalStatement != null ? parentalStatement.getTextRange() : null; + } + }); + CodeStyleManager.getInstance(project).reformatText(workingFile, ranges); + if (editor != null && !ApplicationManager.getApplication().isUnitTestMode()) { highlightManager.addOccurrenceHighlights(editor, exprs, attributes, true, null); WindowManager.getInstance().getStatusBar(project) diff --git a/python/testData/refactoring/inlinelocal/py5832.after.py b/python/testData/refactoring/inlinelocal/py5832.after.py index 6b78080fbe57..bde7ba338a65 100644 --- a/python/testData/refactoring/inlinelocal/py5832.after.py +++ b/python/testData/refactoring/inlinelocal/py5832.after.py @@ -1,3 +1,5 @@ def foo(arg): print arg + + foo(('a', 'b')) \ No newline at end of file diff --git a/python/testData/refactoring/inlinelocal/resultExceedsRightMargin.after.py b/python/testData/refactoring/inlinelocal/resultExceedsRightMargin.after.py new file mode 100644 index 000000000000..acc61d6ec5ae --- /dev/null +++ b/python/testData/refactoring/inlinelocal/resultExceedsRightMargin.after.py @@ -0,0 +1,3 @@ +result = '123456789|123456789|123456789|123456789|123456789|' + \ + '123456789|123456789|123456789|123456789|123456789|' + \ + '123456789|123456789|123456789|123456789|123456789|' \ No newline at end of file diff --git a/python/testData/refactoring/inlinelocal/resultExceedsRightMargin.before.py b/python/testData/refactoring/inlinelocal/resultExceedsRightMargin.before.py new file mode 100644 index 000000000000..8910b0d40270 --- /dev/null +++ b/python/testData/refactoring/inlinelocal/resultExceedsRightMargin.before.py @@ -0,0 +1,3 @@ +s = '123456789|123456789|123456789|123456789|123456789|' + +result = s + s + s \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/refactoring/PyInlineLocalTest.java b/python/testSrc/com/jetbrains/python/refactoring/PyInlineLocalTest.java index a86cf066bd4a..9a764b94169d 100644 --- a/python/testSrc/com/jetbrains/python/refactoring/PyInlineLocalTest.java +++ b/python/testSrc/com/jetbrains/python/refactoring/PyInlineLocalTest.java @@ -18,6 +18,9 @@ package com.jetbrains.python.refactoring; import com.intellij.codeInsight.TargetElementUtilBase; import com.intellij.openapi.util.Comparing; import com.intellij.psi.PsiElement; +import com.intellij.psi.codeStyle.CodeStyleSettings; +import com.intellij.psi.codeStyle.CodeStyleSettingsManager; +import com.jetbrains.python.PythonLanguage; import com.jetbrains.python.fixtures.PyTestCase; import com.jetbrains.python.refactoring.inline.PyInlineLocalHandler; @@ -90,4 +93,12 @@ public class PyInlineLocalTest extends PyTestCase { public void testReferenceInParenthesis() { doTest(); } + + // PY-12409 + public void testResultExceedsRightMargin() { + final CodeStyleSettings settings = CodeStyleSettingsManager.getSettings(myFixture.getProject()); + settings.WRAP_LONG_LINES = true; + settings.setRightMargin(PythonLanguage.getInstance(), 80); + doTest(); + } }