From e826946631503dd4e5e9a60e82436f108442cce4 Mon Sep 17 00:00:00 2001 From: Ekaterina Tuzova Date: Wed, 19 Jun 2013 15:59:19 +0400 Subject: [PATCH] do not use the same formatting rules inside string literals fixed PY-9661 Fill paragraph generally bad --- .../formatter/PyLineWrapPositionStrategy.java | 40 +++++++++++++++++++ .../fillParagraph/multilineDocstring_after.py | 4 +- .../fillParagraph/singleLine_after.py | 2 +- 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/python/src/com/jetbrains/python/formatter/PyLineWrapPositionStrategy.java b/python/src/com/jetbrains/python/formatter/PyLineWrapPositionStrategy.java index 875333d46ce7..0d615d7a9f87 100644 --- a/python/src/com/jetbrains/python/formatter/PyLineWrapPositionStrategy.java +++ b/python/src/com/jetbrains/python/formatter/PyLineWrapPositionStrategy.java @@ -2,9 +2,16 @@ package com.jetbrains.python.formatter; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.GenericLineWrapPositionStrategy; +import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.psi.PsiDocumentManager; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.text.CharArrayUtil; +import com.jetbrains.python.psi.StringLiteralExpression; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * @author yole @@ -44,4 +51,37 @@ public class PyLineWrapPositionStrategy extends GenericLineWrapPositionStrategy } return text.charAt(i - 2) != 'd' || text.charAt(i - 1) != 'e' || text.charAt(i) != 'f'; } + + @Override + public int calculateWrapPosition(@NotNull Document document, + @Nullable Project project, + int startOffset, + int endOffset, + int maxPreferredOffset, + boolean allowToBeyondMaxPreferredOffset, + boolean virtual) { + int wrapPosition = + super.calculateWrapPosition(document, project, startOffset, endOffset, maxPreferredOffset, allowToBeyondMaxPreferredOffset, virtual); + if (wrapPosition < 0) return wrapPosition; + final CharSequence text = document.getCharsSequence(); + + char c = text.charAt(wrapPosition); + if (!StringUtil.isWhiteSpace(c) || project == null) { + return wrapPosition; + } + + final PsiDocumentManager documentManager = PsiDocumentManager.getInstance(project); + if (documentManager != null) { + final PsiFile psiFile = documentManager.getPsiFile(document); + if (psiFile != null) { + final PsiElement element = psiFile.findElementAt(wrapPosition); + final StringLiteralExpression string = PsiTreeUtil.getParentOfType(element, StringLiteralExpression.class); + + if (string != null) { + return wrapPosition + 1; + } + } + } + return wrapPosition; + } } diff --git a/python/testData/fillParagraph/multilineDocstring_after.py b/python/testData/fillParagraph/multilineDocstring_after.py index 5dc9c0a2a06c..8078d566e4bf 100644 --- a/python/testData/fillParagraph/multilineDocstring_after.py +++ b/python/testData/fillParagraph/multilineDocstring_after.py @@ -3,6 +3,6 @@ __author__ = 'ktisha' def foo(): """ This is my docstring. There are many like it, but this one mine. My docstring is my best friend. it is my life. I - must master it as I must master my life. This is my docstring. There are many like it, but this one mine. My - docstring is my best friend. it is my life. I must master it as I must master my life. + must master it as I must master my life. This is my docstring. There are many like it, but this one mine. My + docstring is my best friend. it is my life. I must master it as I must master my life. """ \ No newline at end of file diff --git a/python/testData/fillParagraph/singleLine_after.py b/python/testData/fillParagraph/singleLine_after.py index 2976c200ecb7..72934d2d8bed 100644 --- a/python/testData/fillParagraph/singleLine_after.py +++ b/python/testData/fillParagraph/singleLine_after.py @@ -1,4 +1,4 @@ def f(): """ This is my docstring. There are many like it, but this one mine. My docstring is my best friend. it is my life. - I must master it as I must master my life. + I must master it as I must master my life. """ \ No newline at end of file