From 9d5565a376bd04a89e29a211c922d6ed74b4c902 Mon Sep 17 00:00:00 2001 From: "Denis.Zhdanov" Date: Thu, 27 Sep 2012 14:17:57 +0400 Subject: [PATCH] IDEA-92081 Reformat causes syntax error when "Ensure margin not exceeded" --- .../formatter/PyLineWrapPositionStrategy.java | 22 +++++++++++++++++++ .../formatter/wrapDefinitionWithLongLine.py | 2 ++ .../wrapDefinitionWithLongLine_after.py | 2 ++ .../com/jetbrains/python/PyFormatterTest.java | 6 +++++ 4 files changed, 32 insertions(+) create mode 100644 python/testData/formatter/wrapDefinitionWithLongLine.py create mode 100644 python/testData/formatter/wrapDefinitionWithLongLine_after.py diff --git a/python/src/com/jetbrains/python/formatter/PyLineWrapPositionStrategy.java b/python/src/com/jetbrains/python/formatter/PyLineWrapPositionStrategy.java index 64949c7e0646..8900a354339e 100644 --- a/python/src/com/jetbrains/python/formatter/PyLineWrapPositionStrategy.java +++ b/python/src/com/jetbrains/python/formatter/PyLineWrapPositionStrategy.java @@ -1,6 +1,10 @@ package com.jetbrains.python.formatter; +import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.GenericLineWrapPositionStrategy; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.util.text.CharArrayUtil; +import org.jetbrains.annotations.NotNull; /** * @author yole @@ -22,4 +26,22 @@ public class PyLineWrapPositionStrategy extends GenericLineWrapPositionStrategy // Symbols to wrap before addRule(new Rule('.', WrapCondition.BEFORE)); } + + @Override + protected boolean canUseOffset(@NotNull Document document, int offset, boolean virtual) { + if (virtual) { + return true; + } + CharSequence text = document.getCharsSequence(); + char c = text.charAt(offset); + if (!StringUtil.isWhiteSpace(c)) { + return true; + } + + int i = CharArrayUtil.shiftBackward(text, offset, " \t"); + if (i < 2) { + return true; + } + return text.charAt(i - 2) != 'd' || text.charAt(i - 1) != 'e' || text.charAt(i) != 'f'; + } } diff --git a/python/testData/formatter/wrapDefinitionWithLongLine.py b/python/testData/formatter/wrapDefinitionWithLongLine.py new file mode 100644 index 000000000000..55f4c662ebcd --- /dev/null +++ b/python/testData/formatter/wrapDefinitionWithLongLine.py @@ -0,0 +1,2 @@ +def my_function_name_which_is_rather_long: + pass \ No newline at end of file diff --git a/python/testData/formatter/wrapDefinitionWithLongLine_after.py b/python/testData/formatter/wrapDefinitionWithLongLine_after.py new file mode 100644 index 000000000000..55f4c662ebcd --- /dev/null +++ b/python/testData/formatter/wrapDefinitionWithLongLine_after.py @@ -0,0 +1,2 @@ +def my_function_name_which_is_rather_long: + pass \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PyFormatterTest.java b/python/testSrc/com/jetbrains/python/PyFormatterTest.java index 776228d7bae2..d0e448c18751 100644 --- a/python/testSrc/com/jetbrains/python/PyFormatterTest.java +++ b/python/testSrc/com/jetbrains/python/PyFormatterTest.java @@ -207,6 +207,12 @@ public class PyFormatterTest extends PyTestCase { assertEquals(expected, reformatted.getText()); } + public void testWrapDefinitionWithLongLine() { // IDEA-92081 + settings().RIGHT_MARGIN = 30; + settings().WRAP_LONG_LINES = true; + doTest(); + } + private void doTest() { myFixture.configureByFile("formatter/" + getTestName(true) + ".py"); ApplicationManager.getApplication().runWriteAction(new Runnable() {