diff --git a/python/src/META-INF/python-plugin-common.xml b/python/src/META-INF/python-plugin-common.xml index 0804d1cab196..6417e740ad8e 100644 --- a/python/src/META-INF/python-plugin-common.xml +++ b/python/src/META-INF/python-plugin-common.xml @@ -510,9 +510,9 @@ - - - + + + + @@ -533,6 +535,14 @@ + + + + + + diff --git a/python/src/com/jetbrains/python/PyBundle.properties b/python/src/com/jetbrains/python/PyBundle.properties index f27805a79c8f..3ef2e3522c15 100644 --- a/python/src/com/jetbrains/python/PyBundle.properties +++ b/python/src/com/jetbrains/python/PyBundle.properties @@ -56,6 +56,7 @@ QFIX.augment.assignment=Assignment can be replaced with augmented assignment QFIX.chained.comparison=Simplify chained comparison QFIX.statement.effect=Statement can be replaced with function call +QFIX.statement.effect.move.docstring=Move docstring to the proper place QFIX.statement.effect.introduce.variable=Introduce variable diff --git a/python/src/com/jetbrains/python/actions/StatementEffectDocstringQuickFix.java b/python/src/com/jetbrains/python/actions/StatementEffectDocstringQuickFix.java new file mode 100644 index 000000000000..962351c943ad --- /dev/null +++ b/python/src/com/jetbrains/python/actions/StatementEffectDocstringQuickFix.java @@ -0,0 +1,53 @@ +package com.jetbrains.python.actions; + +import com.intellij.codeInspection.LocalQuickFix; +import com.intellij.codeInspection.ProblemDescriptor; +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiElement; +import com.intellij.psi.util.PsiTreeUtil; +import com.jetbrains.python.PyBundle; +import com.jetbrains.python.psi.*; +import org.jetbrains.annotations.NotNull; + +/** + * User: catherine + * + * QuickFix to move misplaced docstring + */ +public class StatementEffectDocstringQuickFix implements LocalQuickFix { + + public StatementEffectDocstringQuickFix() { + } + + @NotNull + public String getName() { + return PyBundle.message("QFIX.statement.effect.move.docstring"); + } + + @NotNull + public String getFamilyName() { + return PyBundle.message("INSP.GROUP.python"); + } + + public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { + PsiElement expression = descriptor.getPsiElement(); + if (expression instanceof PyStringLiteralExpression) { + PyStatement st = PsiTreeUtil.getParentOfType(expression, PyStatement.class); + if (st != null) { + PyDocStringOwner parent = PsiTreeUtil.getParentOfType(expression, PyDocStringOwner.class); + + if (parent instanceof PyClass || parent instanceof PyFunction) { + PyStatementList statementList = PsiTreeUtil.findChildOfType(parent, PyStatementList.class); + if (statementList != null) { + PyStatement[] statements = statementList.getStatements(); + if (statements.length > 0) { + statementList.addBefore(st, statements[0]); + st.delete(); + } + } + } + } + } + } + +} diff --git a/python/src/com/jetbrains/python/buildout/config/BuildoutCfgHighlighterFactory.java b/python/src/com/jetbrains/python/buildout/config/BuildoutCfgHighlighterFactory.java index b562d6b610b2..bdff316a9ad4 100644 --- a/python/src/com/jetbrains/python/buildout/config/BuildoutCfgHighlighterFactory.java +++ b/python/src/com/jetbrains/python/buildout/config/BuildoutCfgHighlighterFactory.java @@ -4,7 +4,6 @@ import com.intellij.openapi.fileTypes.SyntaxHighlighter; import com.intellij.openapi.fileTypes.SyntaxHighlighterFactory; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; -import com.jetbrains.django.lang.template.highlighting.DjangoTemplateFileHighlighter; import org.jetbrains.annotations.NotNull; /** diff --git a/python/src/com/jetbrains/python/codeInsight/completion/PyClassInsertHandler.java b/python/src/com/jetbrains/python/codeInsight/completion/PyClassInsertHandler.java index 9773766953e6..c6d28d8e8f5c 100644 --- a/python/src/com/jetbrains/python/codeInsight/completion/PyClassInsertHandler.java +++ b/python/src/com/jetbrains/python/codeInsight/completion/PyClassInsertHandler.java @@ -1,10 +1,8 @@ package com.jetbrains.python.codeInsight.completion; import com.intellij.codeInsight.AutoPopupController; -import com.intellij.codeInsight.TailType; import com.intellij.codeInsight.completion.InsertHandler; import com.intellij.codeInsight.completion.InsertionContext; -import com.intellij.codeInsight.lookup.Lookup; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; @@ -38,8 +36,5 @@ public class PyClassInsertHandler implements InsertHandler { editor.getCaretModel().moveToOffset(offset+2); } } - else if (context.getCompletionChar() == Lookup.COMPLETE_STATEMENT_SELECT_CHAR) { - TailType.SMART_COMPLETION.processTail(editor, context.getTailOffset()); - } } } diff --git a/python/src/com/jetbrains/python/inspections/PyDefaultArgumentInspection.java b/python/src/com/jetbrains/python/inspections/PyDefaultArgumentInspection.java index 4cd4d716ba42..84a6a71babf9 100644 --- a/python/src/com/jetbrains/python/inspections/PyDefaultArgumentInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyDefaultArgumentInspection.java @@ -4,10 +4,7 @@ import com.intellij.codeInspection.ProblemsHolder; import com.intellij.psi.PsiElementVisitor; import com.jetbrains.python.PyBundle; import com.jetbrains.python.actions.PyDefaultArgumentQuickFix; -import com.jetbrains.python.psi.PyDictLiteralExpression; -import com.jetbrains.python.psi.PyExpression; -import com.jetbrains.python.psi.PyListLiteralExpression; -import com.jetbrains.python.psi.PyNamedParameter; +import com.jetbrains.python.psi.*; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; @@ -41,6 +38,11 @@ public class PyDefaultArgumentInspection extends PyInspection { if (defaultValue instanceof PyListLiteralExpression || defaultValue instanceof PyDictLiteralExpression) { registerProblem(defaultValue, "Default argument value is mutable", new PyDefaultArgumentQuickFix()); } + if (defaultValue instanceof PyCallExpression) { + PyExpression callee = ((PyCallExpression)defaultValue).getCallee(); + if (callee != null && "dict".equals(callee.getText())) + registerProblem(defaultValue, "Default argument value is mutable", new PyDefaultArgumentQuickFix()); + } } } } diff --git a/python/src/com/jetbrains/python/inspections/PyStatementEffectInspection.java b/python/src/com/jetbrains/python/inspections/PyStatementEffectInspection.java index f9332e3fbdb3..e85560cb8256 100644 --- a/python/src/com/jetbrains/python/inspections/PyStatementEffectInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyStatementEffectInspection.java @@ -6,6 +6,7 @@ import com.intellij.psi.PsiElementVisitor; import com.intellij.psi.ResolveResult; import com.intellij.psi.util.PsiTreeUtil; import com.jetbrains.python.PyBundle; +import com.jetbrains.python.actions.StatementEffectDocstringQuickFix; import com.jetbrains.python.actions.StatementEffectFunctionCallQuickFix; import com.jetbrains.python.actions.StatementEffectIntroduceVariableQuickFix; import com.jetbrains.python.console.PydevConsoleRunner; @@ -64,10 +65,24 @@ public class PyStatementEffectInspection extends PyInspection { return; } } + if (checkStringLiteral(expression)) + return; registerProblem(expression, "Statement seems to have no effect", new StatementEffectIntroduceVariableQuickFix(expression)); } + private boolean checkStringLiteral(PyExpression expression) { + if (expression instanceof PyStringLiteralExpression) { + PyDocStringOwner parent = PsiTreeUtil.getParentOfType(expression, PyFunction.class, PyClass.class); + if (parent != null && parent.getDocStringExpression() == null) { + registerProblem(expression, "Docstring seems to be misplaced", + new StatementEffectDocstringQuickFix()); + return true; + } + } + return false; + } + private boolean hasEffect(@Nullable PyExpression expression) { if (expression == null) { return false; diff --git a/python/src/com/jetbrains/python/lexer/Python.flex b/python/src/com/jetbrains/python/lexer/Python.flex index ffb2894332ac..ae1cddcbbefc 100644 --- a/python/src/com/jetbrains/python/lexer/Python.flex +++ b/python/src/com/jetbrains/python/lexer/Python.flex @@ -171,7 +171,8 @@ return yylength()-i-1; "}" { return PyTokenTypes.RBRACE; } "@" { return PyTokenTypes.AT; } "," { return PyTokenTypes.COMMA; } -":" { yybegin(PENDING_DOCSTRING); return PyTokenTypes.COLON; } +":" { return PyTokenTypes.COLON; } +":"(\ )*"\n" { yypushback(yylength()-1); yybegin(PENDING_DOCSTRING); return PyTokenTypes.COLON; } "." { return PyTokenTypes.DOT; } "`" { return PyTokenTypes.TICK; } "=" { return PyTokenTypes.EQ; } diff --git a/python/src/com/jetbrains/python/lexer/_PythonLexer.java b/python/src/com/jetbrains/python/lexer/_PythonLexer.java index 4d264e1b841c..c74dffbfb43b 100644 --- a/python/src/com/jetbrains/python/lexer/_PythonLexer.java +++ b/python/src/com/jetbrains/python/lexer/_PythonLexer.java @@ -1,4 +1,4 @@ -/* The following code was generated by JFlex 1.4.3 on 7/14/11 7:46 PM */ +/* The following code was generated by JFlex 1.4.3 on 9/15/11 2:15 PM */ /* It's an automatically generated code. Do not modify it. */ package com.jetbrains.python.lexer; @@ -12,7 +12,7 @@ import com.intellij.openapi.util.text.StringUtil; /** * This class is a scanner generated by * JFlex 1.4.3 - * on 7/14/11 7:46 PM from the specification file + * on 9/15/11 2:15 PM from the specification file * ./Python.flex */ class _PythonLexer implements FlexLexer { @@ -226,19 +226,19 @@ class _PythonLexer implements FlexLexer { "\1\13\1\47\1\0\1\50\3\14\1\51\4\14\1\52"+ "\2\14\6\17\7\14\1\53\1\54\1\55\5\14\1\56"+ "\1\57\1\60\1\61\1\62\1\63\1\64\1\65\1\66"+ - "\1\67\1\70\1\71\1\72\1\73\1\74\1\75\1\11"+ - "\1\76\1\77\1\0\1\76\3\13\1\47\1\0\1\100"+ - "\11\14\1\17\2\101\1\102\1\14\1\103\1\104\1\105"+ - "\1\106\7\14\1\107\1\110\1\111\1\112\1\0\2\77"+ - "\1\0\1\113\4\14\1\114\1\115\2\14\4\0\4\14"+ - "\1\116\3\14\1\0\2\76\1\0\1\14\1\117\3\14"+ - "\1\120\1\0\2\101\1\0\2\14\1\121\1\14\1\122"+ - "\1\14\1\123\3\76\1\14\1\124\1\125\1\126\3\101"+ - "\1\127\1\14\1\130\1\131\2\0\1\132\2\0\1\14"+ - "\2\76\2\101\1\133"; + "\1\67\1\70\1\71\1\72\1\73\1\74\1\75\1\76"+ + "\1\0\1\11\1\77\1\100\1\0\1\77\3\13\1\47"+ + "\1\0\1\101\11\14\1\17\2\102\1\103\1\14\1\104"+ + "\1\105\1\106\1\107\7\14\1\110\1\111\1\112\1\113"+ + "\1\0\2\100\1\0\1\114\4\14\1\115\1\116\2\14"+ + "\4\0\4\14\1\117\3\14\1\0\2\77\1\0\1\14"+ + "\1\120\3\14\1\121\1\0\2\102\1\0\2\14\1\122"+ + "\1\14\1\123\1\14\1\124\3\77\1\14\1\125\1\126"+ + "\1\127\3\102\1\130\1\14\1\131\1\132\2\0\1\133"+ + "\2\0\1\14\2\77\2\102\1\134"; private static int [] zzUnpackAction() { - int [] result = new int[240]; + int [] result = new int[242]; int offset = 0; offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); return result; @@ -270,32 +270,33 @@ class _PythonLexer implements FlexLexer { "\0\u0708\0\u0750\0\u0798\0\u07e0\0\u0828\0\u0870\0\u08b8\0\u0900"+ "\0\u0948\0\u0990\0\u09d8\0\u0a20\0\u0a68\0\u0ab0\0\u0af8\0\u0b40"+ "\0\u0b88\0\u0bd0\0\u0c18\0\u0c60\0\330\0\330\0\330\0\330"+ - "\0\330\0\330\0\330\0\330\0\330\0\330\0\330\0\330"+ - "\0\u01b0\0\u0ca8\0\u0cf0\0\u0d38\0\330\0\u0d80\0\u0dc8\0\u0e10"+ - "\0\u0e58\0\u0ea0\0\u0ee8\0\u0f30\0\u0f78\0\330\0\u0fc0\0\u1008"+ - "\0\330\0\u1050\0\u1098\0\u10e0\0\u0360\0\u1128\0\u1170\0\u11b8"+ - "\0\u1200\0\330\0\u1248\0\u1290\0\u12d8\0\u1320\0\u1368\0\u13b0"+ - "\0\u13f8\0\u1440\0\u1488\0\u14d0\0\u1518\0\u1560\0\u15a8\0\u15f0"+ - "\0\u1638\0\u0360\0\u0360\0\u0360\0\u1680\0\u16c8\0\u1710\0\u1758"+ - "\0\u17a0\0\330\0\330\0\330\0\u17e8\0\330\0\u1830\0\330"+ - "\0\330\0\330\0\330\0\330\0\u1878\0\330\0\330\0\u18c0"+ - "\0\330\0\u1908\0\u1950\0\330\0\u1908\0\u1998\0\u19e0\0\u1a28"+ - "\0\u1a70\0\u1ab8\0\u1b00\0\u0360\0\u1b48\0\u1b90\0\u1bd8\0\u1c20"+ - "\0\u1c68\0\u1cb0\0\u1cf8\0\u1d40\0\u1d88\0\330\0\u1dd0\0\u1e18"+ - "\0\u0360\0\u1e60\0\u0360\0\u0360\0\u0360\0\u0360\0\u1ea8\0\u1ef0"+ - "\0\u1f38\0\u1f80\0\u1fc8\0\u2010\0\u2058\0\330\0\330\0\330"+ - "\0\330\0\u20a0\0\u20e8\0\u2130\0\u2178\0\u0360\0\u21c0\0\u2208"+ - "\0\u2250\0\u2298\0\u0360\0\u0360\0\u22e0\0\u2328\0\u2370\0\u23b8"+ - "\0\u2400\0\u2448\0\u2490\0\u24d8\0\u2520\0\u2568\0\u0360\0\u25b0"+ - "\0\u25f8\0\u2640\0\u2688\0\u26d0\0\u2718\0\u2760\0\u27a8\0\u0360"+ - "\0\u27f0\0\u2838\0\u2880\0\u0360\0\u28c8\0\u2910\0\u2958\0\u29a0"+ - "\0\u29e8\0\u2a30\0\u0360\0\u2a78\0\u0360\0\u2ac0\0\u0360\0\u1908"+ - "\0\u2b08\0\u2b50\0\u2b98\0\u0360\0\u0360\0\u0360\0\330\0\u2be0"+ - "\0\u2c28\0\u0360\0\u2c70\0\u0360\0\u0360\0\u2cb8\0\u2d00\0\u0360"+ - "\0\u2d48\0\u2d90\0\u2dd8\0\u2688\0\u2760\0\u28c8\0\u29a0\0\u0360"; + "\0\330\0\330\0\330\0\330\0\330\0\u0ca8\0\330\0\330"+ + "\0\u01b0\0\u0cf0\0\u0d38\0\u0d80\0\330\0\u0dc8\0\u0e10\0\u0e58"+ + "\0\u0ea0\0\u0ee8\0\u0f30\0\u0f78\0\u0fc0\0\330\0\u1008\0\u1050"+ + "\0\330\0\u1098\0\u10e0\0\u1128\0\u0360\0\u1170\0\u11b8\0\u1200"+ + "\0\u1248\0\330\0\u1290\0\u12d8\0\u1320\0\u1368\0\u13b0\0\u13f8"+ + "\0\u1440\0\u1488\0\u14d0\0\u1518\0\u1560\0\u15a8\0\u15f0\0\u1638"+ + "\0\u1680\0\u0360\0\u0360\0\u0360\0\u16c8\0\u1710\0\u1758\0\u17a0"+ + "\0\u17e8\0\330\0\330\0\330\0\u1830\0\330\0\u1878\0\330"+ + "\0\330\0\330\0\330\0\330\0\u18c0\0\330\0\330\0\u1908"+ + "\0\330\0\330\0\u0ca8\0\u1950\0\u1998\0\330\0\u1950\0\u19e0"+ + "\0\u1a28\0\u1a70\0\u1ab8\0\u1b00\0\u1b48\0\u0360\0\u1b90\0\u1bd8"+ + "\0\u1c20\0\u1c68\0\u1cb0\0\u1cf8\0\u1d40\0\u1d88\0\u1dd0\0\330"+ + "\0\u1e18\0\u1e60\0\u0360\0\u1ea8\0\u0360\0\u0360\0\u0360\0\u0360"+ + "\0\u1ef0\0\u1f38\0\u1f80\0\u1fc8\0\u2010\0\u2058\0\u20a0\0\330"+ + "\0\330\0\330\0\330\0\u20e8\0\u2130\0\u2178\0\u21c0\0\u0360"+ + "\0\u2208\0\u2250\0\u2298\0\u22e0\0\u0360\0\u0360\0\u2328\0\u2370"+ + "\0\u23b8\0\u2400\0\u2448\0\u2490\0\u24d8\0\u2520\0\u2568\0\u25b0"+ + "\0\u0360\0\u25f8\0\u2640\0\u2688\0\u26d0\0\u2718\0\u2760\0\u27a8"+ + "\0\u27f0\0\u0360\0\u2838\0\u2880\0\u28c8\0\u0360\0\u2910\0\u2958"+ + "\0\u29a0\0\u29e8\0\u2a30\0\u2a78\0\u0360\0\u2ac0\0\u0360\0\u2b08"+ + "\0\u0360\0\u1950\0\u2b50\0\u2b98\0\u2be0\0\u0360\0\u0360\0\u0360"+ + "\0\330\0\u2c28\0\u2c70\0\u0360\0\u2cb8\0\u0360\0\u0360\0\u2d00"+ + "\0\u2d48\0\u0360\0\u2d90\0\u2dd8\0\u2e20\0\u26d0\0\u27a8\0\u2910"+ + "\0\u29e8\0\u0360"; private static int [] zzUnpackRowMap() { - int [] result = new int[240]; + int [] result = new int[242]; int offset = 0; offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); return result; @@ -374,136 +375,136 @@ class _PythonLexer implements FlexLexer { "\1\163\107\0\1\164\1\165\106\0\1\166\1\0\1\167"+ "\105\0\1\170\107\0\1\171\107\0\1\172\107\0\1\173"+ "\107\0\1\174\6\0\1\175\100\0\1\176\6\0\1\177"+ - "\1\200\77\0\1\201\25\0\13\102\1\0\20\102\1\202"+ - "\1\104\1\102\1\105\50\102\34\0\1\203\1\204\1\0"+ - "\1\105\2\205\45\0\1\105\110\102\13\106\1\0\21\106"+ - "\1\107\1\202\1\105\160\106\35\0\1\204\1\206\1\105"+ - "\2\205\45\0\1\105\1\0\1\111\1\112\1\111\1\0"+ - "\1\111\3\0\1\116\7\0\1\116\1\0\1\117\2\120"+ - "\1\0\1\121\61\0\3\112\1\0\1\112\15\0\1\117"+ - "\2\120\1\0\1\121\61\0\5\207\2\0\1\207\4\0"+ - "\1\207\2\0\1\207\3\0\2\207\15\0\1\207\1\0"+ - "\1\207\3\0\1\207\37\0\1\210\1\0\1\210\1\0"+ - "\1\210\103\0\1\211\3\0\1\211\103\0\3\117\1\0"+ - "\1\117\16\0\2\120\1\0\1\121\61\0\3\212\1\0"+ - "\1\212\20\0\1\213\32\0\1\213\27\0\11\24\2\0"+ - "\7\24\1\0\2\24\1\0\4\24\1\214\7\0\16\24"+ - "\30\0\6\24\1\215\2\24\2\0\7\24\1\0\2\24"+ - "\1\0\5\24\7\0\16\24\30\0\11\24\2\0\7\24"+ - "\1\0\2\24\1\0\5\24\7\0\1\24\1\216\14\24"+ - "\30\0\11\24\2\0\7\24\1\0\1\217\1\24\1\0"+ - "\5\24\1\36\1\0\1\37\4\0\16\24\30\0\11\24"+ - "\2\0\7\24\1\0\2\24\1\0\5\24\7\0\12\24"+ - "\1\220\3\24\30\0\11\24\2\0\7\24\1\0\2\24"+ - "\1\0\5\24\7\0\6\24\1\221\7\24\30\0\11\24"+ - "\2\0\7\24\1\0\2\24\1\0\5\24\7\0\3\24"+ - "\1\222\3\24\1\223\6\24\30\0\11\24\2\0\7\24"+ - "\1\0\2\24\1\0\5\24\7\0\4\24\1\224\11\24"+ - "\30\0\11\24\2\0\7\24\1\0\2\24\1\0\5\24"+ - "\7\0\7\24\1\225\6\24\27\0\13\135\1\0\20\135"+ - "\1\226\1\137\1\135\1\0\50\135\34\0\1\227\53\0"+ - "\110\135\13\140\1\0\21\140\1\141\1\226\1\0\160\140"+ - "\36\0\1\230\52\0\11\24\2\0\7\24\1\0\2\24"+ - "\1\0\5\24\7\0\2\24\1\231\13\24\30\0\11\24"+ - "\2\0\7\24\1\0\2\24\1\0\5\24\7\0\3\24"+ - "\1\232\12\24\30\0\11\24\2\0\7\24\1\0\2\24"+ - "\1\0\5\24\7\0\4\24\1\233\11\24\30\0\3\24"+ - "\1\234\4\24\1\235\2\0\7\24\1\0\2\24\1\0"+ - "\5\24\7\0\16\24\30\0\11\24\2\0\7\24\1\0"+ - "\2\24\1\0\5\24\7\0\11\24\1\236\4\24\30\0"+ + "\1\200\77\0\1\201\64\0\1\202\1\203\47\0\13\102"+ + "\1\0\20\102\1\204\1\104\1\102\1\105\50\102\34\0"+ + "\1\205\1\206\1\0\1\105\2\207\45\0\1\105\110\102"+ + "\13\106\1\0\21\106\1\107\1\204\1\105\160\106\35\0"+ + "\1\206\1\210\1\105\2\207\45\0\1\105\1\0\1\111"+ + "\1\112\1\111\1\0\1\111\3\0\1\116\7\0\1\116"+ + "\1\0\1\117\2\120\1\0\1\121\61\0\3\112\1\0"+ + "\1\112\15\0\1\117\2\120\1\0\1\121\61\0\5\211"+ + "\2\0\1\211\4\0\1\211\2\0\1\211\3\0\2\211"+ + "\15\0\1\211\1\0\1\211\3\0\1\211\37\0\1\212"+ + "\1\0\1\212\1\0\1\212\103\0\1\213\3\0\1\213"+ + "\103\0\3\117\1\0\1\117\16\0\2\120\1\0\1\121"+ + "\61\0\3\214\1\0\1\214\20\0\1\215\32\0\1\215"+ + "\27\0\11\24\2\0\7\24\1\0\2\24\1\0\4\24"+ + "\1\216\7\0\16\24\30\0\6\24\1\217\2\24\2\0"+ + "\7\24\1\0\2\24\1\0\5\24\7\0\16\24\30\0"+ "\11\24\2\0\7\24\1\0\2\24\1\0\5\24\7\0"+ - "\1\24\1\237\14\24\30\0\11\24\2\0\7\24\1\0"+ - "\2\24\1\0\5\24\7\0\1\240\15\24\30\0\11\24"+ - "\2\0\7\24\1\0\2\24\1\0\5\24\7\0\10\24"+ - "\1\241\5\24\30\0\11\24\2\0\7\24\1\0\2\24"+ - "\1\0\5\24\7\0\3\24\1\242\12\24\30\0\11\24"+ - "\2\0\7\24\1\0\1\243\1\24\1\0\5\24\7\0"+ - "\16\24\30\0\6\24\1\244\2\24\2\0\7\24\1\0"+ - "\2\24\1\0\5\24\7\0\16\24\30\0\11\24\2\0"+ - "\7\24\1\0\2\24\1\0\5\24\7\0\7\24\1\245"+ - "\6\24\111\0\1\246\107\0\1\247\107\0\1\250\107\0"+ - "\1\251\62\0\1\204\1\0\1\105\2\205\45\0\1\105"+ - "\34\203\1\252\1\253\52\203\35\206\1\254\1\255\51\206"+ - "\1\0\5\207\2\0\1\207\1\116\3\0\1\207\2\0"+ - "\1\207\1\116\2\0\2\207\15\0\1\207\1\0\1\207"+ - "\3\0\1\207\37\0\1\210\1\0\1\210\1\0\1\210"+ - "\3\0\1\116\7\0\1\116\67\0\1\211\3\0\1\211"+ - "\3\0\1\116\7\0\1\116\67\0\3\212\1\0\1\212"+ - "\21\0\1\121\61\0\3\212\1\0\1\212\103\0\11\24"+ - "\2\0\7\24\1\0\2\24\1\0\5\24\7\0\12\24"+ - "\1\256\3\24\30\0\11\24\2\0\7\24\1\0\2\24"+ - "\1\0\5\24\7\0\1\257\15\24\30\0\11\24\2\0"+ - "\7\24\1\0\2\24\1\0\5\24\7\0\1\260\15\24"+ - "\30\0\7\24\1\261\1\24\2\0\7\24\1\0\2\24"+ - "\1\0\5\24\7\0\16\24\30\0\11\24\2\0\7\24"+ - "\1\0\1\262\1\24\1\0\5\24\7\0\16\24\30\0"+ - "\11\24\2\0\7\24\1\0\1\263\1\24\1\0\5\24"+ - "\7\0\16\24\30\0\3\24\1\264\5\24\2\0\7\24"+ + "\1\24\1\220\14\24\30\0\11\24\2\0\7\24\1\0"+ + "\1\221\1\24\1\0\5\24\1\36\1\0\1\37\4\0"+ + "\16\24\30\0\11\24\2\0\7\24\1\0\2\24\1\0"+ + "\5\24\7\0\12\24\1\222\3\24\30\0\11\24\2\0"+ + "\7\24\1\0\2\24\1\0\5\24\7\0\6\24\1\223"+ + "\7\24\30\0\11\24\2\0\7\24\1\0\2\24\1\0"+ + "\5\24\7\0\3\24\1\224\3\24\1\225\6\24\30\0"+ + "\11\24\2\0\7\24\1\0\2\24\1\0\5\24\7\0"+ + "\4\24\1\226\11\24\30\0\11\24\2\0\7\24\1\0"+ + "\2\24\1\0\5\24\7\0\7\24\1\227\6\24\27\0"+ + "\13\135\1\0\20\135\1\230\1\137\1\135\1\0\50\135"+ + "\34\0\1\231\53\0\110\135\13\140\1\0\21\140\1\141"+ + "\1\230\1\0\160\140\36\0\1\232\52\0\11\24\2\0"+ + "\7\24\1\0\2\24\1\0\5\24\7\0\2\24\1\233"+ + "\13\24\30\0\11\24\2\0\7\24\1\0\2\24\1\0"+ + "\5\24\7\0\3\24\1\234\12\24\30\0\11\24\2\0"+ + "\7\24\1\0\2\24\1\0\5\24\7\0\4\24\1\235"+ + "\11\24\30\0\3\24\1\236\4\24\1\237\2\0\7\24"+ "\1\0\2\24\1\0\5\24\7\0\16\24\30\0\11\24"+ - "\2\0\7\24\1\0\2\24\1\0\2\24\1\265\2\24"+ - "\7\0\16\24\30\0\11\24\2\0\7\24\1\0\2\24"+ - "\1\0\5\24\7\0\3\24\1\266\12\24\27\0\34\227"+ - "\1\267\1\270\52\227\35\230\1\271\1\272\51\230\1\0"+ - "\11\24\2\0\7\24\1\0\1\273\1\24\1\0\5\24"+ - "\7\0\16\24\30\0\11\24\2\0\7\24\1\0\2\24"+ - "\1\0\5\24\7\0\4\24\1\274\11\24\30\0\11\24"+ - "\2\0\7\24\1\0\2\24\1\0\5\24\7\0\3\24"+ - "\1\275\12\24\30\0\6\24\1\276\2\24\2\0\7\24"+ - "\1\0\2\24\1\0\5\24\7\0\16\24\30\0\11\24"+ - "\2\0\7\24\1\0\2\24\1\0\5\24\7\0\3\24"+ - "\1\277\12\24\30\0\10\24\1\300\2\0\7\24\1\0"+ - "\2\24\1\0\5\24\7\0\16\24\30\0\7\24\1\301"+ - "\1\24\2\0\7\24\1\0\2\24\1\0\5\24\7\0"+ - "\16\24\30\0\10\24\1\302\2\0\7\24\1\0\2\24"+ - "\1\0\5\24\7\0\16\24\27\0\34\203\1\303\1\304"+ - "\162\203\145\206\1\305\1\306\51\206\1\0\10\24\1\307"+ + "\2\0\7\24\1\0\2\24\1\0\5\24\7\0\11\24"+ + "\1\240\4\24\30\0\11\24\2\0\7\24\1\0\2\24"+ + "\1\0\5\24\7\0\1\24\1\241\14\24\30\0\11\24"+ + "\2\0\7\24\1\0\2\24\1\0\5\24\7\0\1\242"+ + "\15\24\30\0\11\24\2\0\7\24\1\0\2\24\1\0"+ + "\5\24\7\0\10\24\1\243\5\24\30\0\11\24\2\0"+ + "\7\24\1\0\2\24\1\0\5\24\7\0\3\24\1\244"+ + "\12\24\30\0\11\24\2\0\7\24\1\0\1\245\1\24"+ + "\1\0\5\24\7\0\16\24\30\0\6\24\1\246\2\24"+ "\2\0\7\24\1\0\2\24\1\0\5\24\7\0\16\24"+ "\30\0\11\24\2\0\7\24\1\0\2\24\1\0\5\24"+ - "\7\0\5\24\1\310\10\24\30\0\11\24\2\0\7\24"+ - "\1\0\2\24\1\0\5\24\7\0\2\24\1\311\13\24"+ + "\7\0\7\24\1\247\6\24\111\0\1\250\107\0\1\251"+ + "\107\0\1\252\107\0\1\253\62\0\1\206\1\0\1\105"+ + "\2\207\45\0\1\105\34\205\1\254\1\255\52\205\35\210"+ + "\1\256\1\257\51\210\1\0\5\211\2\0\1\211\1\116"+ + "\3\0\1\211\2\0\1\211\1\116\2\0\2\211\15\0"+ + "\1\211\1\0\1\211\3\0\1\211\37\0\1\212\1\0"+ + "\1\212\1\0\1\212\3\0\1\116\7\0\1\116\67\0"+ + "\1\213\3\0\1\213\3\0\1\116\7\0\1\116\67\0"+ + "\3\214\1\0\1\214\21\0\1\121\61\0\3\214\1\0"+ + "\1\214\103\0\11\24\2\0\7\24\1\0\2\24\1\0"+ + "\5\24\7\0\12\24\1\260\3\24\30\0\11\24\2\0"+ + "\7\24\1\0\2\24\1\0\5\24\7\0\1\261\15\24"+ "\30\0\11\24\2\0\7\24\1\0\2\24\1\0\5\24"+ - "\7\0\10\24\1\312\5\24\30\0\11\24\2\0\7\24"+ - "\1\0\2\24\1\0\4\24\1\313\7\0\16\24\30\0"+ - "\11\24\2\0\7\24\1\0\1\314\1\24\1\0\5\24"+ - "\7\0\16\24\27\0\34\227\1\315\1\316\162\227\145\230"+ - "\1\317\1\320\51\230\1\0\11\24\2\0\7\24\1\0"+ - "\2\24\1\0\4\24\1\321\7\0\16\24\30\0\11\24"+ - "\2\0\7\24\1\0\2\24\1\0\5\24\7\0\7\24"+ - "\1\322\6\24\30\0\11\24\2\0\7\24\1\0\2\24"+ - "\1\0\5\24\7\0\3\24\1\323\12\24\30\0\11\24"+ - "\2\0\7\24\1\0\2\24\1\0\4\24\1\324\7\0"+ + "\7\0\1\262\15\24\30\0\7\24\1\263\1\24\2\0"+ + "\7\24\1\0\2\24\1\0\5\24\7\0\16\24\30\0"+ + "\11\24\2\0\7\24\1\0\1\264\1\24\1\0\5\24"+ + "\7\0\16\24\30\0\11\24\2\0\7\24\1\0\1\265"+ + "\1\24\1\0\5\24\7\0\16\24\30\0\3\24\1\266"+ + "\5\24\2\0\7\24\1\0\2\24\1\0\5\24\7\0"+ "\16\24\30\0\11\24\2\0\7\24\1\0\2\24\1\0"+ - "\5\24\7\0\2\24\1\325\13\24\30\0\11\24\2\0"+ - "\7\24\1\0\2\24\1\0\5\24\7\0\1\326\15\24"+ - "\30\0\11\24\2\0\7\24\1\0\1\327\1\24\1\0"+ - "\5\24\7\0\16\24\27\0\34\203\1\330\1\304\106\203"+ - "\1\331\1\304\52\203\35\206\1\305\1\332\106\206\1\305"+ - "\1\330\51\206\1\0\10\24\1\333\2\0\7\24\1\0"+ - "\2\24\1\0\5\24\7\0\16\24\30\0\11\24\2\0"+ - "\7\24\1\0\2\24\1\0\5\24\7\0\1\334\15\24"+ + "\2\24\1\267\2\24\7\0\16\24\30\0\11\24\2\0"+ + "\7\24\1\0\2\24\1\0\5\24\7\0\3\24\1\270"+ + "\12\24\27\0\34\231\1\271\1\272\52\231\35\232\1\273"+ + "\1\274\51\232\1\0\11\24\2\0\7\24\1\0\1\275"+ + "\1\24\1\0\5\24\7\0\16\24\30\0\11\24\2\0"+ + "\7\24\1\0\2\24\1\0\5\24\7\0\4\24\1\276"+ + "\11\24\30\0\11\24\2\0\7\24\1\0\2\24\1\0"+ + "\5\24\7\0\3\24\1\277\12\24\30\0\6\24\1\300"+ + "\2\24\2\0\7\24\1\0\2\24\1\0\5\24\7\0"+ + "\16\24\30\0\11\24\2\0\7\24\1\0\2\24\1\0"+ + "\5\24\7\0\3\24\1\301\12\24\30\0\10\24\1\302"+ + "\2\0\7\24\1\0\2\24\1\0\5\24\7\0\16\24"+ + "\30\0\7\24\1\303\1\24\2\0\7\24\1\0\2\24"+ + "\1\0\5\24\7\0\16\24\30\0\10\24\1\304\2\0"+ + "\7\24\1\0\2\24\1\0\5\24\7\0\16\24\27\0"+ + "\34\205\1\305\1\306\162\205\145\210\1\307\1\310\51\210"+ + "\1\0\10\24\1\311\2\0\7\24\1\0\2\24\1\0"+ + "\5\24\7\0\16\24\30\0\11\24\2\0\7\24\1\0"+ + "\2\24\1\0\5\24\7\0\5\24\1\312\10\24\30\0"+ + "\11\24\2\0\7\24\1\0\2\24\1\0\5\24\7\0"+ + "\2\24\1\313\13\24\30\0\11\24\2\0\7\24\1\0"+ + "\2\24\1\0\5\24\7\0\10\24\1\314\5\24\30\0"+ + "\11\24\2\0\7\24\1\0\2\24\1\0\4\24\1\315"+ + "\7\0\16\24\30\0\11\24\2\0\7\24\1\0\1\316"+ + "\1\24\1\0\5\24\7\0\16\24\27\0\34\231\1\317"+ + "\1\320\162\231\145\232\1\321\1\322\51\232\1\0\11\24"+ + "\2\0\7\24\1\0\2\24\1\0\4\24\1\323\7\0"+ + "\16\24\30\0\11\24\2\0\7\24\1\0\2\24\1\0"+ + "\5\24\7\0\7\24\1\324\6\24\30\0\11\24\2\0"+ + "\7\24\1\0\2\24\1\0\5\24\7\0\3\24\1\325"+ + "\12\24\30\0\11\24\2\0\7\24\1\0\2\24\1\0"+ + "\4\24\1\326\7\0\16\24\30\0\11\24\2\0\7\24"+ + "\1\0\2\24\1\0\5\24\7\0\2\24\1\327\13\24"+ "\30\0\11\24\2\0\7\24\1\0\2\24\1\0\5\24"+ - "\7\0\4\24\1\335\11\24\30\0\11\24\2\0\7\24"+ - "\1\0\2\24\1\0\5\24\7\0\1\24\1\336\14\24"+ - "\27\0\34\227\1\337\1\316\106\227\1\340\1\316\52\227"+ - "\35\230\1\317\1\341\106\230\1\317\1\337\51\230\1\0"+ + "\7\0\1\330\15\24\30\0\11\24\2\0\7\24\1\0"+ + "\1\331\1\24\1\0\5\24\7\0\16\24\27\0\34\205"+ + "\1\332\1\306\106\205\1\333\1\306\52\205\35\210\1\307"+ + "\1\334\106\210\1\307\1\332\51\210\1\0\10\24\1\335"+ + "\2\0\7\24\1\0\2\24\1\0\5\24\7\0\16\24"+ + "\30\0\11\24\2\0\7\24\1\0\2\24\1\0\5\24"+ + "\7\0\1\336\15\24\30\0\11\24\2\0\7\24\1\0"+ + "\2\24\1\0\5\24\7\0\4\24\1\337\11\24\30\0"+ "\11\24\2\0\7\24\1\0\2\24\1\0\5\24\7\0"+ - "\4\24\1\342\11\24\30\0\11\24\2\0\7\24\1\0"+ - "\2\24\1\0\5\24\7\0\1\24\1\343\14\24\30\0"+ - "\11\24\2\0\7\24\1\0\2\24\1\0\5\24\7\0"+ - "\4\24\1\344\11\24\30\0\10\24\1\345\2\0\7\24"+ - "\1\0\2\24\1\0\5\24\7\0\16\24\27\0\34\203"+ - "\1\346\1\304\52\203\35\206\1\305\1\347\51\206\1\0"+ - "\11\24\2\0\7\24\1\0\2\24\1\0\5\24\7\0"+ - "\11\24\1\350\4\24\27\0\34\227\1\351\1\316\52\227"+ - "\35\230\1\317\1\352\51\230\1\0\11\24\2\0\7\24"+ - "\1\0\2\24\1\0\2\24\1\353\2\24\7\0\16\24"+ - "\27\0\34\203\1\354\1\304\52\203\35\206\1\305\1\355"+ - "\51\206\34\227\1\356\1\316\52\227\35\230\1\317\1\357"+ - "\51\230\1\0\11\24\2\0\7\24\1\0\1\360\1\24"+ - "\1\0\5\24\7\0\16\24\27\0"; + "\1\24\1\340\14\24\27\0\34\231\1\341\1\320\106\231"+ + "\1\342\1\320\52\231\35\232\1\321\1\343\106\232\1\321"+ + "\1\341\51\232\1\0\11\24\2\0\7\24\1\0\2\24"+ + "\1\0\5\24\7\0\4\24\1\344\11\24\30\0\11\24"+ + "\2\0\7\24\1\0\2\24\1\0\5\24\7\0\1\24"+ + "\1\345\14\24\30\0\11\24\2\0\7\24\1\0\2\24"+ + "\1\0\5\24\7\0\4\24\1\346\11\24\30\0\10\24"+ + "\1\347\2\0\7\24\1\0\2\24\1\0\5\24\7\0"+ + "\16\24\27\0\34\205\1\350\1\306\52\205\35\210\1\307"+ + "\1\351\51\210\1\0\11\24\2\0\7\24\1\0\2\24"+ + "\1\0\5\24\7\0\11\24\1\352\4\24\27\0\34\231"+ + "\1\353\1\320\52\231\35\232\1\321\1\354\51\232\1\0"+ + "\11\24\2\0\7\24\1\0\2\24\1\0\2\24\1\355"+ + "\2\24\7\0\16\24\27\0\34\205\1\356\1\306\52\205"+ + "\35\210\1\307\1\357\51\210\34\231\1\360\1\320\52\231"+ + "\35\232\1\321\1\361\51\232\1\0\11\24\2\0\7\24"+ + "\1\0\1\362\1\24\1\0\5\24\7\0\16\24\27\0"; private static int [] zzUnpackTrans() { - int [] result = new int[11808]; + int [] result = new int[11880]; int offset = 0; offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); return result; @@ -544,17 +545,17 @@ class _PythonLexer implements FlexLexer { private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute(); private static final String ZZ_ATTRIBUTE_PACKED_0 = - "\3\0\1\11\1\1\6\11\4\1\1\11\44\1\14\11"+ - "\1\0\3\1\1\11\4\1\4\0\1\11\1\1\1\0"+ - "\1\11\10\1\1\11\27\1\3\11\1\1\1\11\1\1"+ - "\5\11\1\1\2\11\1\1\1\11\2\1\1\11\1\0"+ - "\5\1\1\0\12\1\1\11\17\1\4\11\1\0\2\1"+ - "\1\0\11\1\4\0\10\1\1\0\2\1\1\0\6\1"+ - "\1\0\2\1\1\0\16\1\1\11\6\1\2\0\1\1"+ - "\2\0\6\1"; + "\3\0\1\11\1\1\6\11\4\1\1\11\44\1\11\11"+ + "\1\1\2\11\1\0\3\1\1\11\4\1\4\0\1\11"+ + "\1\1\1\0\1\11\10\1\1\11\27\1\3\11\1\1"+ + "\1\11\1\1\5\11\1\1\2\11\1\1\2\11\1\0"+ + "\2\1\1\11\1\0\5\1\1\0\12\1\1\11\17\1"+ + "\4\11\1\0\2\1\1\0\11\1\4\0\10\1\1\0"+ + "\2\1\1\0\6\1\1\0\2\1\1\0\16\1\1\11"+ + "\6\1\2\0\1\1\2\0\6\1"; private static int [] zzUnpackAttribute() { - int [] result = new int[240]; + int [] result = new int[242]; int offset = 0; offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); return result; @@ -866,372 +867,376 @@ return yylength()-i-1; zzMarkedPos = zzMarkedPosL; switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) { - case 82: + case 83: { return PyTokenTypes.YIELD_KEYWORD; } - case 92: break; + case 93: break; case 11: { return PyTokenTypes.INTEGER_LITERAL; } - case 93: break; + case 94: break; case 19: { return PyTokenTypes.DIV; } - case 94: break; + case 95: break; case 20: { return PyTokenTypes.PERC; } - case 95: break; + case 96: break; case 3: { return PyTokenTypes.BACKSLASH; } - case 96: break; + case 97: break; case 28: { return PyTokenTypes.RPAR; } - case 97: break; + case 98: break; case 10: { return PyTokenTypes.BAD_CHARACTER; } - case 98: break; + case 99: break; case 31: { return PyTokenTypes.LBRACE; } - case 99: break; - case 63: + case 100: break; + case 64: { yypushback(getSpaceLength(yytext())); return PyTokenTypes.DOCSTRING; } - case 100: break; + case 101: break; case 14: { return PyTokenTypes.MINUS; } - case 101: break; - case 79: + case 102: break; + case 80: { return PyTokenTypes.BREAK_KEYWORD; } - case 102: break; + case 103: break; case 30: { return PyTokenTypes.RBRACKET; } - case 103: break; + case 104: break; case 1: { yypushback(1); yybegin(PENDING_DOCSTRING); } - case 104: break; + case 105: break; case 8: { yypushback(1); yybegin(USUAL); } - case 105: break; + case 106: break; case 13: { return PyTokenTypes.DOT; } - case 106: break; + case 107: break; case 12: { return PyTokenTypes.IDENTIFIER; } - case 107: break; + case 108: break; case 27: { return PyTokenTypes.LPAR; } - case 108: break; + case 109: break; case 25: { return PyTokenTypes.LT; } - case 109: break; + case 110: break; case 44: { return PyTokenTypes.IN_KEYWORD; } - case 110: break; - case 80: + case 111: break; + case 81: { return PyTokenTypes.RAISE_KEYWORD; } - case 111: break; - case 73: + case 112: break; + case 74: { return PyTokenTypes.GTGTEQ; } - case 112: break; + case 113: break; case 5: { return PyTokenTypes.SPACE; } - case 113: break; - case 85: + case 114: break; + case 86: { return PyTokenTypes.EXCEPT_KEYWORD; } - case 114: break; + case 115: break; case 40: { return PyTokenTypes.IMAGINARY_LITERAL; } - case 115: break; + case 116: break; case 15: { return PyTokenTypes.SINGLE_QUOTED_STRING; } - case 116: break; + case 117: break; case 7: { return PyTokenTypes.FORMFEED; } - case 117: break; + case 118: break; case 37: { return PyTokenTypes.SEMICOLON; } - case 118: break; + case 119: break; case 24: { return PyTokenTypes.GT; } - case 119: break; + case 120: break; case 29: { return PyTokenTypes.LBRACKET; } - case 120: break; - case 74: + case 121: break; + case 35: + { return PyTokenTypes.COLON; + } + case 122: break; + case 75: { return PyTokenTypes.LTLTEQ; } - case 121: break; + case 123: break; case 9: { if (zzInput == YYEOF) return PyTokenTypes.DOCSTRING; else yybegin(USUAL); return PyTokenTypes.SINGLE_QUOTED_STRING; } - case 122: break; - case 76: + case 124: break; + case 77: { return PyTokenTypes.ELSE_KEYWORD; } - case 123: break; + case 125: break; case 22: { return PyTokenTypes.OR; } - case 124: break; + case 126: break; case 48: { return PyTokenTypes.MULTEQ; } - case 125: break; - case 90: + case 127: break; + case 91: { return PyTokenTypes.FINALLY_KEYWORD; } - case 126: break; - case 83: + case 128: break; + case 84: { return PyTokenTypes.WHILE_KEYWORD; } - case 127: break; + case 129: break; case 18: { return PyTokenTypes.MULT; } - case 128: break; - case 87: + case 130: break; + case 88: { return PyTokenTypes.ASSERT_KEYWORD; } - case 129: break; + case 131: break; case 51: { return PyTokenTypes.FLOORDIV; } - case 130: break; - case 89: + case 132: break; + case 90: { return PyTokenTypes.GLOBAL_KEYWORD; } - case 131: break; - case 84: + case 133: break; + case 85: { return PyTokenTypes.LAMBDA_KEYWORD; } - case 132: break; + case 134: break; case 55: { return PyTokenTypes.XOREQ; } - case 133: break; - case 64: + case 135: break; + case 65: { return PyTokenTypes.FOR_KEYWORD; } - case 134: break; + case 136: break; case 33: { return PyTokenTypes.AT; } - case 135: break; - case 67: + case 137: break; + case 68: { return PyTokenTypes.NOT_KEYWORD; } - case 136: break; + case 138: break; case 16: { return PyTokenTypes.PLUS; } - case 137: break; + case 139: break; case 42: { return PyTokenTypes.MINUSEQ; } - case 138: break; + case 140: break; case 38: { yypushback(getSpaceLength(yytext())); yybegin(USUAL); return PyTokenTypes.DOCSTRING; } - case 139: break; + case 141: break; case 61: { return PyTokenTypes.NE; } - case 140: break; + case 142: break; case 34: { return PyTokenTypes.COMMA; } - case 141: break; + case 143: break; case 47: { return PyTokenTypes.EQEQ; } - case 142: break; + case 144: break; case 36: { return PyTokenTypes.TICK; } - case 143: break; + case 145: break; case 49: { return PyTokenTypes.EXP; } - case 144: break; - case 65: + case 146: break; + case 66: { return PyTokenTypes.TRIPLE_QUOTED_STRING; } - case 145: break; - case 91: + case 147: break; + case 92: { return PyTokenTypes.CONTINUE_KEYWORD; } - case 146: break; + case 148: break; case 60: { return PyTokenTypes.LTLT; } - case 147: break; + case 149: break; case 58: { return PyTokenTypes.LE; } - case 148: break; - case 66: + case 150: break; + case 67: { return PyTokenTypes.AND_KEYWORD; } - case 149: break; + case 151: break; case 41: { return PyTokenTypes.OR_KEYWORD; } - case 150: break; - case 78: + case 152: break; + case 79: { return PyTokenTypes.PASS_KEYWORD; } - case 151: break; + case 153: break; + case 62: + { yypushback(yylength()-1); yybegin(PENDING_DOCSTRING); return PyTokenTypes.COLON; + } + case 154: break; case 2: { return PyTokenTypes.END_OF_LINE_COMMENT; } - case 152: break; - case 62: + case 155: break; + case 63: { if (zzInput == YYEOF) return PyTokenTypes.DOCSTRING; else yybegin(USUAL); return PyTokenTypes.TRIPLE_QUOTED_STRING; } - case 153: break; + case 156: break; case 54: { return PyTokenTypes.OREQ; } - case 154: break; + case 157: break; case 57: { return PyTokenTypes.GTGT; } - case 155: break; + case 158: break; case 21: { return PyTokenTypes.AND; } - case 156: break; + case 159: break; case 50: { return PyTokenTypes.DIVEQ; } - case 157: break; - case 35: - { yybegin(PENDING_DOCSTRING); return PyTokenTypes.COLON; - } - case 158: break; - case 86: + case 160: break; + case 87: { return PyTokenTypes.RETURN_KEYWORD; } - case 159: break; - case 88: + case 161: break; + case 89: { return PyTokenTypes.IMPORT_KEYWORD; } - case 160: break; + case 162: break; case 56: { return PyTokenTypes.GE; } - case 161: break; + case 163: break; case 46: { return PyTokenTypes.PLUSEQ; } - case 162: break; - case 68: + case 164: break; + case 69: { return PyTokenTypes.DEF_KEYWORD; } - case 163: break; + case 165: break; case 45: { return PyTokenTypes.IS_KEYWORD; } - case 164: break; - case 72: + case 166: break; + case 73: { return PyTokenTypes.FLOORDIVEQ; } - case 165: break; + case 167: break; case 39: { return PyTokenTypes.FLOAT_LITERAL; } - case 166: break; + case 168: break; case 4: { return PyTokenTypes.LINE_BREAK; } - case 167: break; + case 169: break; case 52: { return PyTokenTypes.PERCEQ; } - case 168: break; - case 70: + case 170: break; + case 71: { return PyTokenTypes.TRY_KEYWORD; } - case 169: break; + case 171: break; case 53: { return PyTokenTypes.ANDEQ; } - case 170: break; + case 172: break; case 17: { return PyTokenTypes.EQ; } - case 171: break; - case 75: + case 173: break; + case 76: { return PyTokenTypes.FROM_KEYWORD; } - case 172: break; - case 71: + case 174: break; + case 72: { return PyTokenTypes.EXPEQ; } - case 173: break; - case 77: + case 175: break; + case 78: { return PyTokenTypes.ELIF_KEYWORD; } - case 174: break; + case 176: break; case 32: { return PyTokenTypes.RBRACE; } - case 175: break; - case 81: + case 177: break; + case 82: { return PyTokenTypes.CLASS_KEYWORD; } - case 176: break; + case 178: break; case 43: { return PyTokenTypes.IF_KEYWORD; } - case 177: break; + case 179: break; case 6: { return PyTokenTypes.TAB; } - case 178: break; + case 180: break; case 59: { return PyTokenTypes.NE_OLD; } - case 179: break; + case 181: break; case 26: { return PyTokenTypes.TILDE; } - case 180: break; + case 182: break; case 23: { return PyTokenTypes.XOR; } - case 181: break; - case 69: + case 183: break; + case 70: { return PyTokenTypes.DEL_KEYWORD; } - case 182: break; + case 184: break; default: if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { zzAtEOF = true; diff --git a/python/src/com/jetbrains/python/testing/PythonTestConfigurationType.java b/python/src/com/jetbrains/python/testing/PythonTestConfigurationType.java index 48b69698918b..0bd1b130c047 100644 --- a/python/src/com/jetbrains/python/testing/PythonTestConfigurationType.java +++ b/python/src/com/jetbrains/python/testing/PythonTestConfigurationType.java @@ -17,7 +17,7 @@ import javax.swing.*; * User : catherine */ public class PythonTestConfigurationType implements ConfigurationType { - public static final String ID = "PythonTestConfigurationType"; + private String myId = "tests"; public final PythonDocTestConfigurationFactory PY_DOCTEST_FACTORY = new PythonDocTestConfigurationFactory(this); public final PythonUnitTestConfigurationFactory PY_UNITTEST_FACTORY = new PythonUnitTestConfigurationFactory(this); @@ -37,6 +37,13 @@ public class PythonTestConfigurationType implements ConfigurationType { super(configurationType); } + @NotNull + public ConfigurationType getType() { + ConfigurationType type = super.getType(); + ((PythonTestConfigurationType)type).setId("PythonUnitTestConfigurationType"); + return type; + } + public RunConfiguration createTemplateConfiguration(Project project) { return new PythonUnitTestRunConfiguration(new RunConfigurationModule(project), this, ""); } @@ -56,6 +63,13 @@ public class PythonTestConfigurationType implements ConfigurationType { return new PythonDocTestRunConfiguration(new RunConfigurationModule(project), this, ""); } + @NotNull + public ConfigurationType getType() { + ConfigurationType type = super.getType(); + ((PythonTestConfigurationType)type).setId("PythonDocTestRunConfigurationType"); + return type; + } + @Override public String getName() { return PyBundle.message("runcfg.doctest.display_name"); @@ -71,6 +85,13 @@ public class PythonTestConfigurationType implements ConfigurationType { return new PyTestRunConfiguration("", new RunConfigurationModule(project), this); } + @NotNull + public ConfigurationType getType() { + ConfigurationType type = super.getType(); + ((PythonTestConfigurationType)type).setId("py.test"); + return type; + } + @Override public String getName() { return PyBundle.message("runcfg.pytest.display_name"); @@ -86,6 +107,13 @@ public class PythonTestConfigurationType implements ConfigurationType { return new PythonNoseTestRunConfiguration(new RunConfigurationModule(project), this, ""); } + @NotNull + public ConfigurationType getType() { + ConfigurationType type = super.getType(); + ((PythonTestConfigurationType)type).setId("PythonNoseTestRunConfigurationType"); + return type; + } + @Override public String getName() { return PyBundle.message("runcfg.nosetests.display_name"); @@ -101,6 +129,13 @@ public class PythonTestConfigurationType implements ConfigurationType { return new PythonAtTestRunConfiguration(new RunConfigurationModule(project), this, ""); } + @NotNull + public ConfigurationType getType() { + ConfigurationType type = super.getType(); + ((PythonTestConfigurationType)type).setId("attests"); + return type; + } + @Override public String getName() { return PyBundle.message("runcfg.attest.display_name"); @@ -125,7 +160,11 @@ public class PythonTestConfigurationType implements ConfigurationType { @NotNull @Override public String getId() { - return ID; + return myId; + } + + public void setId(String id) { + myId = id; } public ConfigurationFactory[] getConfigurationFactories() { diff --git a/python/src/com/jetbrains/python/testing/converters/PythonTestRunConfigurationsConverter.java b/python/src/com/jetbrains/python/testing/converters/PythonTestRunConfigurationsConverter.java index 8bff60efad46..856541f9dbd1 100644 --- a/python/src/com/jetbrains/python/testing/converters/PythonTestRunConfigurationsConverter.java +++ b/python/src/com/jetbrains/python/testing/converters/PythonTestRunConfigurationsConverter.java @@ -36,7 +36,7 @@ public class PythonTestRunConfigurationsConverter extends ConversionProcessor""" + Gets a payment profile by user Account object and authorize.net + profileid of the payment profile. + """ + def __init__(self, user, profileid): + CustomerRequest.__init__(self, user, + customerPaymentProfileId=profileid) \ No newline at end of file diff --git a/python/testData/inspections/MoveDocstring_after.py b/python/testData/inspections/MoveDocstring_after.py new file mode 100644 index 000000000000..e262aaa10637 --- /dev/null +++ b/python/testData/inspections/MoveDocstring_after.py @@ -0,0 +1,10 @@ +class GetCustomerPaymentProfileRequest(CustomerRequest): + """ + Gets a payment profile by user Account object and authorize.net + profileid of the payment profile. + """ + _keys = CustomerRequest._keys + ["customerPaymentProfileId"] + + def __init__(self, user, profileid): + CustomerRequest.__init__(self, user, + customerPaymentProfileId=profileid) \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PyQuickFixTest.java b/python/testSrc/com/jetbrains/python/PyQuickFixTest.java index ec78c2966fb1..224bef34eadc 100644 --- a/python/testSrc/com/jetbrains/python/PyQuickFixTest.java +++ b/python/testSrc/com/jetbrains/python/PyQuickFixTest.java @@ -287,6 +287,11 @@ public class PyQuickFixTest extends PyLightFixtureTestCase { PyBundle.message("QFIX.remove.decorator"), true, true); } + public void testMoveDocstring() { //PY-4398 + doInspectionTest("MoveDocstring.py", PyStatementEffectInspection.class, + PyBundle.message("QFIX.statement.effect.move.docstring"), true, true); + } + public void testSetFunctionToLiteral() { //PY-3120 setLanguageLevel(LanguageLevel.PYTHON27); doInspectionTest("SetFunctionToLiteral.py", PySetFunctionToLiteralInspection.class, diff --git a/python/testSrc/com/jetbrains/python/PythonAllTestsSuite.java b/python/testSrc/com/jetbrains/python/PythonAllTestsSuite.java index 3750478347f7..364974d486bb 100644 --- a/python/testSrc/com/jetbrains/python/PythonAllTestsSuite.java +++ b/python/testSrc/com/jetbrains/python/PythonAllTestsSuite.java @@ -1,5 +1,7 @@ package com.jetbrains.python; +import com.jetbrains.django.lang.template.DjangoTemplateParserTest; +import com.jetbrains.jinja2.Jinja2ParserTest; import com.jetbrains.python.codeInsight.PyCompletionPatternsTest; import com.jetbrains.python.inspections.*; import com.jetbrains.python.refactoring.*; @@ -81,7 +83,9 @@ public class PythonAllTestsSuite { PyUnusedImportTest.class, PyDeprecationTest.class, PythonHighlightingLexerTest.class, - PyOldStyleClassInspectionTest.class + PyOldStyleClassInspectionTest.class, + Jinja2ParserTest.class, + DjangoTemplateParserTest.class }; public static TestSuite suite() { diff --git a/python/testSrc/com/jetbrains/python/PythonHighlightingLexerTest.java b/python/testSrc/com/jetbrains/python/PythonHighlightingLexerTest.java index 0eba6f5a7ed9..a0cfe91588f3 100644 --- a/python/testSrc/com/jetbrains/python/PythonHighlightingLexerTest.java +++ b/python/testSrc/com/jetbrains/python/PythonHighlightingLexerTest.java @@ -145,6 +145,16 @@ public class PythonHighlightingLexerTest extends PyLexerTestCase { "Py:SINGLE_QUOTED_STRING"); } + public void testNotDocstring() { // PY-4481 + doTest(LanguageLevel.PYTHON27, "d = {\n" + + " 'abc': 'def',\n" + + " 'ghi': 'jkl'\n" + + " }", + "Py:IDENTIFIER", "Py:SPACE", "Py:EQ", "Py:SPACE", "Py:LBRACE", "Py:LINE_BREAK", "Py:SPACE", "Py:SINGLE_QUOTED_STRING", + "Py:COLON", "Py:SPACE", "Py:SINGLE_QUOTED_STRING", "Py:COMMA", "Py:LINE_BREAK", "Py:SPACE", "Py:SINGLE_QUOTED_STRING", + "Py:COLON", "Py:SPACE", "Py:SINGLE_QUOTED_STRING", "Py:LINE_BREAK", "Py:SPACE", "Py:RBRACE"); + } + private static void doTest(LanguageLevel languageLevel, String text, String... expectedTokens) { doLexerTest(text, new PythonHighlightingLexer(languageLevel), expectedTokens); }