|
6 | 6 | ;;; Commentary: |
7 | 7 |
|
8 | 8 | ;; Internal module to organize all font-lock related functionality. |
| 9 | +;; |
| 10 | +;; Use `treesit-font-lock-level' to determine the amount of detail shown. |
9 | 11 |
|
10 | 12 | ;;; Code: |
11 | 13 |
|
12 | 14 | (require 'treesit) |
13 | 15 |
|
| 16 | +(require 'sdml-ts-mode-query) |
| 17 | + |
14 | 18 | ;; -------------------------------------------------------------------------- |
15 | 19 | ;; Font Lock ❱ Faces |
16 | 20 | ;; -------------------------------------------------------------------------- |
|
20 | 24 | "Face used for SDML line comments." |
21 | 25 | :group 'sdml-ts) |
22 | 26 |
|
| 27 | +(defface sdml-ts-warning-face |
| 28 | + '((t (:inherit font-lock-warning-face :weight normal :slant italic))) |
| 29 | + "Face used for syntax and other warnings." |
| 30 | + :group 'sdml-ts) |
| 31 | + |
| 32 | +(defface sdml-ts-error-face |
| 33 | + '((t (:inherit font-lock-warning-face :underline (:style wave :position t)))) |
| 34 | + "Face used for syntax and other errors." |
| 35 | + :group 'sdml-ts) |
| 36 | + |
23 | 37 | ;; -------------------------------------------------------------------------- |
24 | 38 |
|
25 | 39 | (defface sdml-ts-keyword-face |
|
175 | 189 | ;; -------------------------------------------------------------------------- |
176 | 190 |
|
177 | 191 | (defface sdml-ts-annotation-property-face |
178 | | - '((t (:inherit font-lock-builtin-face :foreground "red3"))) |
| 192 | + '((t (:inherit font-lock-builtin-face :foreground "DarkGoldenrod4"))) |
179 | 193 | "Face used for annotation property assertions in SDML." |
180 | 194 | :group 'sdml-ts) |
181 | 195 |
|
|
185 | 199 | :group 'sdml-ts) |
186 | 200 |
|
187 | 201 | (defface sdml-ts-annotation-constraint-face |
188 | | - '((t (:inherit sdml-ts-annotation-property-face :foreground "red3"))) |
| 202 | + '((t (:inherit sdml-ts-annotation-property-face))) |
189 | 203 | "Face used for annotation constraint names in SDML." |
190 | 204 | :group 'sdml-ts) |
191 | 205 |
|
|
205 | 219 | :group 'sdml-ts) |
206 | 220 |
|
207 | 221 | (defface sdml-ts-variable-face |
208 | | - '((t (:inherit font-variable-use-face))) |
| 222 | + '((t (:inherit font-lock-variable-use-face))) |
209 | 223 | "Face used for variable names in SDML." |
210 | 224 | :group 'sdml-ts) |
211 | 225 |
|
|
241 | 255 | ;; -------------------------------------------------------------------------- |
242 | 256 |
|
243 | 257 | (defface sdml-ts-separator-face |
244 | | - '((t (:inherit font-lock-delimiter-face))) |
| 258 | + '((t (:inherit font-lock-delimiter-face :foreground "DarkSlateGray4"))) |
245 | 259 | "Face used for separator characters and strings in the SDML grammar." |
246 | 260 | :group 'sdml-ts) |
247 | 261 |
|
|
271 | 285 | (treesit-font-lock-rules |
272 | 286 | :feature 'comments |
273 | 287 | :language 'sdml |
274 | | - '((line_comment) @sdml-ts-comment-face) |
| 288 | + `((,sdml-ts-mode-query--any-comment @sdml-ts-comment-face)) |
275 | 289 |
|
276 | 290 | :feature 'global-keywords |
277 | 291 | :language 'sdml |
278 | | - '([ "as" "assert" "class" "datatype" "dimension" "end" "entity" "enum" "event" |
279 | | - "from" "import" "is" "module" "of" "property" "rdf" "structure" "union" |
280 | | - (unknown_type) ] |
281 | | - @sdml-ts-keyword-face) |
| 292 | + `((,sdml-ts-mode-query--global-keywords @sdml-ts-keyword-face) |
| 293 | + (builtin_types |
| 294 | + [ "anyURI" |
| 295 | + "base64Binary" |
| 296 | + "binary" |
| 297 | + "boolean" |
| 298 | + "byte" |
| 299 | + "date" |
| 300 | + "dateTime" |
| 301 | + "dateTimeStamp" |
| 302 | + "dayTimeDuration" |
| 303 | + "decimal" |
| 304 | + "double" |
| 305 | + "duration" |
| 306 | + "float" |
| 307 | + "gDay" |
| 308 | + "gMonth" |
| 309 | + "gMonthDay" |
| 310 | + "gYear" |
| 311 | + "gYearMonth" |
| 312 | + "hexBinary" |
| 313 | + "int" |
| 314 | + "integer" |
| 315 | + "iri" |
| 316 | + "language" |
| 317 | + "long" |
| 318 | + "negativeInteger" |
| 319 | + "nonNegativeInteger" |
| 320 | + "nonPositiveInteger" |
| 321 | + "normalizedString" |
| 322 | + "Nothing" |
| 323 | + "positiveInteger" |
| 324 | + "rational" |
| 325 | + "real" |
| 326 | + "short" |
| 327 | + "string" |
| 328 | + "Thing" |
| 329 | + "time" |
| 330 | + "token" |
| 331 | + "unsigned" |
| 332 | + "unsignedByte" |
| 333 | + "unsignedInt" |
| 334 | + "unsignedLong" |
| 335 | + "unsignedShort" |
| 336 | + "yearMonthDuration" ] |
| 337 | + @sdml-ts-type-builtin-face)) |
282 | 338 |
|
283 | 339 | :feature 'binaries |
284 | 340 | :language 'sdml |
|
320 | 376 |
|
321 | 377 | :feature 'formals |
322 | 378 | :language 'sdml |
323 | | - '((constraint_environment "with" @sdml-ts-keyword-face) |
| 379 | + '((sentence_with_environment [ "with" "for" ] @sdml-ts-keyword-face) |
| 380 | + (keyword_function_def "def" @sdml-ts-keyword-face) |
324 | 381 | (function_signature name: (identifier) @sdml-ts-function-def-face) |
325 | | - (function_signature "def" @sdml-ts-keyword-face) |
326 | | - (function_signature target: (_) @sdml-ts-type-reference-face) |
| 382 | + (function_signature target: (_) @sdml-ts-type-face) |
| 383 | + (function_parameter name: (identifier) @sdml-ts-field-face) |
| 384 | + (function_type_reference (identifier_reference) @sdml-ts-type-face) |
327 | 385 | (cardinality_reference_expression (sequence_ordering) @sdml-ts-keyword-face) |
328 | 386 | (cardinality_reference_expression (sequence_uniqueness) @sdml-ts-keyword-face) |
329 | | - (function_composition subject: (reserved_self) @sdml-ts-constant-builtin-face) |
330 | | - (function_composition name: (identifier) @sdml-ts-function-call-face) |
331 | 387 | (atomic_sentence predicate: (term (identifier_reference) @sdml-ts-function-call-face)) |
| 388 | + (atomic_sentence argument: (term (identifier_reference) @sdml-ts-variable-face)) |
| 389 | + (equation (term (identifier_reference) @sdml-ts-variable-face)) |
| 390 | + (inequation (term (identifier_reference) @sdml-ts-variable-face)) |
| 391 | + (set_expression_sentence (term (identifier_reference) @sdml-ts-variable-face)) |
| 392 | + (arithmetic_expression_sentence (term (identifier_reference) @sdml-ts-variable-face)) |
332 | 393 | (quantified_variable |
333 | 394 | (variable name: (identifier) @sdml-ts-variable-face) |
334 | 395 | ((set_op_is_member) @sdml-ts-operator-logical-face)) |
| 396 | + ;; terms |
335 | 397 | (sequence_builder variable: (variable name: (identifier) @sdml-ts-variable-face)) |
336 | | - ) |
| 398 | + (functional_term |
| 399 | + function: (term (identifier_reference) @sdml-ts-function-call-face)) |
| 400 | + (functional_term |
| 401 | + argument: (term (identifier_reference) @sdml-ts-variable-face)) |
| 402 | + (function_composition subject: (reserved_self) @sdml-ts-constant-builtin-face) |
| 403 | + (function_composition subject: (reserved_event) @sdml-ts-constant-builtin-face) ;; TODO: scope this |
| 404 | + (function_composition subject: (identifier) @sdml-ts-variable-face) |
| 405 | + (function_composition name: (identifier) @sdml-ts-function-call-face) |
| 406 | + (term (reserved_self) @sdml-ts-constant-builtin-face) |
| 407 | + (term (reserved_event) @sdml-ts-constant-builtin-face) |
| 408 | + (reserved_event "event" @sdml-ts-constant-builtin-face)) |
337 | 409 |
|
338 | 410 | :feature 'modules |
339 | 411 | :language 'sdml |
|
342 | 414 | (module_path_absolute segment: (identifier) @sdml-ts-module-face) |
343 | 415 | (module_path_relative segment: (identifier) @sdml-ts-module-face) |
344 | 416 | (member_import name: (qualified_identifier) @sdml-ts-type-face) |
345 | | - (module_import name: (identifier) @sdml-ts-module-face)) |
| 417 | + (member_import rename: (identifier) @sdml-ts-type-face) |
| 418 | + (module_import name: (identifier) @sdml-ts-module-face) |
| 419 | + (module_import rename: (identifier) @sdml-ts-module-face)) |
346 | 420 |
|
347 | 421 | :feature 'facets |
348 | 422 | :language 'sdml |
|
367 | 441 | "with" @sdml-ts-keyword-face |
368 | 442 | member: (identifier) @sdml-ts-member-face) |
369 | 443 | (datatype_def name: (identifier) @sdml-ts-type-def-face) |
370 | | - (datatype_def base: (identifier_reference) @sdml-ts-type-face) |
371 | | - (datatype_def base: (builtin_types) @sdml-ts-builtin-type-face) |
| 444 | + (datatype_base_type_reference (identifier_reference) @sdml-ts-type-face) |
372 | 445 | (datatype_def opaque: (opaque) @sdml-ts-keyword-facet-face) |
373 | 446 | (dimension_def name: (identifier) @sdml-ts-type-def-face) |
374 | 447 | (entity_def name: (identifier) @sdml-ts-type-def-face) |
375 | 448 | (enum_def name: (identifier) @sdml-ts-type-def-face) |
376 | 449 | (event_def name: (identifier) @sdml-ts-type-def-face) |
| 450 | + (event_def name: (identifier) @sdml-ts-type-def-face) |
| 451 | + (event_def name: (identifier) @sdml-ts-type-def-face) |
| 452 | + (function_signature name: (identifier) @sdml-ts-function-def-face) |
| 453 | + (function_signature target: (_) @sdml-ts-type-face) |
| 454 | + (function_parameter name: (identifier) @sdml-ts-field-face) |
| 455 | + (function_type_reference (identifier_reference) @sdml-ts-type-face) |
| 456 | + (cardinality_reference_expression (sequence_ordering) @sdml-ts-keyword-face) |
| 457 | + (cardinality_reference_expression (sequence_uniqueness) @sdml-ts-keyword-face) |
| 458 | + (metric_group_def name: (identifier) @sdml-ts-type-def-face) |
| 459 | + (metric_event_binding "on" @sdml-ts-keyword-face) |
| 460 | + (metric_event_binding (identifier_reference) @sdml-ts-type-face) |
377 | 461 | (rdf_def name: (identifier) @sdml-ts-type-def-face) |
378 | 462 | (rdf_def [ "a" "type" ] @sdml-ts-keyword-facet-face) |
379 | 463 | (rdf_def type: (identifier_reference) @sdml-ts-type-def-face) |
|
387 | 471 |
|
388 | 472 | :feature 'fields |
389 | 473 | :language 'sdml |
390 | | - '((member_def name: (identifier) @sdml-ts-field-definition-face) |
391 | | - (member_def target: (type_reference) @sdml-ts-type-reference-face) |
| 474 | + '((member_def name: (identifier) @sdml-ts-field-def-face) |
| 475 | + (type_reference (identifier_reference) @sdml-ts-type-face) |
392 | 476 | (annotation_member_def |
393 | 477 | "@" @sdml-ts-annotation-property-def-face |
394 | 478 | (member_def name: (identifier) @sdml-ts-annotation-property-def-face)) |
395 | 479 | (property_ref "ref" @sdml-ts-keyword-face) |
396 | 480 | (property_ref property: (identifier_reference) @sdml-ts-field-face) |
| 481 | + (metric_ref "ref" @sdml-ts-keyword-face) |
| 482 | + (metric_ref referent: (identifier_reference) @sdml-ts-field-face) |
397 | 483 | (entity_identity "identity" @sdml-ts-keyword-face) |
398 | 484 | (dimension_parent "parent" @sdml-ts-keyword-face) |
399 | 485 | (dimension_parent name: (identifier) @sdml-ts-field-def-face) |
|
421 | 507 | (annotation_property "=" @sdml-ts-operator-assignment-face) |
422 | 508 | (informal_constraint "=" @sdml-ts-operator-assignment-face) |
423 | 509 | (function_body [ ":=" "≔" ] @sdml-ts-operator-assignment-face) |
| 510 | + (function_signature [ "->" "→" ] @sdml-ts-operator-type-face) |
| 511 | + (function_parameter [ "->" "→" ] @sdml-ts-operator-type-face) |
| 512 | + (mapping_type [ "->" "→" ] @sdml-ts-operator-type-face) |
| 513 | + (mapping_value [ "->" "→" ] @sdml-ts-operator-type-face) |
424 | 514 | (member_def [ "->" "→" ] @sdml-ts-operator-type-face) |
425 | 515 | (datatype_def [ "<-" "←" ] @sdml-ts-operator-type-face) |
426 | 516 | (type_parameter [ "<-" "←" ] @sdml-ts-operator-type-face) |
|
454 | 544 | (constraint_sentence [ "(" ")" ] @sdml-ts-bracket-parameters-face) |
455 | 545 | (atomic_sentence [ "(" ")" ] @sdml-ts-bracket-parameters-face) |
456 | 546 | (functional_term [ "(" ")" ] @sdml-ts-bracket-parameters-face) |
| 547 | + (mapping_type [ "(" ")" ] @sdml-ts-bracket-parameters-face) |
457 | 548 | (type_class_def [ "(" ")" ] @sdml-ts-bracket-parameters-face) |
458 | 549 | (type_parameter_restriction [ "(" ")" ] @sdml-ts-bracket-parameters-face) |
459 | 550 | (value_constructor [ "(" ")" ] @sdml-ts-bracket-parameters-face)) |
460 | 551 |
|
461 | 552 | :feature 'restrictions |
462 | 553 | :language 'sdml |
463 | 554 | '((cardinality_reference_expression [ "{" "}" ] @sdml-ts-bracket-restriction-face) |
464 | | - (datatype_def_restriction [ "{" "}" ] @sdml-ts-bracket-restriction-face) |
| 555 | + (datatype_type_restrictions [ "{" "}" ] @sdml-ts-bracket-restriction-face) |
465 | 556 | (sequence_of_predicate_values [ "{" "}" ] @sdml-ts-bracket-restriction-face) |
466 | | - (datatype_def_restriction [ "{" "}" ] @sdml-ts-bracket-restriction-face) |
467 | 557 | (cardinality_expression [ "{" "}" ] @sdml-ts-bracket-restriction-face) |
468 | 558 | (sequence_of_values [ "{" "}" ]) @sdml-ts-bracket-restriction-face) |
469 | 559 |
|
|
472 | 562 | '((module_path_relative "::" @sdml-ts-separator-module-path-face) |
473 | 563 | (module_path_absolute "::" @sdml-ts-separator-module-path-face) |
474 | 564 | (quantified_sentence "," @sdml-ts-separator-qualified-sentence-face) |
475 | | - ((seq_builder_separator) @sdml-ts-separator-sequence-builder-face)))) |
| 565 | + ((seq_builder_separator) @sdml-ts-separator-sequence-builder-face)) |
| 566 | + |
| 567 | + :feature 'error |
| 568 | + :language 'sdml |
| 569 | + '((ERROR) @sdml-ts-error-face))) |
476 | 570 |
|
477 | 571 | ;; -------------------------------------------------------------------------- |
478 | 572 | ;; Tree-Sitter ❱ Font Lock ❱ Features |
|
482 | 576 | (makunbound 'sdml-ts-mode-font-lock--feature-list)) |
483 | 577 |
|
484 | 578 | (defvar sdml-ts-mode-font-lock--feature-list |
485 | | - '((comments global-keywords) |
486 | | - (modules definitions fields variants strings booleans numbers binaries iris) |
487 | | - (facets annotations constraints formals) |
488 | | - (operators sequences parameters restrictions delimiters))) |
489 | | - |
490 | | -;; -------------------------------------------------------------------------- |
| 579 | + '(;; Level-1: |
| 580 | + (comments) |
| 581 | + ;; Level-2 adds: |
| 582 | + (global-keywords strings binaries iris) |
| 583 | + ;; Level-3 (default) adds: |
| 584 | + (modules definitions fields variants booleans numbers) |
| 585 | + ;; Level-4 adds: |
| 586 | + (operators error sequences parameters restrictions delimiters |
| 587 | + facets annotations constraints formals))) |
| 588 | + |
| 589 | +;; ------------------------------------------------------------sdml-ts-mode--defun-name-------------- |
491 | 590 | ;; Tree-Sitter ❱ Font Lock ❱ Setup function |
492 | 591 | ;; -------------------------------------------------------------------------- |
493 | 592 |
|
494 | 593 | ;;;###autoload |
495 | 594 | (defun sdml-ts-mode-font-lock-setup () |
496 | 595 | "Setup `treesit'-based font-lock highlighting." |
| 596 | + (message "Setting up tree-sitter/font-lock for SDML") |
497 | 597 | (setq-local |
498 | 598 | treesit-font-lock-settings |
499 | 599 | sdml-ts-mode-font-lock--settings) |
|
0 commit comments