diff --git a/python/psi-api/src/com/jetbrains/python/PyTokenTypes.java b/python/psi-api/src/com/jetbrains/python/PyTokenTypes.java index 0e93006168e1..63b80160a75b 100644 --- a/python/psi-api/src/com/jetbrains/python/PyTokenTypes.java +++ b/python/psi-api/src/com/jetbrains/python/PyTokenTypes.java @@ -169,6 +169,7 @@ public class PyTokenTypes { public static final TokenSet NUMERIC_LITERALS = TokenSet.create(FLOAT_LITERAL, INTEGER_LITERAL, IMAGINARY_LITERAL); public static final TokenSet BOOL_LITERALS = TokenSet.create(TRUE_KEYWORD, FALSE_KEYWORD); public static final TokenSet SCALAR_LITERALS = TokenSet.orSet(BOOL_LITERALS, NUMERIC_LITERALS, TokenSet.create(NONE_KEYWORD)); + public static final TokenSet EXPRESSION_KEYWORDS = TokenSet.create(TRUE_KEYWORD, FALSE_KEYWORD, NONE_KEYWORD); public static final TokenSet AUG_ASSIGN_OPERATIONS = TokenSet.create(PLUSEQ, MINUSEQ, MULTEQ, ATEQ, DIVEQ, PERCEQ, EXPEQ, GTGTEQ, LTLTEQ, ANDEQ, OREQ, XOREQ, FLOORDIVEQ); diff --git a/python/src/com/jetbrains/python/validation/HighlightingAnnotator.java b/python/src/com/jetbrains/python/validation/HighlightingAnnotator.java index 488d27ac6859..1dadf823d2ca 100644 --- a/python/src/com/jetbrains/python/validation/HighlightingAnnotator.java +++ b/python/src/com/jetbrains/python/validation/HighlightingAnnotator.java @@ -17,7 +17,9 @@ package com.jetbrains.python.validation; import com.intellij.lang.ASTNode; import com.intellij.openapi.editor.colors.TextAttributesKey; +import com.intellij.psi.PsiElement; import com.intellij.psi.util.PsiTreeUtil; +import com.jetbrains.python.PyTokenTypes; import com.jetbrains.python.highlighting.PyHighlighter; import com.jetbrains.python.psi.*; @@ -78,4 +80,14 @@ public class HighlightingAnnotator extends PyAnnotator { addHighlightingAnnotation(value, PyHighlighter.PY_ANNOTATION); } } + + @Override + public void visitElement(PsiElement element) { + // Highlight None, True and False as keywords once again inside annotations after PyHighlighter + // to keep their original color + if (PyTokenTypes.EXPRESSION_KEYWORDS.contains(element.getNode().getElementType()) && + PsiTreeUtil.getParentOfType(element, PyAnnotation.class) != null) { + addHighlightingAnnotation(element, PyHighlighter.PY_KEYWORD); + } + } } diff --git a/python/testData/highlighting/annotations.py b/python/testData/highlighting/annotations.py index 9fa0e365b05d..b2fa48600ae5 100644 --- a/python/testData/highlighting/annotations.py +++ b/python/testData/highlighting/annotations.py @@ -2,5 +2,5 @@ TOP_LEVEL: str< class C: attr: Optional[Any] = None - def method(self, xs: List[int]) -> None: + def method(self, xs: List[int]) -> None: pass