aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lisp/progmodes/cmake-ts-mode.el182
1 files changed, 99 insertions, 83 deletions
diff --git a/lisp/progmodes/cmake-ts-mode.el b/lisp/progmodes/cmake-ts-mode.el
index 84589b1eb73..8e49b18f731 100644
--- a/lisp/progmodes/cmake-ts-mode.el
+++ b/lisp/progmodes/cmake-ts-mode.el
@@ -61,28 +61,36 @@
61 table) 61 table)
62 "Syntax table for `cmake-ts-mode'.") 62 "Syntax table for `cmake-ts-mode'.")
63 63
64(defvar cmake-ts-mode--indent-rules 64(defvar cmake-ts-mode--indent-rules nil
65 `((cmake
66 ((node-is ")") parent-bol 0)
67 ((node-is "else_command") parent-bol 0)
68 ((node-is "elseif_command") parent-bol 0)
69 ((node-is "endforeach_command") parent-bol 0)
70 ((node-is "endfunction_command") parent-bol 0)
71 ((node-is "endif_command") parent-bol 0)
72 ((parent-is "foreach_loop") parent-bol cmake-ts-mode-indent-offset)
73 ((parent-is "function_def") parent-bol cmake-ts-mode-indent-offset)
74 ((parent-is "if_condition") parent-bol cmake-ts-mode-indent-offset)
75 ((parent-is "normal_command") parent-bol cmake-ts-mode-indent-offset)
76 ;;; Release v0.4.0 wraps arguments in an argument_list node.
77 ,@(ignore-errors
78 (treesit-query-capture 'cmake '((argument_list) @capture))
79 `(((parent-is "argument_list") grand-parent cmake-ts-mode-indent-offset)))
80 ;;; Release v0.3.0 wraps the body of commands into a body node.
81 ,@(ignore-errors
82 (treesit-query-capture 'cmake '((body) @capture))
83 `(((parent-is "body") grand-parent cmake-ts-mode-indent-offset)))))
84 "Tree-sitter indent rules for `cmake-ts-mode'.") 65 "Tree-sitter indent rules for `cmake-ts-mode'.")
85 66
67(defun cmake-ts-mode--indent-rules ()
68 "Return tree-sitter indent rules for `cmake-ts-mode'.
69
70Tree-sitter indent rules are evaluated the first time this function
71is called. Subsequent calls return the first evaluated value."
72 (or cmake-ts-mode--indent-rules
73 (setq cmake-ts-mode--indent-rules
74 `((cmake
75 ((node-is ")") parent-bol 0)
76 ((node-is "else_command") parent-bol 0)
77 ((node-is "elseif_command") parent-bol 0)
78 ((node-is "endforeach_command") parent-bol 0)
79 ((node-is "endfunction_command") parent-bol 0)
80 ((node-is "endif_command") parent-bol 0)
81 ((parent-is "foreach_loop") parent-bol cmake-ts-mode-indent-offset)
82 ((parent-is "function_def") parent-bol cmake-ts-mode-indent-offset)
83 ((parent-is "if_condition") parent-bol cmake-ts-mode-indent-offset)
84 ((parent-is "normal_command") parent-bol cmake-ts-mode-indent-offset)
85 ;; Release v0.4.0 wraps arguments in an argument_list node.
86 ,@(ignore-errors
87 (treesit-query-capture 'cmake '((argument_list) @capture))
88 `(((parent-is "argument_list") grand-parent cmake-ts-mode-indent-offset)))
89 ;; Release v0.3.0 wraps the body of commands into a body node.
90 ,@(ignore-errors
91 (treesit-query-capture 'cmake '((body) @capture))
92 `(((parent-is "body") grand-parent cmake-ts-mode-indent-offset))))))))
93
86(defvar cmake-ts-mode--constants 94(defvar cmake-ts-mode--constants
87 '("ON" "TRUE" "YES" "Y" "OFF" "FALSE" "NO" "N" "IGNORE" "NOTFOUND") 95 '("ON" "TRUE" "YES" "Y" "OFF" "FALSE" "NO" "N" "IGNORE" "NOTFOUND")
88 "CMake constants for tree-sitter font-locking.") 96 "CMake constants for tree-sitter font-locking.")
@@ -140,69 +148,77 @@ Check if a node type is available, then return the right font lock rules."
140 eol)) 148 eol))
141 @font-lock-constant-face)))))))) 149 @font-lock-constant-face))))))))
142 150
143(defvar cmake-ts-mode--font-lock-settings 151(defvar cmake-ts-mode--font-lock-settings nil
144 (treesit-font-lock-rules
145 :language 'cmake
146 :feature 'bracket
147 '((["(" ")"]) @font-lock-bracket-face)
148
149 :language 'cmake
150 :feature 'builtin
151 (cmake-ts-mode--font-lock-compatibility-fe9b5e0)
152
153 :language 'cmake
154 :feature 'comment
155 '([(bracket_comment) (line_comment)] @font-lock-comment-face)
156
157 :language 'cmake
158 :feature 'constant
159 `(((argument) @font-lock-constant-face
160 (:match ,(rx-to-string
161 `(seq bol
162 (or ,@cmake-ts-mode--constants)
163 eol))
164 @font-lock-constant-face)))
165
166 :language 'cmake
167 :feature 'function
168 '((normal_command (identifier) @font-lock-function-call-face))
169
170 :language 'cmake
171 :feature 'keyword
172 `([,@cmake-ts-mode--keywords] @font-lock-keyword-face)
173
174 :language 'cmake
175 :feature 'number
176 '(((unquoted_argument) @font-lock-number-face
177 (:match "\\`-?[[:digit:]]*\\.?[[:digit:]]*\\.?[[:digit:]]+\\'"
178 @font-lock-number-face)))
179
180 :language 'cmake
181 :feature 'string
182 '([(bracket_argument) (quoted_argument)] @font-lock-string-face)
183
184 :language 'cmake
185 :feature 'escape-sequence
186 :override t
187 '((escape_sequence) @font-lock-escape-face)
188
189 :language 'cmake
190 :feature 'misc-punctuation
191 ;; Don't override strings.
192 :override 'nil
193 '((["$" "{" "}"]) @font-lock-misc-punctuation-face)
194
195 :language 'cmake
196 :feature 'variable
197 :override t
198 '((variable) @font-lock-variable-use-face)
199
200 :language 'cmake
201 :feature 'error
202 :override t
203 '((ERROR) @font-lock-warning-face))
204 "Tree-sitter font-lock settings for `cmake-ts-mode'.") 152 "Tree-sitter font-lock settings for `cmake-ts-mode'.")
205 153
154(defun cmake-ts-mode--font-lock-settings ()
155 "Return tree-sitter font-lock settings for `cmake-ts-mode'.
156
157Tree-sitter font-lock rules are evaluated the first time this function
158is called. Subsequent calls return the first evaluated value."
159 (or cmake-ts-mode--font-lock-settings
160 (setq cmake-ts-mode--font-lock-settings
161 (treesit-font-lock-rules
162 :language 'cmake
163 :feature 'bracket
164 '((["(" ")"]) @font-lock-bracket-face)
165
166 :language 'cmake
167 :feature 'builtin
168 (cmake-ts-mode--font-lock-compatibility-fe9b5e0)
169
170 :language 'cmake
171 :feature 'comment
172 '([(bracket_comment) (line_comment)] @font-lock-comment-face)
173
174 :language 'cmake
175 :feature 'constant
176 `(((argument) @font-lock-constant-face
177 (:match ,(rx-to-string
178 `(seq bol
179 (or ,@cmake-ts-mode--constants)
180 eol))
181 @font-lock-constant-face)))
182
183 :language 'cmake
184 :feature 'function
185 '((normal_command (identifier) @font-lock-function-call-face))
186
187 :language 'cmake
188 :feature 'keyword
189 `([,@cmake-ts-mode--keywords] @font-lock-keyword-face)
190
191 :language 'cmake
192 :feature 'number
193 '(((unquoted_argument) @font-lock-number-face
194 (:match "\\`-?[[:digit:]]*\\.?[[:digit:]]*\\.?[[:digit:]]+\\'"
195 @font-lock-number-face)))
196
197 :language 'cmake
198 :feature 'string
199 '([(bracket_argument) (quoted_argument)] @font-lock-string-face)
200
201 :language 'cmake
202 :feature 'escape-sequence
203 :override t
204 '((escape_sequence) @font-lock-escape-face)
205
206 :language 'cmake
207 :feature 'misc-punctuation
208 ;; Don't override strings.
209 :override 'nil
210 '((["$" "{" "}"]) @font-lock-misc-punctuation-face)
211
212 :language 'cmake
213 :feature 'variable
214 :override t
215 '((variable) @font-lock-variable-use-face)
216
217 :language 'cmake
218 :feature 'error
219 :override t
220 '((ERROR) @font-lock-warning-face)))))
221
206(defun cmake-ts-mode--defun-name (node) 222(defun cmake-ts-mode--defun-name (node)
207 "Return the defun name of NODE. 223 "Return the defun name of NODE.
208Return nil if there is no name or if NODE is not a defun node." 224Return nil if there is no name or if NODE is not a defun node."
@@ -238,10 +254,10 @@ Return nil if there is no name or if NODE is not a defun node."
238 (setq-local which-func-functions nil) 254 (setq-local which-func-functions nil)
239 255
240 ;; Indent. 256 ;; Indent.
241 (setq-local treesit-simple-indent-rules cmake-ts-mode--indent-rules) 257 (setq-local treesit-simple-indent-rules (cmake-ts-mode--indent-rules))
242 258
243 ;; Font-lock. 259 ;; Font-lock.
244 (setq-local treesit-font-lock-settings cmake-ts-mode--font-lock-settings) 260 (setq-local treesit-font-lock-settings (cmake-ts-mode--font-lock-settings))
245 (setq-local treesit-font-lock-feature-list 261 (setq-local treesit-font-lock-feature-list
246 '((comment) 262 '((comment)
247 (keyword string) 263 (keyword string)