
This PR broadens the highlighting for docstrings in Python. Previously, only the first docstring for e.g. type aliases was highlighted in Python files. This happened as only the first occurrence in the module was considered a docstring. With this change, now all existing docstrings are actually highlighted as such. | `main` | This PR | | --- | --- | |  |  | Release Notes: - Added more docstring highlights for Python.
298 lines
5.8 KiB
Scheme
298 lines
5.8 KiB
Scheme
; Identifier naming conventions; these "soft conventions" should stay at the top of the file as they're often overridden
|
|
(identifier) @variable
|
|
(attribute attribute: (identifier) @property)
|
|
|
|
; CamelCase for classes
|
|
((identifier) @type.class
|
|
(#match? @type.class "^_*[A-Z][A-Za-z0-9_]*$"))
|
|
|
|
; ALL_CAPS for constants:
|
|
((identifier) @constant
|
|
(#match? @constant "^_*[A-Z][A-Z0-9_]*$"))
|
|
|
|
(type (identifier) @type)
|
|
(generic_type (identifier) @type)
|
|
(comment) @comment
|
|
(string) @string
|
|
(escape_sequence) @string.escape
|
|
|
|
; Type alias
|
|
(type_alias_statement "type" @keyword)
|
|
|
|
; TypeVar with constraints in type parameters
|
|
(type
|
|
(tuple (identifier) @type)
|
|
)
|
|
|
|
; Forward references
|
|
(type
|
|
(string) @type
|
|
)
|
|
|
|
|
|
; Function calls
|
|
|
|
(call
|
|
function: (attribute attribute: (identifier) @function.method.call))
|
|
(call
|
|
function: (identifier) @function.call)
|
|
|
|
(decorator "@" @punctuation.special)
|
|
(decorator
|
|
"@" @punctuation.special
|
|
[
|
|
(identifier) @function.decorator
|
|
(attribute attribute: (identifier) @function.decorator)
|
|
(call function: (identifier) @function.decorator.call)
|
|
(call (attribute attribute: (identifier) @function.decorator.call))
|
|
])
|
|
|
|
; Function and class definitions
|
|
|
|
(function_definition
|
|
name: (identifier) @function.definition)
|
|
|
|
((call
|
|
function: (identifier) @_isinstance
|
|
arguments: (argument_list
|
|
(_)
|
|
(identifier) @type))
|
|
(#eq? @_isinstance "isinstance"))
|
|
|
|
((call
|
|
function: (identifier) @_issubclass
|
|
arguments: (argument_list
|
|
(identifier) @type
|
|
(identifier) @type))
|
|
(#eq? @_issubclass "issubclass"))
|
|
|
|
; Function arguments
|
|
(function_definition
|
|
parameters: (parameters
|
|
[
|
|
(identifier) @variable.parameter; Simple parameters
|
|
(typed_parameter
|
|
(identifier) @variable.parameter) ; Typed parameters
|
|
(default_parameter
|
|
name: (identifier) @variable.parameter) ; Default parameters
|
|
(typed_default_parameter
|
|
name: (identifier) @variable.parameter) ; Typed default parameters
|
|
]))
|
|
|
|
; Keyword arguments
|
|
(call
|
|
arguments: (argument_list
|
|
(keyword_argument
|
|
name: (identifier) @function.kwargs)))
|
|
|
|
; Class definitions and calling: needs to come after the regex matching above
|
|
|
|
(class_definition
|
|
name: (identifier) @type.class.definition)
|
|
|
|
(class_definition
|
|
superclasses: (argument_list
|
|
(identifier) @type.class.inheritance))
|
|
|
|
(call
|
|
function: (identifier) @type.class.call
|
|
(#match? @type.class.call "^_*[A-Z][A-Za-z0-9_]*$"))
|
|
|
|
; Builtins
|
|
|
|
((call
|
|
function: (identifier) @function.builtin)
|
|
(#any-of?
|
|
@function.builtin
|
|
"abs" "all" "any" "ascii" "bin" "bool" "breakpoint" "bytearray" "bytes" "callable" "chr" "classmethod" "compile" "complex" "delattr" "dict" "dir" "divmod" "enumerate" "eval" "exec" "filter" "float" "format" "frozenset" "getattr" "globals" "hasattr" "hash" "help" "hex" "id" "input" "int" "isinstance" "issubclass" "iter" "len" "list" "locals" "map" "max" "memoryview" "min" "next" "object" "oct" "open" "ord" "pow" "print" "property" "range" "repr" "reversed" "round" "set" "setattr" "slice" "sorted" "staticmethod" "str" "sum" "super" "tuple" "type" "vars" "zip" "__import__"))
|
|
|
|
; Literals
|
|
|
|
[
|
|
(true)
|
|
(false)
|
|
] @boolean
|
|
|
|
[
|
|
(none)
|
|
(ellipsis)
|
|
] @constant.builtin
|
|
|
|
[
|
|
(integer)
|
|
(float)
|
|
] @number
|
|
|
|
; Self references
|
|
|
|
[
|
|
(parameters (identifier) @variable.special)
|
|
(attribute (identifier) @variable.special)
|
|
(#any-of? @variable.special "self" "cls")
|
|
]
|
|
|
|
[
|
|
"."
|
|
","
|
|
":"
|
|
] @punctuation.delimiter
|
|
|
|
[
|
|
"("
|
|
")"
|
|
"["
|
|
"]"
|
|
"{"
|
|
"}"
|
|
] @punctuation.bracket
|
|
|
|
(interpolation
|
|
"{" @punctuation.special
|
|
"}" @punctuation.special) @embedded
|
|
|
|
; Docstrings.
|
|
([
|
|
(expression_statement (assignment))
|
|
(type_alias_statement)
|
|
]
|
|
. (expression_statement (string) @string.doc)+)
|
|
|
|
(module
|
|
.(expression_statement (string) @string.doc)+)
|
|
|
|
(class_definition
|
|
body: (block .(expression_statement (string) @string.doc)+))
|
|
|
|
(function_definition
|
|
"async"?
|
|
"def"
|
|
name: (_)
|
|
(parameters)?
|
|
body: (block .(expression_statement (string) @string.doc)+))
|
|
|
|
(class_definition
|
|
body: (block
|
|
. (comment) @comment*
|
|
. (expression_statement (string) @string.doc)+))
|
|
|
|
(module
|
|
. (comment) @comment*
|
|
. (expression_statement (string) @string.doc)+)
|
|
|
|
(class_definition
|
|
body: (block
|
|
(expression_statement (assignment))
|
|
. (expression_statement (string) @string.doc)+))
|
|
|
|
(class_definition
|
|
body: (block
|
|
(function_definition
|
|
name: (identifier) @function.method.constructor
|
|
(#eq? @function.method.constructor "__init__")
|
|
body: (block
|
|
(expression_statement (assignment))
|
|
. (expression_statement (string) @string.doc)+))))
|
|
|
|
|
|
[
|
|
"-"
|
|
"-="
|
|
"!="
|
|
"*"
|
|
"**"
|
|
"**="
|
|
"*="
|
|
"/"
|
|
"//"
|
|
"//="
|
|
"/="
|
|
"&"
|
|
"%"
|
|
"%="
|
|
"@"
|
|
"^"
|
|
"+"
|
|
"->"
|
|
"+="
|
|
"<"
|
|
"<<"
|
|
"<="
|
|
"<>"
|
|
"="
|
|
":="
|
|
"=="
|
|
">"
|
|
">="
|
|
">>"
|
|
"|"
|
|
"~"
|
|
] @operator
|
|
|
|
[
|
|
"and"
|
|
"in"
|
|
"is"
|
|
"not"
|
|
"or"
|
|
"is not"
|
|
"not in"
|
|
] @keyword.operator
|
|
|
|
[
|
|
"as"
|
|
"assert"
|
|
"async"
|
|
"await"
|
|
"break"
|
|
"class"
|
|
"continue"
|
|
"def"
|
|
"del"
|
|
"elif"
|
|
"else"
|
|
"except"
|
|
"except*"
|
|
"exec"
|
|
"finally"
|
|
"for"
|
|
"from"
|
|
"global"
|
|
"if"
|
|
"import"
|
|
"lambda"
|
|
"nonlocal"
|
|
"pass"
|
|
"print"
|
|
"raise"
|
|
"return"
|
|
"try"
|
|
"while"
|
|
"with"
|
|
"yield"
|
|
"match"
|
|
"case"
|
|
] @keyword
|
|
|
|
; Definition keywords def, class, async def, lambda
|
|
[
|
|
"async"
|
|
"def"
|
|
"class"
|
|
"lambda"
|
|
] @keyword.definition
|
|
|
|
(decorator (identifier) @attribute.builtin
|
|
(#any-of? @attribute.builtin "classmethod" "staticmethod" "property"))
|
|
|
|
; Builtin types as identifiers
|
|
[
|
|
(call
|
|
function: (identifier) @type.builtin)
|
|
(type (identifier) @type.builtin)
|
|
(generic_type (identifier) @type.builtin)
|
|
; also check if type binary operator left identifier for union types
|
|
(type
|
|
(binary_operator
|
|
left: (identifier) @type.builtin))
|
|
(#any-of? @type.builtin "bool" "bytearray" "bytes" "complex" "dict" "float" "frozenset" "int" "list" "memoryview" "object" "range" "set" "slice" "str" "tuple")
|
|
]
|