From 4835c9913b2183af6003007f8eee2cd0ab4e697d Mon Sep 17 00:00:00 2001 From: john muhl Date: Tue, 14 Nov 2023 16:25:43 -0600 Subject: [PATCH] Improve font-locking in lua-ts-mode (bug#67554) * lisp/progmodes/lua-ts-mode.el (lua-ts-mode): Move property highlighting to level 4. (lua-ts--keywords): Remove `true', `false' and `nil' from keywords. (lua-ts--font-lock-settings): Highlight assignments, functions and labels in more places. Distinguish comment delimiters. (lua-ts--comment-font-lock): New function. --- lisp/progmodes/lua-ts-mode.el | 151 ++++++++++++++++++---------------- 1 file changed, 79 insertions(+), 72 deletions(-) diff --git a/lisp/progmodes/lua-ts-mode.el b/lisp/progmodes/lua-ts-mode.el index a910d759c83..7dd05b2757f 100644 --- a/lisp/progmodes/lua-ts-mode.el +++ b/lisp/progmodes/lua-ts-mode.el @@ -133,135 +133,141 @@ "Lua built-in functions for tree-sitter font-locking.") (defvar lua-ts--keywords - '("and" "do" "else" "elseif" "end" "for" "function" - "goto" "if" "in" "local" "not" "or" "repeat" - "return" "then" "until" "while") + '("and" "do" "else" "elseif" "end" "for" "function" "goto" "if" + "in" "local" "not" "or" "repeat" "return" "then" "until" "while") "Lua keywords for tree-sitter font-locking and navigation.") +(defun lua-ts--comment-font-lock (node override start end &rest _) + "Apply font lock to comment NODE within START and END. +Applies `font-lock-comment-delimiter-face' and +`font-lock-comment-face' See `treesit-fontify-with-override' for +values of OVERRIDE." + (let* ((node-start (treesit-node-start node)) + (node-end (treesit-node-end node)) + (node-text (treesit-node-text node t)) + (delimiter-end (+ 2 node-start))) + (when (and (>= node-start start) + (<= delimiter-end end) + (string-match "\\`--" node-text)) + (treesit-fontify-with-override node-start + delimiter-end + font-lock-comment-delimiter-face + override)) + (treesit-fontify-with-override (max delimiter-end start) + (min node-end end) + font-lock-comment-face + override))) + (defvar lua-ts--font-lock-settings (treesit-font-lock-rules - :language 'lua + :default-language 'lua :feature 'bracket '(["(" ")" "[" "]" "{" "}"] @font-lock-bracket-face) - :language 'lua :feature 'delimiter '(["," ";"] @font-lock-delimiter-face) - :language 'lua :feature 'constant - '((variable_list - attribute: (attribute (["<" ">"] (identifier)))) - @font-lock-constant-face - (goto_statement (identifier) @font-lock-constant-face) - (label_statement) @font-lock-constant-face) + '([(variable_list + attribute: (attribute (["<" ">"] (identifier)))) + (label_statement) + (true) (false) (nil)] + @font-lock-constant-face) - :language 'lua :feature 'operator - '(["and" "not" "or" "+" "-" "*" "/" "%" "^" - "#" "==" "~=" "<=" ">=" "<" ">" "=" "&" - "~" "|" "<<" ">>" "//" ".."] - @font-lock-operator-face - (vararg_expression) @font-lock-operator-face) + '(["+" "-" "*" "/" "%" "^" "#" "==" "~=" "<=" ">=" + "<" ">" "=" "&" "~" "|" "<<" ">>" "//" ".." + (vararg_expression)] + @font-lock-operator-face) - :language 'lua :feature 'builtin `(((identifier) @font-lock-builtin-face (:match ,(regexp-opt lua-ts--builtins 'symbols) @font-lock-builtin-face))) - :language 'lua :feature 'function '((function_call name: (identifier) @font-lock-function-call-face) (function_call - name: (method_index_expression - method: (identifier) @font-lock-function-call-face)) + (method_index_expression + method: (identifier) @font-lock-function-call-face)) (function_call - name: (dot_index_expression (identifier) @font-lock-function-call-face))) + (dot_index_expression + field: (identifier) @font-lock-function-call-face))) - :language 'lua :feature 'punctuation '(["." ":"] @font-lock-punctuation-face) - :language 'lua :feature 'variable '((function_call - arguments: (arguments (identifier)) - @font-lock-variable-use-face) + (arguments (identifier) @font-lock-variable-use-face)) (function_call - name: (method_index_expression - table: (identifier) @font-lock-variable-use-face))) + (arguments + (binary_expression (identifier) @font-lock-variable-use-face))) + (function_call + (arguments + (bracket_index_expression (identifier) @font-lock-variable-use-face))) + (function_declaration + (parameters name: (identifier) @font-lock-variable-name-face))) - :language 'lua :feature 'number '((number) @font-lock-number-face) - :language 'lua :feature 'keyword - `((break_statement) @font-lock-keyword-face - (true) @font-lock-constant-face - (false) @font-lock-constant-face - (nil) @font-lock-constant-face - ,(vconcat lua-ts--keywords) - @font-lock-keyword-face) - - :language 'lua + `([(break_statement) + ,(vconcat lua-ts--keywords)] + @font-lock-keyword-face + (goto_statement ((identifier) @font-lock-constant-face))) + :feature 'string '((string) @font-lock-string-face) - :language 'lua :feature 'escape :override t '((escape_sequence) @font-lock-escape-face) - :language 'lua :feature 'comment - '((comment) @font-lock-comment-face + '((comment) @lua-ts--comment-font-lock (hash_bang_line) @font-lock-comment-face) - :language 'lua :feature 'definition '((function_declaration - name: (identifier) @font-lock-function-name-face) - (assignment_statement - (variable_list name: [(identifier)]) @font-lock-function-name-face - (expression_list value: (function_definition))) - (table_constructor - (field - name: (identifier) @font-lock-function-name-face - value: (function_definition))) - (function_declaration - name: (dot_index_expression (identifier) @font-lock-function-name-face)) + (identifier) @font-lock-function-name-face) (function_declaration - name: (method_index_expression (identifier) @font-lock-function-name-face)) + (dot_index_expression + field: (identifier) @font-lock-function-name-face)) (function_declaration (method_index_expression + method: (identifier) @font-lock-function-name-face)) + (assignment_statement + (variable_list + (identifier) @font-lock-function-name-face) + (expression_list value: (function_definition))) + (field + name: (identifier) @font-lock-function-name-face + value: (function_definition)) + (assignment_statement + (variable_list (dot_index_expression - table: (identifier) @font-lock-function-name-face - field: (identifier) @font-lock-property-name-face - ))) - (parameters - name: (identifier) @font-lock-variable-name-face) + field: (identifier) @font-lock-function-name-face)) + (expression_list + value: + (function_definition)))) + + :feature 'assignment + '((variable_list (identifier) @font-lock-variable-name-face) + (variable_list + (bracket_index_expression + field: (identifier) @font-lock-variable-name-face)) + (variable_list + (dot_index_expression + field: (identifier) @font-lock-variable-name-face)) (for_numeric_clause name: (identifier) @font-lock-variable-name-face)) - :language 'lua :feature 'property '((field name: (identifier) @font-lock-property-name-face) (dot_index_expression field: (identifier) @font-lock-property-use-face)) - :language 'lua - :feature 'assignment - '((variable_list - [(identifier) - (bracket_index_expression)] - @font-lock-variable-name-face) - (variable_list - (dot_index_expression - table: (identifier)) - @font-lock-variable-name-face)) - - :language 'lua :feature 'error :override t '((ERROR) @font-lock-warning-face)) @@ -665,13 +671,14 @@ Calls REPORT-FN directly." (setq-local treesit-font-lock-settings lua-ts--font-lock-settings) (setq-local treesit-font-lock-feature-list '((comment definition) - (keyword property string) + (keyword string) (assignment builtin constant number) (bracket delimiter escape function operator + property punctuation variable))) -- 2.39.2