From 5c4b6ceaa4b961fc8de78181e5aec5807f672823 Mon Sep 17 00:00:00 2001 From: Mikhail Golubev Date: Thu, 16 Jul 2015 17:00:47 +0300 Subject: [PATCH] PY-15791 Force spaces around "=" sign preceding default value of annotated parameter --- python/src/com/jetbrains/python/formatter/PyBlock.java | 10 +++++++++- .../forceSpacesAroundEqualSignInAnnotatedParameter.py | 2 ++ ...eSpacesAroundEqualSignInAnnotatedParameter_after.py | 2 ++ python/testData/intentions/afterTypeAnnotation3.py | 2 +- python/testData/override/typeAnnotations_after.py | 6 +++--- .../testSrc/com/jetbrains/python/PyFormatterTest.java | 7 ++++++- 6 files changed, 23 insertions(+), 6 deletions(-) create mode 100644 python/testData/formatter/forceSpacesAroundEqualSignInAnnotatedParameter.py create mode 100644 python/testData/formatter/forceSpacesAroundEqualSignInAnnotatedParameter_after.py diff --git a/python/src/com/jetbrains/python/formatter/PyBlock.java b/python/src/com/jetbrains/python/formatter/PyBlock.java index 5630f2bb7869..dc45bed51317 100644 --- a/python/src/com/jetbrains/python/formatter/PyBlock.java +++ b/python/src/com/jetbrains/python/formatter/PyBlock.java @@ -41,6 +41,7 @@ import java.util.*; import static com.jetbrains.python.formatter.PyCodeStyleSettings.DICT_ALIGNMENT_ON_COLON; import static com.jetbrains.python.formatter.PyCodeStyleSettings.DICT_ALIGNMENT_ON_VALUE; import static com.jetbrains.python.formatter.PythonFormattingModelBuilder.STATEMENT_OR_DECLARATION; +import static com.jetbrains.python.psi.PyUtil.as; /** * @author yole @@ -719,8 +720,15 @@ public class PyBlock implements ASTBlock { final IElementType childType2 = psi2.getNode().getElementType(); //noinspection ConstantConditions child2 = getSubBlockByNode(node2); - final CommonCodeStyleSettings settings = myContext.getSettings(); + + if ((childType1 == PyTokenTypes.EQ || childType2 == PyTokenTypes.EQ)) { + final PyNamedParameter namedParameter = as(myNode.getPsi(), PyNamedParameter.class); + if (namedParameter != null && namedParameter.getAnnotation() != null) { + return Spacing.createSpacing(1, 1, 0, settings.KEEP_LINE_BREAKS, settings.KEEP_BLANK_LINES_IN_CODE); + } + } + if (childType1 == PyTokenTypes.COLON && psi2 instanceof PyStatementList) { if (needLineBreakInStatement()) { return Spacing.createSpacing(0, 0, 1, true, settings.KEEP_BLANK_LINES_IN_CODE); diff --git a/python/testData/formatter/forceSpacesAroundEqualSignInAnnotatedParameter.py b/python/testData/formatter/forceSpacesAroundEqualSignInAnnotatedParameter.py new file mode 100644 index 000000000000..82983652108b --- /dev/null +++ b/python/testData/formatter/forceSpacesAroundEqualSignInAnnotatedParameter.py @@ -0,0 +1,2 @@ +def test(x = 1, y: int = 2, z: int=3): + pass diff --git a/python/testData/formatter/forceSpacesAroundEqualSignInAnnotatedParameter_after.py b/python/testData/formatter/forceSpacesAroundEqualSignInAnnotatedParameter_after.py new file mode 100644 index 000000000000..61711d51ac80 --- /dev/null +++ b/python/testData/formatter/forceSpacesAroundEqualSignInAnnotatedParameter_after.py @@ -0,0 +1,2 @@ +def test(x=1, y: int = 2, z: int = 3): + pass diff --git a/python/testData/intentions/afterTypeAnnotation3.py b/python/testData/intentions/afterTypeAnnotation3.py index 054f2a6a231f..72c3a4b48a4f 100644 --- a/python/testData/intentions/afterTypeAnnotation3.py +++ b/python/testData/intentions/afterTypeAnnotation3.py @@ -1,2 +1,2 @@ -def g(x: object=None): +def g(x: object = None): return x diff --git a/python/testData/override/typeAnnotations_after.py b/python/testData/override/typeAnnotations_after.py index cb87133042aa..c6415fd7ecbf 100644 --- a/python/testData/override/typeAnnotations_after.py +++ b/python/testData/override/typeAnnotations_after.py @@ -5,7 +5,7 @@ class ArgsTest: comment:str=None, version:int=None): pass class Sub(ArgsTest): - def __init__(self, key: str=None, value: str=None, max_age=None, expires=None, path: str=None, domain: str=None, - secure: bool=False, httponly: bool=False, sync_expires: bool=True, comment: str=None, - version: int=None): + def __init__(self, key: str = None, value: str = None, max_age=None, expires=None, path: str = None, + domain: str = None, secure: bool = False, httponly: bool = False, sync_expires: bool = True, + comment: str = None, version: int = None): super().__init__(key, value, max_age, expires, path, domain, secure, httponly, sync_expires, comment, version) diff --git a/python/testSrc/com/jetbrains/python/PyFormatterTest.java b/python/testSrc/com/jetbrains/python/PyFormatterTest.java index 80b41bfde2d7..d5437c01671f 100644 --- a/python/testSrc/com/jetbrains/python/PyFormatterTest.java +++ b/python/testSrc/com/jetbrains/python/PyFormatterTest.java @@ -364,6 +364,11 @@ public class PyFormatterTest extends PyTestCase { doTestPy3(); } + // PY-15791 + public void testForceSpacesAroundEqualSignInAnnotatedParameter() { + doTestPy3(); + } + public void testWrapInBinaryExpression() { // PY-9032 getCodeStyleSettings().setRightMargin(PythonLanguage.getInstance(), 80); doTest(true); @@ -612,7 +617,7 @@ public class PyFormatterTest extends PyTestCase { public void testHangingIndentDetectionIgnoresComments() { doTest(); } - + // PY-15530 public void testAlignmentInArgumentListWhereFirstArgumentIsEmptyCall() { doTest();