diff --git a/python/build/plugin-list.txt b/python/build/plugin-list.txt index 0c484e2aa460..a3a10f858e8c 100644 --- a/python/build/plugin-list.txt +++ b/python/build/plugin-list.txt @@ -47,3 +47,4 @@ rest python-rest pycharm-flask pycharm-numpy +textmate diff --git a/python/build/pycharm_build.gant b/python/build/pycharm_build.gant index 56d0beffc075..5df65471b75e 100644 --- a/python/build/pycharm_build.gant +++ b/python/build/pycharm_build.gant @@ -164,6 +164,17 @@ private layoutPlugins(layouts) { layouts.layoutPlugin("python-rest") layouts.layoutPlugin("pycharm-flask") layouts.layoutPlugin("pycharm-numpy") + layouts.layoutPlugin("textmate") { + dir("themes") { + fileset(dir: "${home}/plugins/textmate/lib/themes/", includes: "*.tmTheme") + } + dir("lib") { + fileset(dir: "${home}/plugins/textmate/lib") { + include("jcodings.jar") + include("joni.jar") + } + } + } } layouts.layoutPlugins() 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 1d102df30cbf..18444383b3f8 100644 --- a/python/psi-api/src/com/jetbrains/python/psi/PyElementVisitor.java +++ b/python/psi-api/src/com/jetbrains/python/psi/PyElementVisitor.java @@ -253,4 +253,8 @@ public class PyElementVisitor extends PsiElementVisitor { public void visitPyConditionalExpression(PyConditionalExpression node) { visitPyElement(node); } + + public void visitPyKeywordArgument(PyKeywordArgument node) { + visitPyElement(node); + } } diff --git a/python/src/com/jetbrains/python/highlighting/PyHighlighter.java b/python/src/com/jetbrains/python/highlighting/PyHighlighter.java index ba35b492a0cd..b32606a196e3 100644 --- a/python/src/com/jetbrains/python/highlighting/PyHighlighter.java +++ b/python/src/com/jetbrains/python/highlighting/PyHighlighter.java @@ -116,6 +116,9 @@ public class PyHighlighter extends SyntaxHighlighterBase { public static final TextAttributesKey PY_SELF_PARAMETER = TextAttributesKey.createTextAttributesKey( "PY.SELF_PARAMETER", new TextAttributes(new Color(148, 85, 141), null, null, null, Font.PLAIN)); + public static final TextAttributesKey PY_KEYWORD_ARGUMENT = TextAttributesKey.createTextAttributesKey( + "PY.KEYWORD_ARGUMENT", new TextAttributes(new Color(102, 0, 153), null, null, null, Font.PLAIN)); + public static final TextAttributesKey PY_VALID_STRING_ESCAPE = _copy("PY.VALID_STRING_ESCAPE", VALID_STRING_ESCAPE); public static final TextAttributesKey PY_INVALID_STRING_ESCAPE = _copy("PY.INVALID_STRING_ESCAPE", INVALID_STRING_ESCAPE); diff --git a/python/src/com/jetbrains/python/highlighting/PythonColorsPage.java b/python/src/com/jetbrains/python/highlighting/PythonColorsPage.java index b46b801d9f04..9c061fd8c5c8 100644 --- a/python/src/com/jetbrains/python/highlighting/PythonColorsPage.java +++ b/python/src/com/jetbrains/python/highlighting/PythonColorsPage.java @@ -44,6 +44,7 @@ public class PythonColorsPage implements ColorSettingsPage, InspectionColorSetti new AttributesDescriptor("Predefined name", PyHighlighter.PY_PREDEFINED_USAGE), new AttributesDescriptor("Parameter", PyHighlighter.PY_PARAMETER), new AttributesDescriptor("'self' parameter", PyHighlighter.PY_SELF_PARAMETER), + new AttributesDescriptor("Keyword argument", PyHighlighter.PY_KEYWORD_ARGUMENT), new AttributesDescriptor("Valid escape sequence", PyHighlighter.PY_VALID_STRING_ESCAPE), new AttributesDescriptor("Invalid escape sequence", PyHighlighter.PY_INVALID_STRING_ESCAPE), }; @@ -59,6 +60,7 @@ public class PythonColorsPage implements ColorSettingsPage, InspectionColorSetti .put("builtin", PyHighlighter.PY_BUILTIN_NAME) .put("self", PyHighlighter.PY_SELF_PARAMETER) .put("param", PyHighlighter.PY_PARAMETER) + .put("kwarg", PyHighlighter.PY_KEYWORD_ARGUMENT) .build(); @NotNull @@ -99,9 +101,9 @@ public class PythonColorsPage implements ColorSettingsPage, InspectionColorSetti "\n"+ "class Foo:\n"+ " def __init__(self):\n" + - " self.sense = None\n" + " byte_string = 'newline:\\n also newline:\\x0a'\n" + " text_string = u\"Cyrillic \u042f is \\u042f. Oops: \\u042g\"\n"+ + " self.makeSense(whatever=1)\n" + " \n" + " def makeSense(self, whatever):\n"+ " self.sense = whatever\n"+ diff --git a/python/src/com/jetbrains/python/psi/impl/PyKeywordArgumentImpl.java b/python/src/com/jetbrains/python/psi/impl/PyKeywordArgumentImpl.java index c1e05dc0f364..02cba3fe8e95 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyKeywordArgumentImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyKeywordArgumentImpl.java @@ -6,10 +6,7 @@ import com.intellij.psi.PsiReference; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.IncorrectOperationException; import com.jetbrains.python.PyTokenTypes; -import com.jetbrains.python.psi.LanguageLevel; -import com.jetbrains.python.psi.PyElementGenerator; -import com.jetbrains.python.psi.PyExpression; -import com.jetbrains.python.psi.PyKeywordArgument; +import com.jetbrains.python.psi.*; import com.jetbrains.python.psi.types.PyType; import com.jetbrains.python.psi.types.TypeEvalContext; import org.jetbrains.annotations.NonNls; @@ -73,4 +70,9 @@ public class PyKeywordArgumentImpl extends PyElementImpl implements PyKeywordArg getNode().replaceChild(getKeywordNode(), keywordArgument.getKeywordNode()); return this; } + + @Override + protected void acceptPyVisitor(PyElementVisitor pyVisitor) { + pyVisitor.visitPyKeywordArgument(this); + } } diff --git a/python/src/com/jetbrains/python/validation/HighlightingAnnotator.java b/python/src/com/jetbrains/python/validation/HighlightingAnnotator.java index 9b66ae61d5f1..3e665a2e6be8 100644 --- a/python/src/com/jetbrains/python/validation/HighlightingAnnotator.java +++ b/python/src/com/jetbrains/python/validation/HighlightingAnnotator.java @@ -1,5 +1,6 @@ package com.jetbrains.python.validation; +import com.intellij.lang.ASTNode; import com.intellij.lang.annotation.Annotation; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.ArrayUtil; @@ -36,6 +37,15 @@ public class HighlightingAnnotator extends PyAnnotator { } } + @Override + public void visitPyKeywordArgument(PyKeywordArgument node) { + ASTNode keywordNode = node.getKeywordNode(); + if (keywordNode != null) { + Annotation annotation = getHolder().createInfoAnnotation(keywordNode, null); + annotation.setTextAttributes(PyHighlighter.PY_KEYWORD_ARGUMENT); + } + } + private static boolean isSelf(PyParameter node, PyFunction function) { final PyNamedParameter named = node.getAsNamed(); if (named != null) {