From c4dc3c2f99d7d80c2e53385d1cc3256298a98782 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 13 Dec 2012 17:11:56 +0100 Subject: [PATCH 1/4] align multiline parameters in calls by default (PY-5700) --- .../python/formatter/PyLanguageCodeStyleSettingsProvider.java | 1 + 1 file changed, 1 insertion(+) diff --git a/python/src/com/jetbrains/python/formatter/PyLanguageCodeStyleSettingsProvider.java b/python/src/com/jetbrains/python/formatter/PyLanguageCodeStyleSettingsProvider.java index c8fb8f513e11..8899cfc59ab4 100644 --- a/python/src/com/jetbrains/python/formatter/PyLanguageCodeStyleSettingsProvider.java +++ b/python/src/com/jetbrains/python/formatter/PyLanguageCodeStyleSettingsProvider.java @@ -86,6 +86,7 @@ public class PyLanguageCodeStyleSettingsProvider extends LanguageCodeStyleSettin CommonCodeStyleSettings defaultSettings = new CommonCodeStyleSettings(PythonLanguage.getInstance()); CommonCodeStyleSettings.IndentOptions indentOptions = defaultSettings.initIndentOptions(); indentOptions.INDENT_SIZE = 4; + defaultSettings.ALIGN_MULTILINE_PARAMETERS_IN_CALLS = true; return defaultSettings; } From 218239d6f3be8bb817b2a5f1d4151ded8050bed4 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 13 Dec 2012 19:50:39 +0100 Subject: [PATCH 2/4] build fix (PY-8275) --- python/build/pycharm_build.gant | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/python/build/pycharm_build.gant b/python/build/pycharm_build.gant index ff18afd3a2aa..a1f689f2e504 100644 --- a/python/build/pycharm_build.gant +++ b/python/build/pycharm_build.gant @@ -168,11 +168,9 @@ private layoutPlugins(layouts) { dir("themes") { fileset(dir: "${home}/plugins/textmate/lib/themes/", includes: "*.tmTheme") } - dir("lib") { - fileset(dir: "${home}/plugins/textmate/lib") { - include(name: "jcodings.jar") - include(name: "joni.jar") - } + fileset(dir: "${home}/plugins/textmate/lib") { + include(name: "jcodings.jar") + include(name: "joni.jar") } } } From 279a136c148835d938a18e271ee3264d4b9e4b87 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 13 Dec 2012 20:04:11 +0100 Subject: [PATCH 3/4] change option "between top-level classes and functions" to "around ...", ensure that we put two lines between import and class (PY-7743) --- .../com/jetbrains/python/formatter/PyCodeStyleSettings.java | 2 +- .../formatter/PyLanguageCodeStyleSettingsProvider.java | 2 +- .../python/formatter/PythonFormattingModelBuilder.java | 4 +++- python/testData/copyPaste/Indent2.after.py | 1 + python/testData/formatter/alignForMethodArguments_after.py | 1 + python/testData/formatter/beforeTopLevelClass.py | 5 +++++ python/testData/formatter/beforeTopLevelClass_after.py | 6 ++++++ python/testData/formatter/blankLineAfterImports.py | 2 +- python/testData/formatter/blankLineAfterImports_after.py | 2 +- python/testData/formatter/comment_after.py | 1 + .../testData/formatter/noAlignForMethodArguments_after.py | 1 + python/testData/formatter/spaceInMethodDeclaration_after.py | 1 + python/testData/inspections/AddFieldFromInstance_after.py | 1 + python/testData/inspections/AddFunctionToModule_after.py | 1 + python/testData/inspections/AddMethodFromInstance_after.py | 1 + .../intentions/afterConvertFormatOperatorToMethodMulti.py | 2 +- python/testData/intentions/afterConvertLambdaToFunction.py | 1 - .../testData/intentions/afterUnicodeStringConcatToFormat.py | 1 + .../refactoring/changeSignature/addDefaultParam.after.py | 1 + .../refactoring/changeSignature/addDefaultParam1.after.py | 1 + .../refactoring/changeSignature/addPositionalParam.after.py | 1 + .../refactoring/changeSignature/changeFunctionName.after.py | 1 + .../refactoring/changeSignature/fixDocstringRemove.after.py | 1 + .../refactoring/changeSignature/keywordOnlyParams.after.py | 1 + .../refactoring/changeSignature/keywordParam.after.py | 1 + python/testData/refactoring/changeSignature/kwArgs.after.py | 1 + .../changeSignature/removeDefaultFromParam.after.py | 1 + .../changeSignature/removeFirstPositionalParam.after.py | 1 + .../changeSignature/removePositionalParam.after.py | 1 + .../changeSignature/switchPositionalParam.after.py | 1 + .../refactoring/changeSignature/updateDocstring.after.py | 1 + .../refactoring/extractmethod/BinaryExpression.after.py | 1 + .../extractmethod/GlobalToplevelAssignment.after.py | 2 ++ .../refactoring/extractmethod/GlobalVarAssignment.after.py | 1 + .../refactoring/extractmethod/StatementReturn.after.py | 1 + .../extractsuperclass/multifile/target.append.py | 1 + .../refactoring/extractsuperclass/withImport.after.py | 1 + .../introduceConstant/insertAfterDocstring.after.py | 1 + .../introduceConstant/insertAfterImport.after.py | 1 + .../testData/refactoring/introduceConstant/py4414.after.py | 1 + python/testData/refactoring/move/baseClass/after/src/a.py | 1 + python/testData/refactoring/move/class/after/src/b.py | 1 + python/testData/refactoring/move/function/after/src/b.py | 1 + .../refactoring/move/functionToUsage/after/src/b.py | 2 ++ python/testData/refactoring/move/importAs/after/src/b.py | 1 + python/testData/refactoring/move/importAs/after/src/c.py | 1 + .../move/importFirstWithSlash/after/src/file2.py | 1 + .../refactoring/move/importSlash/after/src/file2.py | 1 + .../testData/refactoring/move/innerImports/after/src/b.py | 1 + python/testData/refactoring/move/newModule/after/src/b.py | 1 + .../testData/refactoring/move/packageImport/after/src/b.py | 1 + .../testData/refactoring/move/packageImport/after/src/c.py | 1 + .../refactoring/move/qualifiedImport/after/src/c.py | 1 + .../refactoring/move/starImportUsage/after/src/c.py | 1 + .../testData/refactoring/move/subModuleUsage/after/src/b.py | 1 + .../refactoring/move/usageFromFunction/after/src/b.py | 1 + python/testSrc/com/jetbrains/python/PyFormatterTest.java | 6 +++++- python/testSrc/com/jetbrains/python/PyIndentTest.java | 2 +- .../testSrc/com/jetbrains/python/PythonAllTestsSuite.java | 4 +++- 59 files changed, 77 insertions(+), 10 deletions(-) create mode 100644 python/testData/formatter/beforeTopLevelClass.py create mode 100644 python/testData/formatter/beforeTopLevelClass_after.py diff --git a/python/src/com/jetbrains/python/formatter/PyCodeStyleSettings.java b/python/src/com/jetbrains/python/formatter/PyCodeStyleSettings.java index f7232ade3245..c90398ced375 100644 --- a/python/src/com/jetbrains/python/formatter/PyCodeStyleSettings.java +++ b/python/src/com/jetbrains/python/formatter/PyCodeStyleSettings.java @@ -14,7 +14,7 @@ public class PyCodeStyleSettings extends CustomCodeStyleSettings { public boolean SPACE_AROUND_EQ_IN_NAMED_PARAMETER = false; public boolean SPACE_AROUND_EQ_IN_KEYWORD_ARGUMENT = false; - public int BLANK_LINES_BETWEEN_TOP_LEVEL_CLASSES_FUNCTIONS = 2; + public int BLANK_LINES_AROUND_TOP_LEVEL_CLASSES_FUNCTIONS = 2; public PyCodeStyleSettings(CodeStyleSettings container) { super("Python", container); diff --git a/python/src/com/jetbrains/python/formatter/PyLanguageCodeStyleSettingsProvider.java b/python/src/com/jetbrains/python/formatter/PyLanguageCodeStyleSettingsProvider.java index 8899cfc59ab4..1850d7ad6234 100644 --- a/python/src/com/jetbrains/python/formatter/PyLanguageCodeStyleSettingsProvider.java +++ b/python/src/com/jetbrains/python/formatter/PyLanguageCodeStyleSettingsProvider.java @@ -65,7 +65,7 @@ public class PyLanguageCodeStyleSettingsProvider extends LanguageCodeStyleSettin "BLANK_LINES_AFTER_IMPORTS", "KEEP_BLANK_LINES_IN_DECLARATIONS", "KEEP_BLANK_LINES_IN_CODE"); - consumer.showCustomOption(PyCodeStyleSettings.class, "BLANK_LINES_BETWEEN_TOP_LEVEL_CLASSES_FUNCTIONS", "Between top-level classes and functions:", + consumer.showCustomOption(PyCodeStyleSettings.class, "BLANK_LINES_AROUND_TOP_LEVEL_CLASSES_FUNCTIONS", "Around top-level classes and functions:", BLANK_LINES); } else if (settingsType == SettingsType.WRAPPING_AND_BRACES_SETTINGS) { diff --git a/python/src/com/jetbrains/python/formatter/PythonFormattingModelBuilder.java b/python/src/com/jetbrains/python/formatter/PythonFormattingModelBuilder.java index 38f6d0078142..74a1509bf648 100644 --- a/python/src/com/jetbrains/python/formatter/PythonFormattingModelBuilder.java +++ b/python/src/com/jetbrains/python/formatter/PythonFormattingModelBuilder.java @@ -57,8 +57,10 @@ public class PythonFormattingModelBuilder implements FormattingModelBuilderEx, C final CommonCodeStyleSettings commonSettings = settings.getCommonSettings(PythonLanguage.getInstance()); return new SpacingBuilder(settings) + .betweenInside(STATEMENT_OR_DECLARATION, CLASS_OR_FUNCTION, file).blankLines(pySettings.BLANK_LINES_AROUND_TOP_LEVEL_CLASSES_FUNCTIONS) + .betweenInside(CLASS_OR_FUNCTION, STATEMENT_OR_DECLARATION, file).blankLines(pySettings.BLANK_LINES_AROUND_TOP_LEVEL_CLASSES_FUNCTIONS) .between(IMPORT_STATEMENTS, TokenSet.andNot(STATEMENT_OR_DECLARATION, IMPORT_STATEMENTS)).blankLines(commonSettings.BLANK_LINES_AFTER_IMPORTS) - .betweenInside(CLASS_OR_FUNCTION, CLASS_OR_FUNCTION, file).blankLines(pySettings.BLANK_LINES_BETWEEN_TOP_LEVEL_CLASSES_FUNCTIONS) + .betweenInside(CLASS_OR_FUNCTION, CLASS_OR_FUNCTION, file).blankLines(pySettings.BLANK_LINES_AROUND_TOP_LEVEL_CLASSES_FUNCTIONS) .between(CLASS_DECLARATION, STATEMENT_OR_DECLARATION).blankLines(commonSettings.BLANK_LINES_AROUND_CLASS) .between(STATEMENT_OR_DECLARATION, CLASS_DECLARATION).blankLines(commonSettings.BLANK_LINES_AROUND_CLASS) .between(FUNCTION_DECLARATION, STATEMENT_OR_DECLARATION).blankLines(commonSettings.BLANK_LINES_AROUND_METHOD) diff --git a/python/testData/copyPaste/Indent2.after.py b/python/testData/copyPaste/Indent2.after.py index 0605eb0cbe4c..3aacb75e0d46 100644 --- a/python/testData/copyPaste/Indent2.after.py +++ b/python/testData/copyPaste/Indent2.after.py @@ -2,4 +2,5 @@ def bar(): x = 1 y = 2 + var = "string" \ No newline at end of file diff --git a/python/testData/formatter/alignForMethodArguments_after.py b/python/testData/formatter/alignForMethodArguments_after.py index 0257a4037b34..5587274c47ed 100644 --- a/python/testData/formatter/alignForMethodArguments_after.py +++ b/python/testData/formatter/alignForMethodArguments_after.py @@ -1,4 +1,5 @@ def long_method_name(bar, baz): pass + long_method_name("long string one", "long string two") diff --git a/python/testData/formatter/beforeTopLevelClass.py b/python/testData/formatter/beforeTopLevelClass.py new file mode 100644 index 000000000000..ba9cc6d3e8e7 --- /dev/null +++ b/python/testData/formatter/beforeTopLevelClass.py @@ -0,0 +1,5 @@ +from unittest import TestCase + +class MyTest(TestCase): + def test_pass(self): + self.assertEqual(1 + 1, 2) \ No newline at end of file diff --git a/python/testData/formatter/beforeTopLevelClass_after.py b/python/testData/formatter/beforeTopLevelClass_after.py new file mode 100644 index 000000000000..888df9e26d7b --- /dev/null +++ b/python/testData/formatter/beforeTopLevelClass_after.py @@ -0,0 +1,6 @@ +from unittest import TestCase + + +class MyTest(TestCase): + def test_pass(self): + self.assertEqual(1 + 1, 2) \ No newline at end of file diff --git a/python/testData/formatter/blankLineAfterImports.py b/python/testData/formatter/blankLineAfterImports.py index 21185c040324..ed75c21a7fba 100644 --- a/python/testData/formatter/blankLineAfterImports.py +++ b/python/testData/formatter/blankLineAfterImports.py @@ -1,3 +1,3 @@ import sys from os import * -def foo(): print sys.platform \ No newline at end of file +p = sys.platform \ No newline at end of file diff --git a/python/testData/formatter/blankLineAfterImports_after.py b/python/testData/formatter/blankLineAfterImports_after.py index aea90157f737..adb781c54819 100644 --- a/python/testData/formatter/blankLineAfterImports_after.py +++ b/python/testData/formatter/blankLineAfterImports_after.py @@ -1,4 +1,4 @@ import sys from os import * -def foo(): print sys.platform \ No newline at end of file +p = sys.platform \ No newline at end of file diff --git a/python/testData/formatter/comment_after.py b/python/testData/formatter/comment_after.py index 92330fbd0d6a..def63e49dbf5 100644 --- a/python/testData/formatter/comment_after.py +++ b/python/testData/formatter/comment_after.py @@ -3,4 +3,5 @@ def foo(a): # a is 5 print 'no' + foo(5) \ No newline at end of file diff --git a/python/testData/formatter/noAlignForMethodArguments_after.py b/python/testData/formatter/noAlignForMethodArguments_after.py index 206890bf3600..5682f4ca4f45 100644 --- a/python/testData/formatter/noAlignForMethodArguments_after.py +++ b/python/testData/formatter/noAlignForMethodArguments_after.py @@ -1,4 +1,5 @@ def long_method_name(bar, baz): pass + long_method_name("long string one", "long string two") diff --git a/python/testData/formatter/spaceInMethodDeclaration_after.py b/python/testData/formatter/spaceInMethodDeclaration_after.py index 209b9ab1a77c..1e146669b452 100644 --- a/python/testData/formatter/spaceInMethodDeclaration_after.py +++ b/python/testData/formatter/spaceInMethodDeclaration_after.py @@ -1,4 +1,5 @@ def foo (bar, baz): pass + foo(True, False) \ No newline at end of file diff --git a/python/testData/inspections/AddFieldFromInstance_after.py b/python/testData/inspections/AddFieldFromInstance_after.py index 944ee222ff3c..686290338cf5 100644 --- a/python/testData/inspections/AddFieldFromInstance_after.py +++ b/python/testData/inspections/AddFieldFromInstance_after.py @@ -3,5 +3,6 @@ class A: self.x = 1 self.y = None + a = A() a.y+1 diff --git a/python/testData/inspections/AddFunctionToModule_after.py b/python/testData/inspections/AddFunctionToModule_after.py index 12079fd1b12b..26756340a128 100644 --- a/python/testData/inspections/AddFunctionToModule_after.py +++ b/python/testData/inspections/AddFunctionToModule_after.py @@ -4,5 +4,6 @@ import AddFunctionToModule # ourselves AddFunctionToModule.frob(1) + def frob(param): return None \ No newline at end of file diff --git a/python/testData/inspections/AddMethodFromInstance_after.py b/python/testData/inspections/AddMethodFromInstance_after.py index 03325ef41edc..0cff4c0f061c 100644 --- a/python/testData/inspections/AddMethodFromInstance_after.py +++ b/python/testData/inspections/AddMethodFromInstance_after.py @@ -5,5 +5,6 @@ class A: def y(self): pass + a = A() a.y() diff --git a/python/testData/intentions/afterConvertFormatOperatorToMethodMulti.py b/python/testData/intentions/afterConvertFormatOperatorToMethodMulti.py index 42d76c88443e..82541f3977b4 100644 --- a/python/testData/intentions/afterConvertFormatOperatorToMethodMulti.py +++ b/python/testData/intentions/afterConvertFormatOperatorToMethodMulti.py @@ -9,5 +9,5 @@ a = "{n:d} bottles of {what:>s} on the {where:>s}"\ "{new_n:#d} {{that is, {percent:+3.2f}% less}} "\ "bottles of {what:>6s} on the {where:>s}"\ .format(n=n, where="wall", howmuch=u'one', how="'round\t", new_n=(n - 1), percent=100 * (1 - ((n - 1.0) / n)), - what="beer") + what="beer") print a diff --git a/python/testData/intentions/afterConvertLambdaToFunction.py b/python/testData/intentions/afterConvertLambdaToFunction.py index 22f6ec568f7a..0cd0da9b151f 100644 --- a/python/testData/intentions/afterConvertLambdaToFunction.py +++ b/python/testData/intentions/afterConvertLambdaToFunction.py @@ -1,3 +1,2 @@ def newlist(x, y): return (x + y) / y - diff --git a/python/testData/intentions/afterUnicodeStringConcatToFormat.py b/python/testData/intentions/afterUnicodeStringConcatToFormat.py index 4e4897ebc584..c534e888a97c 100644 --- a/python/testData/intentions/afterUnicodeStringConcatToFormat.py +++ b/python/testData/intentions/afterUnicodeStringConcatToFormat.py @@ -1,4 +1,5 @@ def foo(): return "foo" + u'a%sf' % foo() \ No newline at end of file diff --git a/python/testData/refactoring/changeSignature/addDefaultParam.after.py b/python/testData/refactoring/changeSignature/addDefaultParam.after.py index 71f80c788649..8e376538fd36 100644 --- a/python/testData/refactoring/changeSignature/addDefaultParam.after.py +++ b/python/testData/refactoring/changeSignature/addDefaultParam.after.py @@ -1,4 +1,5 @@ def bar(a, b, c=3): pass + bar(1, 2) \ No newline at end of file diff --git a/python/testData/refactoring/changeSignature/addDefaultParam1.after.py b/python/testData/refactoring/changeSignature/addDefaultParam1.after.py index 140f92a8662b..60e751258f65 100644 --- a/python/testData/refactoring/changeSignature/addDefaultParam1.after.py +++ b/python/testData/refactoring/changeSignature/addDefaultParam1.after.py @@ -1,6 +1,7 @@ def foo(a, d=1, b=None): pass + foo("a", b="b") foo("a") foo("a", b="b") diff --git a/python/testData/refactoring/changeSignature/addPositionalParam.after.py b/python/testData/refactoring/changeSignature/addPositionalParam.after.py index a798e6ccc311..2ba62b0e6350 100644 --- a/python/testData/refactoring/changeSignature/addPositionalParam.after.py +++ b/python/testData/refactoring/changeSignature/addPositionalParam.after.py @@ -1,4 +1,5 @@ def bar(a, b, c): pass + bar(1, 2, 3) \ No newline at end of file diff --git a/python/testData/refactoring/changeSignature/changeFunctionName.after.py b/python/testData/refactoring/changeSignature/changeFunctionName.after.py index 6fc29c83f6e2..d7ea7da247b0 100644 --- a/python/testData/refactoring/changeSignature/changeFunctionName.after.py +++ b/python/testData/refactoring/changeSignature/changeFunctionName.after.py @@ -1,4 +1,5 @@ def bar(): pass + bar() \ No newline at end of file diff --git a/python/testData/refactoring/changeSignature/fixDocstringRemove.after.py b/python/testData/refactoring/changeSignature/fixDocstringRemove.after.py index 8bf215579b02..534e98e0b4f3 100644 --- a/python/testData/refactoring/changeSignature/fixDocstringRemove.after.py +++ b/python/testData/refactoring/changeSignature/fixDocstringRemove.after.py @@ -4,4 +4,5 @@ def foo(a): """ pass + foo("a") diff --git a/python/testData/refactoring/changeSignature/keywordOnlyParams.after.py b/python/testData/refactoring/changeSignature/keywordOnlyParams.after.py index dfbfd38edd14..ae97cb75aa61 100644 --- a/python/testData/refactoring/changeSignature/keywordOnlyParams.after.py +++ b/python/testData/refactoring/changeSignature/keywordOnlyParams.after.py @@ -1,4 +1,5 @@ def foo(param, *, a): pass + foo(1, a=2) diff --git a/python/testData/refactoring/changeSignature/keywordParam.after.py b/python/testData/refactoring/changeSignature/keywordParam.after.py index a3713cdc2a20..5bae9d9af57a 100644 --- a/python/testData/refactoring/changeSignature/keywordParam.after.py +++ b/python/testData/refactoring/changeSignature/keywordParam.after.py @@ -1,4 +1,5 @@ def func(a, b): pass + func(a=1, b=2) diff --git a/python/testData/refactoring/changeSignature/kwArgs.after.py b/python/testData/refactoring/changeSignature/kwArgs.after.py index 2ee1e7847502..1d28b6df8455 100644 --- a/python/testData/refactoring/changeSignature/kwArgs.after.py +++ b/python/testData/refactoring/changeSignature/kwArgs.after.py @@ -1,4 +1,5 @@ def func(param, **kwargs): pass + func(param=1, param2=1) \ No newline at end of file diff --git a/python/testData/refactoring/changeSignature/removeDefaultFromParam.after.py b/python/testData/refactoring/changeSignature/removeDefaultFromParam.after.py index 3488b975669e..f7389c2b6b45 100644 --- a/python/testData/refactoring/changeSignature/removeDefaultFromParam.after.py +++ b/python/testData/refactoring/changeSignature/removeDefaultFromParam.after.py @@ -1,6 +1,7 @@ def bar(a, b): pass + bar(1, 3) bar(1, b=3) bar(1, 2) \ No newline at end of file diff --git a/python/testData/refactoring/changeSignature/removeFirstPositionalParam.after.py b/python/testData/refactoring/changeSignature/removeFirstPositionalParam.after.py index 2aac48c4b5f9..e74be4d1e34e 100644 --- a/python/testData/refactoring/changeSignature/removeFirstPositionalParam.after.py +++ b/python/testData/refactoring/changeSignature/removeFirstPositionalParam.after.py @@ -1,4 +1,5 @@ def bar(b): pass + bar(2) \ No newline at end of file diff --git a/python/testData/refactoring/changeSignature/removePositionalParam.after.py b/python/testData/refactoring/changeSignature/removePositionalParam.after.py index fddb017f21de..2e35d0147bae 100644 --- a/python/testData/refactoring/changeSignature/removePositionalParam.after.py +++ b/python/testData/refactoring/changeSignature/removePositionalParam.after.py @@ -1,4 +1,5 @@ def bar(a): pass + bar(1) \ No newline at end of file diff --git a/python/testData/refactoring/changeSignature/switchPositionalParam.after.py b/python/testData/refactoring/changeSignature/switchPositionalParam.after.py index e087f98fb12f..6a33e11eb89c 100644 --- a/python/testData/refactoring/changeSignature/switchPositionalParam.after.py +++ b/python/testData/refactoring/changeSignature/switchPositionalParam.after.py @@ -1,4 +1,5 @@ def bar(b, a): pass + bar(2, 1) \ No newline at end of file diff --git a/python/testData/refactoring/changeSignature/updateDocstring.after.py b/python/testData/refactoring/changeSignature/updateDocstring.after.py index b2c788597501..33f518f444fc 100644 --- a/python/testData/refactoring/changeSignature/updateDocstring.after.py +++ b/python/testData/refactoring/changeSignature/updateDocstring.after.py @@ -5,4 +5,5 @@ def foo(a, d1=1): """ pass + foo("a", d1="b") diff --git a/python/testData/refactoring/extractmethod/BinaryExpression.after.py b/python/testData/refactoring/extractmethod/BinaryExpression.after.py index 97e855544d46..f5fce2d032a0 100644 --- a/python/testData/refactoring/extractmethod/BinaryExpression.after.py +++ b/python/testData/refactoring/extractmethod/BinaryExpression.after.py @@ -1,4 +1,5 @@ def foo(): return bbb + aaa = foo() && ccc \ No newline at end of file diff --git a/python/testData/refactoring/extractmethod/GlobalToplevelAssignment.after.py b/python/testData/refactoring/extractmethod/GlobalToplevelAssignment.after.py index 55294f3fcf84..9a9bf021ec87 100644 --- a/python/testData/refactoring/extractmethod/GlobalToplevelAssignment.after.py +++ b/python/testData/refactoring/extractmethod/GlobalToplevelAssignment.after.py @@ -1,10 +1,12 @@ a = 2 b = 3 + def bar(): global a, c a = a + b c = a * 2 + bar() print(c) \ No newline at end of file diff --git a/python/testData/refactoring/extractmethod/GlobalVarAssignment.after.py b/python/testData/refactoring/extractmethod/GlobalVarAssignment.after.py index 46baf4631166..0ca17889e414 100644 --- a/python/testData/refactoring/extractmethod/GlobalVarAssignment.after.py +++ b/python/testData/refactoring/extractmethod/GlobalVarAssignment.after.py @@ -1,5 +1,6 @@ x = 0 + def bar(): global x x = 1 diff --git a/python/testData/refactoring/extractmethod/StatementReturn.after.py b/python/testData/refactoring/extractmethod/StatementReturn.after.py index 61694ca944de..15b0536202eb 100644 --- a/python/testData/refactoring/extractmethod/StatementReturn.after.py +++ b/python/testData/refactoring/extractmethod/StatementReturn.after.py @@ -4,6 +4,7 @@ def foo(): else: return 1 + return foo() diff --git a/python/testData/refactoring/extractsuperclass/multifile/target.append.py b/python/testData/refactoring/extractsuperclass/multifile/target.append.py index 42cefbc92f40..81722c98acac 100644 --- a/python/testData/refactoring/extractsuperclass/multifile/target.append.py +++ b/python/testData/refactoring/extractsuperclass/multifile/target.append.py @@ -1,6 +1,7 @@ # existing module A = 1 + class Suppa: def foo(self): print "bar" diff --git a/python/testData/refactoring/extractsuperclass/withImport.after.py b/python/testData/refactoring/extractsuperclass/withImport.after.py index f1244a5643f5..ccd508bbebd7 100644 --- a/python/testData/refactoring/extractsuperclass/withImport.after.py +++ b/python/testData/refactoring/extractsuperclass/withImport.after.py @@ -1,5 +1,6 @@ import os from refactoring.extractsuperclass import Suppa + class A(Suppa): pass diff --git a/python/testData/refactoring/introduceConstant/insertAfterDocstring.after.py b/python/testData/refactoring/introduceConstant/insertAfterDocstring.after.py index 145fb3e8667c..0b5c393c4b45 100644 --- a/python/testData/refactoring/introduceConstant/insertAfterDocstring.after.py +++ b/python/testData/refactoring/introduceConstant/insertAfterDocstring.after.py @@ -3,6 +3,7 @@ Module docstring. """ a = 'Hello, World!' + def f(): """Function docstring.""" print(a) \ No newline at end of file diff --git a/python/testData/refactoring/introduceConstant/insertAfterImport.after.py b/python/testData/refactoring/introduceConstant/insertAfterImport.after.py index ac5f934398b2..a2a3c8010285 100644 --- a/python/testData/refactoring/introduceConstant/insertAfterImport.after.py +++ b/python/testData/refactoring/introduceConstant/insertAfterImport.after.py @@ -3,5 +3,6 @@ import urllib2 a = 42 + def foo(): return a \ No newline at end of file diff --git a/python/testData/refactoring/introduceConstant/py4414.after.py b/python/testData/refactoring/introduceConstant/py4414.after.py index af3c27809ef4..b21bf9340461 100644 --- a/python/testData/refactoring/introduceConstant/py4414.after.py +++ b/python/testData/refactoring/introduceConstant/py4414.after.py @@ -1,4 +1,5 @@ a = 1 + def m(): a \ No newline at end of file diff --git a/python/testData/refactoring/move/baseClass/after/src/a.py b/python/testData/refactoring/move/baseClass/after/src/a.py index 60b7210c351e..e7d7109bfac8 100644 --- a/python/testData/refactoring/move/baseClass/after/src/a.py +++ b/python/testData/refactoring/move/baseClass/after/src/a.py @@ -1,5 +1,6 @@ from b import B + class C(B): def __init__(self): super(C, self).__init__() \ No newline at end of file diff --git a/python/testData/refactoring/move/class/after/src/b.py b/python/testData/refactoring/move/class/after/src/b.py index e95a5a5602e1..bc3da06947dc 100644 --- a/python/testData/refactoring/move/class/after/src/b.py +++ b/python/testData/refactoring/move/class/after/src/b.py @@ -1,6 +1,7 @@ import lib1 from lib1 import URLOpener + def f(x): return x diff --git a/python/testData/refactoring/move/function/after/src/b.py b/python/testData/refactoring/move/function/after/src/b.py index b1db798cbf36..f8b33d202ffb 100644 --- a/python/testData/refactoring/move/function/after/src/b.py +++ b/python/testData/refactoring/move/function/after/src/b.py @@ -1,5 +1,6 @@ from lib1 import urlopen + def g(): return None diff --git a/python/testData/refactoring/move/functionToUsage/after/src/b.py b/python/testData/refactoring/move/functionToUsage/after/src/b.py index 12de1a4525b4..bb51445d4608 100644 --- a/python/testData/refactoring/move/functionToUsage/after/src/b.py +++ b/python/testData/refactoring/move/functionToUsage/after/src/b.py @@ -1,7 +1,9 @@ import lib1 import lib2 + def f(): pass + f() \ No newline at end of file diff --git a/python/testData/refactoring/move/importAs/after/src/b.py b/python/testData/refactoring/move/importAs/after/src/b.py index 46fa1decc686..6aecb23c654c 100644 --- a/python/testData/refactoring/move/importAs/after/src/b.py +++ b/python/testData/refactoring/move/importAs/after/src/b.py @@ -1,4 +1,5 @@ import lib1 as iks + def f(x): return iks.I(x) \ No newline at end of file diff --git a/python/testData/refactoring/move/importAs/after/src/c.py b/python/testData/refactoring/move/importAs/after/src/c.py index aa04d211f3bd..15cf1381339c 100644 --- a/python/testData/refactoring/move/importAs/after/src/c.py +++ b/python/testData/refactoring/move/importAs/after/src/c.py @@ -1,4 +1,5 @@ from b import f as g + def main(): print(g(42)) \ No newline at end of file diff --git a/python/testData/refactoring/move/importFirstWithSlash/after/src/file2.py b/python/testData/refactoring/move/importFirstWithSlash/after/src/file2.py index a085a0253cb8..3bf746c0d967 100644 --- a/python/testData/refactoring/move/importFirstWithSlash/after/src/file2.py +++ b/python/testData/refactoring/move/importFirstWithSlash/after/src/file2.py @@ -1,4 +1,5 @@ __author__ = 'catherine' + def function_1(): pass \ No newline at end of file diff --git a/python/testData/refactoring/move/importSlash/after/src/file2.py b/python/testData/refactoring/move/importSlash/after/src/file2.py index 9c71db79c6fa..4997a87c9bce 100644 --- a/python/testData/refactoring/move/importSlash/after/src/file2.py +++ b/python/testData/refactoring/move/importSlash/after/src/file2.py @@ -1,4 +1,5 @@ __author__ = 'catherine' + def function_2(): pass \ No newline at end of file diff --git a/python/testData/refactoring/move/innerImports/after/src/b.py b/python/testData/refactoring/move/innerImports/after/src/b.py index 77eae2bf4490..0ee989fc538c 100644 --- a/python/testData/refactoring/move/innerImports/after/src/b.py +++ b/python/testData/refactoring/move/innerImports/after/src/b.py @@ -1,5 +1,6 @@ from lib1 import S, K + def f(x): from lib1 import I return S(K(I))(I)(42) \ No newline at end of file diff --git a/python/testData/refactoring/move/newModule/after/src/b.py b/python/testData/refactoring/move/newModule/after/src/b.py index 000c124d957c..aaf94453e78c 100644 --- a/python/testData/refactoring/move/newModule/after/src/b.py +++ b/python/testData/refactoring/move/newModule/after/src/b.py @@ -1,5 +1,6 @@ __author__ = 'user1' + def f(url): '''Return the representation available at the URL. diff --git a/python/testData/refactoring/move/packageImport/after/src/b.py b/python/testData/refactoring/move/packageImport/after/src/b.py index 5fe9d3b2fe7f..546605e327ff 100644 --- a/python/testData/refactoring/move/packageImport/after/src/b.py +++ b/python/testData/refactoring/move/packageImport/after/src/b.py @@ -1,4 +1,5 @@ import lib1.mod1 + def f(x): return lib1.mod1.k(x)(42) \ No newline at end of file diff --git a/python/testData/refactoring/move/packageImport/after/src/c.py b/python/testData/refactoring/move/packageImport/after/src/c.py index 6d9db1a306a4..92b796ea9b34 100644 --- a/python/testData/refactoring/move/packageImport/after/src/c.py +++ b/python/testData/refactoring/move/packageImport/after/src/c.py @@ -1,4 +1,5 @@ from b import f + def main(): print(f(-1)) diff --git a/python/testData/refactoring/move/qualifiedImport/after/src/c.py b/python/testData/refactoring/move/qualifiedImport/after/src/c.py index 77ebc63c3f34..ef848174169e 100644 --- a/python/testData/refactoring/move/qualifiedImport/after/src/c.py +++ b/python/testData/refactoring/move/qualifiedImport/after/src/c.py @@ -1,5 +1,6 @@ import a from b import f + def main(): print(f(42)) diff --git a/python/testData/refactoring/move/starImportUsage/after/src/c.py b/python/testData/refactoring/move/starImportUsage/after/src/c.py index dc252b088e48..b60e8927c749 100644 --- a/python/testData/refactoring/move/starImportUsage/after/src/c.py +++ b/python/testData/refactoring/move/starImportUsage/after/src/c.py @@ -1,4 +1,5 @@ from b import f + def g(): return f() \ No newline at end of file diff --git a/python/testData/refactoring/move/subModuleUsage/after/src/b.py b/python/testData/refactoring/move/subModuleUsage/after/src/b.py index c4ec704103dc..063d04ae52af 100644 --- a/python/testData/refactoring/move/subModuleUsage/after/src/b.py +++ b/python/testData/refactoring/move/subModuleUsage/after/src/b.py @@ -1,4 +1,5 @@ from p1 import m1 + def f(): m1.g() \ No newline at end of file diff --git a/python/testData/refactoring/move/usageFromFunction/after/src/b.py b/python/testData/refactoring/move/usageFromFunction/after/src/b.py index a257b2fe1e82..fdaef86db7fd 100644 --- a/python/testData/refactoring/move/usageFromFunction/after/src/b.py +++ b/python/testData/refactoring/move/usageFromFunction/after/src/b.py @@ -1,4 +1,5 @@ from a import f + def use_f(): f() \ 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 180aa90a5fca..ede674abeee4 100644 --- a/python/testSrc/com/jetbrains/python/PyFormatterTest.java +++ b/python/testSrc/com/jetbrains/python/PyFormatterTest.java @@ -130,11 +130,11 @@ public class PyFormatterTest extends PyTestCase { } public void testNoAlignForMethodArguments() { // PY-3995 + settings().getCommonSettings(PythonLanguage.getInstance()).ALIGN_MULTILINE_PARAMETERS_IN_CALLS = false; doTest(); } public void testAlignForMethodArguments() { // PY-3995 - settings().ALIGN_MULTILINE_PARAMETERS_IN_CALLS = true; doTest(); } @@ -205,6 +205,10 @@ public class PyFormatterTest extends PyTestCase { doTest(); } + public void testBeforeTopLevelClass() { // PY-7743 + doTest(); + } + public void testPsiFormatting() { // IDEA-69724 String initial = "def method_name(\n" + diff --git a/python/testSrc/com/jetbrains/python/PyIndentTest.java b/python/testSrc/com/jetbrains/python/PyIndentTest.java index 6e5ef280655d..ad8c925953fa 100644 --- a/python/testSrc/com/jetbrains/python/PyIndentTest.java +++ b/python/testSrc/com/jetbrains/python/PyIndentTest.java @@ -200,7 +200,7 @@ public class PyIndentTest extends PyTestCase { "class C:\n" + " def new_method(self):\n" + " variable = self._stats.get('outer_key', 'inner_key',\n" + - " "); + " "); } public void testEnterInSet() { // PY-1947 diff --git a/python/testSrc/com/jetbrains/python/PythonAllTestsSuite.java b/python/testSrc/com/jetbrains/python/PythonAllTestsSuite.java index 802685465a28..e2c991b5057d 100644 --- a/python/testSrc/com/jetbrains/python/PythonAllTestsSuite.java +++ b/python/testSrc/com/jetbrains/python/PythonAllTestsSuite.java @@ -9,6 +9,7 @@ import com.jetbrains.jinja2.Jinja2ParserTest; import com.jetbrains.python.codeInsight.PyCompletionPatternsTest; import com.jetbrains.python.inspections.*; import com.jetbrains.python.refactoring.*; +import com.jetbrains.python.refactoring.changeSignature.PyChangeSignatureTest; import com.jetbrains.python.refactoring.classes.PyExtractSuperclassTest; import com.jetbrains.python.refactoring.classes.PyPullUpTest; import com.jetbrains.python.refactoring.classes.PyPushDownTest; @@ -101,7 +102,8 @@ public class PythonAllTestsSuite { Jinja2ParserTest.class, DjangoTemplateParserTest.class, PyJoinLinesTest.class, - PyStatementListTest.class + PyStatementListTest.class, + PyChangeSignatureTest.class }; public static TestSuite suite() { From c7eeb6d5ee1d397b9a483015b336c0d25fe1390b Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 13 Dec 2012 20:14:36 +0100 Subject: [PATCH 4/4] highlight assignments as 'with' statement target as error (PY-7529) --- .../src/com/jetbrains/python/psi/PyElementVisitor.java | 4 ++++ .../com/jetbrains/python/psi/impl/PyWithItemImpl.java | 6 ++++++ .../python/validation/AssignTargetAnnotator.java | 10 +++++++++- python/testData/highlighting/assignmentTargetWith.py | 2 ++ .../com/jetbrains/python/PythonHighlightingTest.java | 5 +++++ 5 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 python/testData/highlighting/assignmentTargetWith.py diff --git a/python/psi-api/src/com/jetbrains/python/psi/PyElementVisitor.java b/python/psi-api/src/com/jetbrains/python/psi/PyElementVisitor.java index 18444383b3f8..0dd970faf51e 100644 --- a/python/psi-api/src/com/jetbrains/python/psi/PyElementVisitor.java +++ b/python/psi-api/src/com/jetbrains/python/psi/PyElementVisitor.java @@ -257,4 +257,8 @@ public class PyElementVisitor extends PsiElementVisitor { public void visitPyKeywordArgument(PyKeywordArgument node) { visitPyElement(node); } + + public void visitPyWithItem(PyWithItem node) { + visitPyElement(node); + } } diff --git a/python/src/com/jetbrains/python/psi/impl/PyWithItemImpl.java b/python/src/com/jetbrains/python/psi/impl/PyWithItemImpl.java index 6347eae5f95f..2db3c0ad9755 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyWithItemImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyWithItemImpl.java @@ -3,6 +3,7 @@ package com.jetbrains.python.psi.impl; import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; import com.jetbrains.python.PyTokenTypes; +import com.jetbrains.python.psi.PyElementVisitor; import com.jetbrains.python.psi.PyExpression; import com.jetbrains.python.psi.PyWithItem; @@ -14,6 +15,11 @@ public class PyWithItemImpl extends PyElementImpl implements PyWithItem { super(astNode); } + @Override + protected void acceptPyVisitor(PyElementVisitor pyVisitor) { + pyVisitor.visitPyWithItem(this); + } + @Override public PyExpression getExpression() { ASTNode[] children = getNode().getChildren(null); diff --git a/python/src/com/jetbrains/python/validation/AssignTargetAnnotator.java b/python/src/com/jetbrains/python/validation/AssignTargetAnnotator.java index e3c7203ba1e2..b47220fed5e5 100644 --- a/python/src/com/jetbrains/python/validation/AssignTargetAnnotator.java +++ b/python/src/com/jetbrains/python/validation/AssignTargetAnnotator.java @@ -12,7 +12,7 @@ import static com.jetbrains.python.PyBundle.message; */ public class AssignTargetAnnotator extends PyAnnotator { private enum Operation { - Assign, AugAssign, Delete, Except, For + Assign, AugAssign, Delete, Except, For, With } @Override @@ -51,6 +51,14 @@ public class AssignTargetAnnotator extends PyAnnotator { } } + @Override + public void visitPyWithItem(PyWithItem node) { + PyExpression target = node.getTarget(); + if (target != null) { + target.accept(new ExprVisitor(Operation.With)); + } + } + private class ExprVisitor extends PyElementVisitor { private final Operation myOp; private final String DELETING_NONE = message("ANN.deleting.none"); diff --git a/python/testData/highlighting/assignmentTargetWith.py b/python/testData/highlighting/assignmentTargetWith.py new file mode 100644 index 000000000000..f516b41c6b1a --- /dev/null +++ b/python/testData/highlighting/assignmentTargetWith.py @@ -0,0 +1,2 @@ +with open("") as my_<: + pass \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PythonHighlightingTest.java b/python/testSrc/com/jetbrains/python/PythonHighlightingTest.java index de14792f8a33..2797bf34e2ac 100644 --- a/python/testSrc/com/jetbrains/python/PythonHighlightingTest.java +++ b/python/testSrc/com/jetbrains/python/PythonHighlightingTest.java @@ -65,6 +65,11 @@ public class PythonHighlightingTest extends PyTestCase { doTest(true, false); } + public void testAssignmentTargetWith() { // PY-7529 + setLanguageLevel(LanguageLevel.PYTHON27); + doTest(true, false); + } + public void testAssignmentTargets3K() { doTest(LanguageLevel.PYTHON30, true, false); }