diff --git a/python/python-psi-impl/src/com/jetbrains/python/formatter/PyBlock.java b/python/python-psi-impl/src/com/jetbrains/python/formatter/PyBlock.java index 3edc9a816ed7..0f209ccad8cb 100644 --- a/python/python-psi-impl/src/com/jetbrains/python/formatter/PyBlock.java +++ b/python/python-psi-impl/src/com/jetbrains/python/formatter/PyBlock.java @@ -93,6 +93,7 @@ public class PyBlock implements ASTBlock { private Wrap myDictWrapping = null; private Wrap myFromImportWrapping = null; private Wrap myParameterListWrapping = null; + private Wrap myArgumentListWrapping = null; public PyBlock(@Nullable PyBlock parent, @NotNull ASTNode node, @@ -120,6 +121,9 @@ public class PyBlock implements ASTBlock { else if (node.getElementType() == PyElementTypes.PARAMETER_LIST) { myParameterListWrapping = Wrap.createWrap(settings.METHOD_PARAMETERS_WRAP, settings.METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE); } + else if (node.getElementType() == PyElementTypes.ARGUMENT_LIST) { + myArgumentListWrapping = Wrap.createWrap(settings.CALL_PARAMETERS_WRAP, settings.CALL_PARAMETERS_LPAREN_ON_NEXT_LINE); + } } @Override @@ -409,6 +413,12 @@ public class PyBlock implements ASTBlock { childType != PyTokenTypes.RPAR) { childWrap = myParameterListWrapping; } + if (parentType == PyElementTypes.ARGUMENT_LIST && + childType != PyTokenTypes.COMMA && + childType != PyTokenTypes.LPAR && + childType != PyTokenTypes.RPAR) { + childWrap = myArgumentListWrapping; + } if (isAfterStatementList(child) && !hasLineBreaksBeforeInSameParent(child, 2) && diff --git a/python/src/com/jetbrains/python/formatter/PyLanguageCodeStyleSettingsProvider.java b/python/src/com/jetbrains/python/formatter/PyLanguageCodeStyleSettingsProvider.java index aae45e6f3866..ff2538d6bea1 100644 --- a/python/src/com/jetbrains/python/formatter/PyLanguageCodeStyleSettingsProvider.java +++ b/python/src/com/jetbrains/python/formatter/PyLanguageCodeStyleSettingsProvider.java @@ -97,6 +97,7 @@ public class PyLanguageCodeStyleSettingsProvider extends LanguageCodeStyleSettin "WRAP_ON_TYPING", "KEEP_LINE_BREAKS", "WRAP_LONG_LINES", + "CALL_PARAMETERS_WRAP", "CALL_PARAMETERS_LPAREN_ON_NEXT_LINE", "CALL_PARAMETERS_RPAREN_ON_NEXT_LINE", "ALIGN_MULTILINE_PARAMETERS", @@ -161,6 +162,7 @@ public class PyLanguageCodeStyleSettingsProvider extends LanguageCodeStyleSettin // behavior commonSettings.KEEP_BLANK_LINES_IN_CODE = 1; commonSettings.METHOD_PARAMETERS_WRAP = CommonCodeStyleSettings.WRAP_AS_NEEDED; + commonSettings.CALL_PARAMETERS_WRAP = CommonCodeStyleSettings.WRAP_AS_NEEDED; } @Nullable @@ -213,8 +215,7 @@ public class PyLanguageCodeStyleSettingsProvider extends LanguageCodeStyleSettin "def xyzzy(a1, a2, long_parameter_1, a3, a4, long_parameter_2):\n" + " pass\n" + "\n" + - "xyzzy('long_string_constant1',\n" + - " 'long_string_constant2')\n" + + "xyzzy(1, 2, 'long_string_constant1', 3, 4, 'long_string_constant2')\n" + "\n" + "xyzzy(\n" + " 'with',\n" + diff --git a/python/testData/formatter/defaultWrappingForCallArguments.py b/python/testData/formatter/defaultWrappingForCallArguments.py new file mode 100644 index 000000000000..b2d726a6d8a0 --- /dev/null +++ b/python/testData/formatter/defaultWrappingForCallArguments.py @@ -0,0 +1 @@ +value = some_function("long_param1", "long_param2", "long_param3", long_kwarg1="with long value1", long_kwarg2="with long value2") diff --git a/python/testData/formatter/defaultWrappingForCallArguments_after.py b/python/testData/formatter/defaultWrappingForCallArguments_after.py new file mode 100644 index 000000000000..3b46edafecab --- /dev/null +++ b/python/testData/formatter/defaultWrappingForCallArguments_after.py @@ -0,0 +1,3 @@ +value = some_function("long_param1", "long_param2", "long_param3", + long_kwarg1="with long value1", + long_kwarg2="with long value2") diff --git a/python/testData/formatter/defaultWrappingWithNewLineParensForCallArguments.py b/python/testData/formatter/defaultWrappingWithNewLineParensForCallArguments.py new file mode 100644 index 000000000000..b2d726a6d8a0 --- /dev/null +++ b/python/testData/formatter/defaultWrappingWithNewLineParensForCallArguments.py @@ -0,0 +1 @@ +value = some_function("long_param1", "long_param2", "long_param3", long_kwarg1="with long value1", long_kwarg2="with long value2") diff --git a/python/testData/formatter/defaultWrappingWithNewLineParensForCallArguments_after.py b/python/testData/formatter/defaultWrappingWithNewLineParensForCallArguments_after.py new file mode 100644 index 000000000000..c2cda93eefa5 --- /dev/null +++ b/python/testData/formatter/defaultWrappingWithNewLineParensForCallArguments_after.py @@ -0,0 +1,4 @@ +value = some_function( + "long_param1", "long_param2", "long_param3", long_kwarg1="with long value1", + long_kwarg2="with long value2" +) diff --git a/python/testData/formatter/wrappingChopDownIfLongForCallArguments.py b/python/testData/formatter/wrappingChopDownIfLongForCallArguments.py new file mode 100644 index 000000000000..b2d726a6d8a0 --- /dev/null +++ b/python/testData/formatter/wrappingChopDownIfLongForCallArguments.py @@ -0,0 +1 @@ +value = some_function("long_param1", "long_param2", "long_param3", long_kwarg1="with long value1", long_kwarg2="with long value2") diff --git a/python/testData/formatter/wrappingChopDownIfLongForCallArguments_after.py b/python/testData/formatter/wrappingChopDownIfLongForCallArguments_after.py new file mode 100644 index 000000000000..f941d70f933c --- /dev/null +++ b/python/testData/formatter/wrappingChopDownIfLongForCallArguments_after.py @@ -0,0 +1,5 @@ +value = some_function("long_param1", + "long_param2", + "long_param3", + long_kwarg1="with long value1", + long_kwarg2="with long value2") diff --git a/python/testData/formatter/wrappingChopDownIfLongWithNewLineParensForCallArguments.py b/python/testData/formatter/wrappingChopDownIfLongWithNewLineParensForCallArguments.py new file mode 100644 index 000000000000..b2d726a6d8a0 --- /dev/null +++ b/python/testData/formatter/wrappingChopDownIfLongWithNewLineParensForCallArguments.py @@ -0,0 +1 @@ +value = some_function("long_param1", "long_param2", "long_param3", long_kwarg1="with long value1", long_kwarg2="with long value2") diff --git a/python/testData/formatter/wrappingChopDownIfLongWithNewLineParensForCallArguments_after.py b/python/testData/formatter/wrappingChopDownIfLongWithNewLineParensForCallArguments_after.py new file mode 100644 index 000000000000..c6f388ae47cf --- /dev/null +++ b/python/testData/formatter/wrappingChopDownIfLongWithNewLineParensForCallArguments_after.py @@ -0,0 +1,7 @@ +value = some_function( + "long_param1", + "long_param2", + "long_param3", + long_kwarg1="with long value1", + long_kwarg2="with long value2" +) diff --git a/python/testSrc/com/jetbrains/python/PyFormatterTest.java b/python/testSrc/com/jetbrains/python/PyFormatterTest.java index 20576a23c252..cc683fc2c99a 100644 --- a/python/testSrc/com/jetbrains/python/PyFormatterTest.java +++ b/python/testSrc/com/jetbrains/python/PyFormatterTest.java @@ -190,6 +190,34 @@ public class PyFormatterTest extends PyTestCase { doTest(); } + public void testDefaultWrappingForCallArguments() { // PY-33060 + getCodeStyleSettings().setRightMargin(PythonLanguage.getInstance(), 80); + doTest(); + } + + public void testDefaultWrappingWithNewLineParensForCallArguments() { // PY-33060 + getCodeStyleSettings().setRightMargin(PythonLanguage.getInstance(), 80); + getCommonCodeStyleSettings().ALIGN_MULTILINE_PARAMETERS_IN_CALLS = false; + getCommonCodeStyleSettings().CALL_PARAMETERS_LPAREN_ON_NEXT_LINE = true; + getCommonCodeStyleSettings().CALL_PARAMETERS_RPAREN_ON_NEXT_LINE = true; + doTest(); + } + + public void testWrappingChopDownIfLongForCallArguments() { // PY-33060 + getCodeStyleSettings().setRightMargin(PythonLanguage.getInstance(), 80); + getCommonCodeStyleSettings().CALL_PARAMETERS_WRAP = WrapType.CHOP_DOWN_IF_LONG.getLegacyRepresentation(); + doTest(); + } + + public void testWrappingChopDownIfLongWithNewLineParensForCallArguments() { // PY-33060 + getCodeStyleSettings().setRightMargin(PythonLanguage.getInstance(), 80); + getCommonCodeStyleSettings().CALL_PARAMETERS_WRAP = WrapType.CHOP_DOWN_IF_LONG.getLegacyRepresentation(); + getCommonCodeStyleSettings().ALIGN_MULTILINE_PARAMETERS_IN_CALLS = false; + getCommonCodeStyleSettings().CALL_PARAMETERS_LPAREN_ON_NEXT_LINE = true; + getCommonCodeStyleSettings().CALL_PARAMETERS_RPAREN_ON_NEXT_LINE = true; + doTest(); + } + public void testLambdaColon() { doTest(); }