nvim-treesitter/runtime/queries/gdshader/highlights.scm
Tayfun Bocek 225e074a1a refactor(gdshader): use uniform scope node instead of literal matching
This avoids the need to refactor if other scope types are added. Maybe
helps performance as well.
2025-11-26 16:48:31 +03:00

265 lines
6 KiB
Scheme

[
"group_uniforms"
"uniform"
"const"
"varying"
"discard"
"render_mode"
"shader_type"
] @keyword
(scope) @keyword
[
"if"
"else"
"switch"
"case"
"default"
] @keyword.conditional
"struct" @keyword.type
"return" @keyword.return
[
(parameter_qualifier)
(interpolation_specifier)
(precision_specifier)
] @keyword
[
"while"
"for"
"do"
"continue"
"break"
] @keyword.repeat
[
"#undef"
"#include"
"#if"
"#ifdef"
"#ifndef"
"#elif"
"#else"
"#endif"
] @keyword.directive
"#define" @keyword.directive.define
[
";"
"."
":"
","
] @punctuation.delimiter
[
"("
")"
"["
"]"
"{"
"}"
] @punctuation.bracket
[
"="
"-"
"*"
"/"
"+"
"%"
"~"
"|"
"&"
"^"
"<<"
">>"
"<"
"<="
">="
">"
"=="
"!="
"!"
"&&"
"||"
"-="
"+="
"*="
"/="
"%="
"|="
"&="
"^="
">>="
"<<="
"--"
"++"
] @operator
(comma_expression
operator: "," @operator)
(ternary_expression
[
":"
"?"
]) @keyword.conditional.ternary
(primitive_type) @type.builtin
(type_identifier) @type
(integer) @number
(float) @number.float
(boolean) @boolean
(case_statement
value: (identifier) @constant)
(shader_type_statement
(shader_type) @keyword
(#any-of? @keyword "spatial" "canvas_item" "particle" "sky" "fog"))
; spatial
(source_file
(shader_type_statement
(shader_type) @_shader_type)
(#eq? @_shader_type "spatial")
(render_mode_statement
(render_mode) @keyword)
(#any-of? @keyword
"blend_mix" "blend_add" "blend_sub" "blend_mul" "blend_premul_alpha" "depth_draw_opaque"
"depth_draw_always" "depth_draw_never" "depth_prepass_alpha" "depth_test_disabled"
"sss_mode_skin" "cull_back" "cull_front" "cull_disabled" "unshaded" "wireframe"
"debug_shadow_splits" "diffuse_burley" "diffuse_lambert" "diffuse_lambert_wrap" "diffuse_toon"
"specular_schlick_ggx" "specular_toon" "specular_disabled" "skip_vertex_transform"
"world_vertex_coords" "ensure_correct_normals" "shadows_disabled" "ambient_light_disabled"
"shadow_to_opacity" "vertex_lighting" "particle_trails" "alpha_to_coverage"
"alpha_to_coverage_and_one" "fog_disabled"))
; canvas_item
(source_file
(shader_type_statement
(shader_type) @_shader_type)
(#eq? @_shader_type "canvas_item")
(render_mode_statement
(render_mode) @keyword)
(#any-of? @keyword
"blend_mix" "blend_add" "blend_sub" "blend_mul" "blend_premul_alpha" "blend_disabled" "unshaded"
"light_only" "skip_vertex_transform" "world_vertex_coords"))
; particle
(source_file
(shader_type_statement
(shader_type) @_shader_type)
(#eq? @_shader_type "particle")
(render_mode_statement
(render_mode) @keyword)
(#any-of? @keyword "keep_data" "disable_force" "disable_velocity" "collision_use_scale"))
; sky
(source_file
(shader_type_statement
(shader_type) @_shader_type)
(#eq? @_shader_type "sky")
(render_mode_statement
(render_mode) @keyword)
(#any-of? @keyword "use_half_res_pass" "use_quarter_res_pass" "disable_fog"))
; fog has no render modes
(identifier) @variable
(struct_definition
name: (identifier) @type)
(struct_definition
(struct_fields
(field_definition
declarator: [
(identifier) @variable.member
(array_declarator
declarator: (identifier) @variable.member)
])))
(preproc_include
path: (_) @string)
(preproc_undef
argument: (identifier) @constant)
(comment) @comment @spell
; technically an injection site for bbcode TODO: maybe add it?
((comment) @comment.documentation @spell
(#lua-match? @comment.documentation "^/%*%*[^/]"))
(parameter_declaration
declarator: [
(identifier) @variable.parameter
(array_declarator
declarator: (identifier) @variable.parameter)
])
(function_definition
declarator: (identifier) @function)
(call_expression
function: (identifier) @function.call)
(field_expression
field: (_) @property)
((call_expression
function: (identifier) @function.builtin)
(#any-of? @function.builtin
; taken from: https://docs.godotengine.org/en/stable/tutorials/shaders/shader_reference/shader_functions.html
; trigonometric builtins
"radians" "degrees" "sin" "cos" "tan" "asin" "acos" "atan" "sinh" "cosh" "tanh" "asinh" "acosh"
"atanh"
; exponential and math builtins
"pow" "exp" "exp2" "log" "log2" "sqrt" "inversesqrt" "abs" "sign" "floor" "round" "roundEven"
"trunc" "ceil" "fract" "mod" "modf" "min" "max" "clamp" "mix" "fma" "step" "smoothstep" "isnan"
"isinf" "floatBitsToInt" "floatBitsToUint" "intBitsToFloat" "uintBitsToFloat"
; geometric builtins
"length" "distance" "dot" "cross" "normalize" "reflect" "refract" "faceforward" "matrixCompMult"
"outerProduct" "transpose" "determinant" "inverse"
; comparison builtins
"lessThan" "greaterThan" "lessThanEqual" "equal" "notEqual" "any" "all" "not"
; texture builtins
"textureSize" "textureQueryLod" "textureQueryLevels" "texture" "textureProj" "textureLod"
"textureProjLod" "textureGrad" "textureProjGrad" "texelFetch" "textureGather" "dFdx"
"dFdxCoarse" "dFdxFine" "dFdy" "dFdyCoarse" "dFdyFine" "fwidth" "fwidthCoarse" "fwidthFine"
; packing unpacking builtins
"packHalf2x16" "unpackHalf2x16" "packUnorm2x16" "unpackUnorm2x16" "packSnorm2x16"
"unpackSnorm2x16" "packUnorm4x8" "unpackUnorm4x8" "packSnorm4x8" "unpackSnorm4x8"
; bitwise builtins
"bitfieldExtract" "bitfieldInsert" "bitfieldReverse" "bitCount" "findLSB" "findMSB" "imulExtend"
"umulExtend" "uaddCarry" "usubBorrow" "ldexp" "frexp"))
; assume all uppercase variables as constants
((identifier) @constant
(#lua-match? @constant "^[A-Z][A-Z0-9_]+$"))
((identifier) @constant.builtin
(#any-of? @constant.builtin
; common / declared in all shader types
"PI" "E" "TAU" "CURRENT_RENDERER" "RENDERER_COMPATIBILITY" "RENDERER_MOBILE"
"RENDERER_FORWARD_PLUS"; TODO: add more builtins
))
((identifier) @variable.builtin
(#eq? @variable.builtin "TIME"))
(type_hint
[
(identifier) @attribute
(call_expression
function: (_) @attribute)
])