emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/relint a37c0608cb: Add checks for treesit API


From: ELPA Syncer
Subject: [elpa] externals/relint a37c0608cb: Add checks for treesit API
Date: Thu, 15 Jun 2023 15:58:44 -0400 (EDT)

branch: externals/relint
commit a37c0608cb6f3ef5dcc78273162ca5444afc1328
Author: Basil L. Contovounesios <contovob@tcd.ie>
Commit: mattiase <mattiase@users.noreply.github.com>

    Add checks for treesit API
---
 relint.el        | 128 ++++++++++++++++++++++++++++++++++++++++++++++++++++---
 test/1.elisp     |   3 ++
 test/1.expected  |   6 +++
 test/14.elisp    |  42 ++++++++++++++++++
 test/14.expected |  30 +++++++++++++
 test/2.elisp     |   6 ++-
 test/2.expected  |  56 ++++++++++++++----------
 test/9.elisp     |  32 +++++++++++++-
 test/9.expected  |  60 +++++++++++++++++++++++---
 9 files changed, 327 insertions(+), 36 deletions(-)

diff --git a/relint.el b/relint.el
index 22090d8642..0bf6cb969c 100644
--- a/relint.el
+++ b/relint.el
@@ -1232,6 +1232,79 @@ or in the car of an element."
         (relint--check-re-string (car elem) ident pos p)))))
    form path))
 
+(defun relint--check-treesit-query (form name pos path)
+  "Recursively check tree-sitter :match regexps in EXPR.
+FORM is assumed a non-literal in the source."
+  (pcase form
+    (`(,_ . ,(or `((:match ,(and (pred stringp) re) . ,_))
+                 ;; Optional capture name.
+                 `(,(pred symbolp)
+                   (:match ,(and (pred stringp) re) . ,_))))
+     (relint--check-re-string re name pos path))
+    ((pred consp)
+     (while (consp form)
+       (relint--check-treesit-query (car form) name pos path)
+       (setq form (cdr form))))
+    ((pred vectorp)
+     (dotimes (i (length form))
+       (relint--check-treesit-query (aref form i) name pos path)))))
+
+(defun relint--check-treesit-font-lock-rules (form name pos path)
+  "Check tree-sitter font lock queries.
+Evaluate and validate FORM as an arglist for
+`treesit-font-lock-rules'."
+  (relint--eval-list-iter
+   (let (skip-next)
+     (lambda (elem elem-path _literal)
+       (let ((skip skip-next))
+         ;; Skip leading plists.
+         (setq skip-next (keywordp elem))
+         (unless (or skip skip-next)
+           (relint--check-treesit-query elem name pos elem-path)))))
+   form path))
+
+(defun relint--check-treesit-indent-rule (form name pos path literal)
+  "Check regexps in tree-sitter indentation matcher FORM."
+  (pcase form
+    ;; Optional arguments.
+    (`(match . ,items)
+     (dotimes (i 3)
+       (when (stringp (car-safe items))
+         (relint--check-re-string
+          (car items) name pos (if literal (cons (1+ i) path) path)))
+       (setq items (cdr-safe items))))
+    ;; Required arguments.
+    (`(n-p-gp ,_ ,_ ,_ . ,_)
+     (let ((items (cdr form)))
+       (dotimes (i 3)
+         (when (stringp (car items))
+           (relint--check-re-string
+            (car items) name pos (if literal (cons (1+ i) path) path)))
+         (setq items (cdr items)))))
+    (`(,(or 'parent-is 'node-is 'field-is)
+       ,(and (pred stringp) re) . ,_)
+     (relint--check-re-string re name pos (if literal (cons 1 path) path)))))
+
+(defun relint--check-treesit-indent-rules (form name pos path)
+  "Check tree-sitter indentation rules.
+Evaluate and validate FORM as a value for
+`treesit-simple-indent-rules'."
+  (relint--eval-list-iter
+   (lambda (lang lang-path literal)
+     (let ((lang-name (if (consp lang) (format "%s (%s)" name (car lang)) 
name))
+           (rules (cdr-safe lang))
+           (i 1))
+       (while (consp rules)
+         (let ((matcher (car-safe (car rules))))
+           (when matcher
+             (let ((matcher-path
+                    (if literal (cons 0 (cons i lang-path)) lang-path)))
+               (relint--check-treesit-indent-rule
+                matcher lang-name pos matcher-path literal))))
+         (setq rules (cdr rules))
+         (setq i (1+ i)))))
+   form path))
+
 (defun relint--check-imenu-generic-expression (form name pos path)
   (relint--eval-list-iter
    (lambda (elem elem-path literal)
@@ -1291,8 +1364,9 @@ or in the car of an element."
    form path))
 
 (defconst relint--known-regexp-variables
-  '(page-delimiter paragraph-separate paragraph-start
-    sentence-end comment-start-skip comment-end-skip)
+  '( page-delimiter paragraph-separate paragraph-start
+     sentence-end comment-start-skip comment-end-skip
+     treesit-sentence-type-regexp treesit-sexp-type-regexp)
   "List of known (global or buffer-local) regexp variables.")
 
 (defconst relint--known-regexp-returning-functions
@@ -1303,6 +1377,10 @@ or in the car of an element."
     word-search-regexp)
   "List of functions known to return a regexp.")
 
+(defconst relint--known-imenu-variables
+  '(imenu-generic-expression treesit-simple-imenu-settings)
+  "List of known buffer-local Imenu index-defining variables.")
+
 ;; List of functions believed to return a regexp.
 (defvar relint--regexp-returning-functions)
 
@@ -1873,7 +1951,7 @@ directly."
              (relint--check-font-lock-keywords expr name pos (cons i path)))
             ((eq name 'font-lock-defaults)
              (relint--check-font-lock-defaults expr name pos (cons i path)))
-            ((eq name 'imenu-generic-expression)
+            ((memq name relint--known-imenu-variables)
              (relint--check-imenu-generic-expression
               expr name pos (cons i path)))
             ((eq name 'auto-mode-alist)
@@ -1884,6 +1962,13 @@ directly."
                (`(append ,items auto-mode-alist)
                 (relint--check-auto-mode-alist
                  items name pos (cons 1 (cons i path))))))
+            ((eq name 'treesit-simple-indent-rules)
+             (relint--check-treesit-indent-rules expr name pos (cons i path)))
+            ((eq name 'treesit-defun-type-regexp)
+             (let* ((val (relint--eval-or-nil expr))
+                    (re (or (car-safe val) val)))
+               (when (stringp re)
+                 (relint--check-re-string re name pos (cons i path)))))
             (t
              ;; Invalidate the variable if it was local; otherwise, ignore.
              (let ((local (assq name relint--locals)))
@@ -1989,7 +2074,9 @@ directly."
         (relint--check-file-name-re re-arg (format "call to %s" (car form))
                                     pos (cons 2 path)))
        (`(,(or 'split-string 'split-string-and-unquote
-               'string-trim-left 'string-trim-right 'string-trim)
+               'string-trim-left 'string-trim-right 'string-trim
+               'treesit-induce-sparse-tree 'treesit-search-forward
+               'treesit-search-forward-goto 'treesit-search-subtree)
           ,_ ,re-arg . ,rest)
         (unless (and (symbolp re-arg)
                      (memq re-arg relint--checked-variables))
@@ -2101,6 +2188,13 @@ directly."
                               (symbol-name name))
               (relint--check-rules-list re-arg name pos (cons 2 path))
               (push name relint--checked-variables))
+             ((string-match-p (rx (or (seq (or bos ?-) "treesit")
+                                      (seq "-ts" (opt "-mode") (opt ?-)))
+                                  "-font-lock-" (or "rules" "settings") eos)
+                              (symbol-name name))
+              (relint--check-treesit-font-lock-rules
+               re-arg name pos (cons 2 path))
+              (push name relint--checked-variables))
              ;; Doc string starting with "regexp" etc.
              ((and (stringp (car rest))
                    (let ((case-fold-search t))
@@ -2146,6 +2240,30 @@ directly."
        (`(font-lock-add-keywords ,_ ,keywords . ,_)
         (relint--check-font-lock-keywords
          keywords (car form) pos (cons 2 path)))
+       (`(,(or 'treesit-font-lock-rules 'treesit-range-rules) . ,items)
+        (let ((i 1))
+          (while (consp items)
+            (if (not (and (keywordp (car items))
+                          (consp (cdr items))))
+                (relint--check-treesit-query (relint--eval-list (car items))
+                                             (format "call to %s" (car form))
+                                             pos (cons i path))
+              ;; Skip leading plists.
+              (setq items (cdr items))
+              (setq i (1+ i)))
+            (setq items (cdr items))
+            (setq i (1+ i)))))
+       (`(treesit-query-expand ,query . ,_)
+        (relint--check-treesit-query (relint--eval-list query)
+                                     (format "call to %s" (car form))
+                                     pos (cons 1 path)))
+       (`(,(or 'treesit-node-top-level 'treesit-query-capture
+               'treesit-query-compile 'treesit-query-range
+               'treesit-query-string)
+          ,_ ,query . ,_)
+        (relint--check-treesit-query (relint--eval-list query)
+                                     (format "call to %s" (car form))
+                                     pos (cons 2 path)))
        (`(set (make-local-variable ',(and (pred symbolp) name)) ,expr)
         (cond ((memq name relint--known-regexp-variables)
                (relint--check-re expr name pos (cons 2 path)))
@@ -2153,7 +2271,7 @@ directly."
                (relint--check-font-lock-defaults expr name pos (cons 2 path)))
               ((string-match-p (rx "font-lock-keywords") (symbol-name name))
                (relint--check-font-lock-keywords expr name pos (cons 2 path)))
-              ((eq name 'imenu-generic-expression)
+              ((memq name relint--known-imenu-variables)
                (relint--check-imenu-generic-expression
                 expr name pos (cons 2 path)))))
        (`(define-generic-mode ,name ,_ ,_ ,font-lock-list ,auto-mode-list . ,_)
diff --git a/test/1.elisp b/test/1.elisp
index c00681a92d..2fb55d34f0 100644
--- a/test/1.elisp
+++ b/test/1.elisp
@@ -112,3 +112,6 @@
    ("thing" stuff)
    ("$3$" bad)
    ("^4^" alsobad)))
+
+(defvar my-ts--font-lock-rules '(((a) (:match "[55]" @a))))
+(defvar my-ts-mode-font-lock-rules '(((b) (:match "[66]" @b))))
diff --git a/test/1.expected b/test/1.expected
index 4014a72d83..3cd9441654 100644
--- a/test/1.expected
+++ b/test/1.expected
@@ -177,3 +177,9 @@
 1.elisp:114:8: In call to syntax-propertize-precompile-rules: Unescaped 
literal `^' (pos 2)
   "^4^"
    ..^
+1.elisp:116:34: In my-ts--font-lock-rules: Duplicated `5' inside character 
alternative (pos 2)
+  "[55]"
+   ..^
+1.elisp:117:38: In my-ts-mode-font-lock-rules: Duplicated `6' inside character 
alternative (pos 2)
+  "[66]"
+   ..^
diff --git a/test/14.elisp b/test/14.elisp
new file mode 100644
index 0000000000..5f74414ad8
--- /dev/null
+++ b/test/14.elisp
@@ -0,0 +1,42 @@
+;;; Relint test file 14          -*- emacs-lisp -*-
+
+;; Test tree-sitter queries.
+
+(defun test-treesit-font-lock ()
+  (treesit-font-lock-rules
+   :language "+a+"
+   :feature "+b+"
+   '("+c+" ("+d+") (:match "+e+"))
+
+   :language nil
+   :feature nil
+   `(((f @f) (:match "+f+" @f))
+     [((g) @g (:match ,(string ?+ ?g ?+) @g))]
+     ((h @h) (:match "h+" @h)))))
+
+(defun test-treesit-ranges ()
+  (treesit-range-rules
+   :embed "+i+"
+   :host "+j+"
+   '(["+k+"]
+     (("+l+") (:match @l "+m+"))
+     (:match "+n+"))
+
+   #'ignore
+
+   :embed nil
+   :host nil
+   `(((o field: _ @o) (:match "+o+" @o))
+     [((p) @p (:match ,(string ?+ ?p ?+) @p))]
+     ((q field: (_) @q) (:match "q+" @q)))))
+
+(treesit-query-expand '(((r) (:match "+r+" @r))))
+(treesit-query-compile
+ "+s+"
+ '(((s) @s (:match "s+" @s))
+   [[((t) @t (:match "+t+" @t))]]))
+
+(treesit-node-top-level nil '(((u) (:match "+u+" @u))))
+(treesit-query-capture nil '(((v) (:match "+v+" @v))))
+(treesit-query-range nil '(((w) (:match "+w+" @w))))
+(treesit-query-string nil '(((x) (:match "+x+" @x))))
diff --git a/test/14.expected b/test/14.expected
new file mode 100644
index 0000000000..4e3ae8a1c0
--- /dev/null
+++ b/test/14.expected
@@ -0,0 +1,30 @@
+14.elisp:13:4: In call to treesit-font-lock-rules: Unescaped literal `+' (pos 
0)
+  "+f+"
+   ^
+14.elisp:13:4: In call to treesit-font-lock-rules: Unescaped literal `+' (pos 
0)
+  "+g+"
+   ^
+14.elisp:29:4: In call to treesit-range-rules: Unescaped literal `+' (pos 0)
+  "+o+"
+   ^
+14.elisp:29:4: In call to treesit-range-rules: Unescaped literal `+' (pos 0)
+  "+p+"
+   ^
+14.elisp:33:23: In call to treesit-query-expand: Unescaped literal `+' (pos 0)
+  "+r+"
+   ^
+14.elisp:36:2: In call to treesit-query-compile: Unescaped literal `+' (pos 0)
+  "+t+"
+   ^
+14.elisp:39:29: In call to treesit-node-top-level: Unescaped literal `+' (pos 
0)
+  "+u+"
+   ^
+14.elisp:40:28: In call to treesit-query-capture: Unescaped literal `+' (pos 0)
+  "+v+"
+   ^
+14.elisp:41:26: In call to treesit-query-range: Unescaped literal `+' (pos 0)
+  "+w+"
+   ^
+14.elisp:42:27: In call to treesit-query-string: Unescaped literal `+' (pos 0)
+  "+x+"
+   ^
diff --git a/test/2.elisp b/test/2.elisp
index 36d338a88f..b6b714ac15 100644
--- a/test/2.elisp
+++ b/test/2.elisp
@@ -32,7 +32,11 @@
   (directory-files-recursively s "+3")
   (delete-matching-lines "+4")
   (delete-non-matching-lines "+5")
-  (count-matches "+6"))
+  (count-matches "+6")
+  (treesit-induce-sparse-tree n "+7")
+  (treesit-search-forward n "+8")
+  (treesit-search-forward-goto n "+9")
+  (treesit-search-subtree n "+10"))
 
 ;; Test argument names as means of detecting regexps.
 (defun f2 (x1 my-regexp x2 my-regex x3 my-re x4 my-pattern x5 re)
diff --git a/test/2.expected b/test/2.expected
index aa58eca2bc..7d36356b57 100644
--- a/test/2.expected
+++ b/test/2.expected
@@ -97,69 +97,81 @@
 2.elisp:35:19: In call to count-matches: Unescaped literal `+' (pos 0)
   "+6"
    ^
-2.elisp:48:17: In call to f2: Duplicated `B' inside character alternative (pos 
2)
+2.elisp:36:34: In call to treesit-induce-sparse-tree: Unescaped literal `+' 
(pos 0)
+  "+7"
+   ^
+2.elisp:37:30: In call to treesit-search-forward: Unescaped literal `+' (pos 0)
+  "+8"
+   ^
+2.elisp:38:35: In call to treesit-search-forward-goto: Unescaped literal `+' 
(pos 0)
+  "+9"
+   ^
+2.elisp:39:30: In call to treesit-search-subtree: Unescaped literal `+' (pos 0)
+  "+10"
+   ^
+2.elisp:52:17: In call to f2: Duplicated `B' inside character alternative (pos 
2)
   "[BB]"
    ..^
-2.elisp:48:31: In call to f2: Duplicated `D' inside character alternative (pos 
2)
+2.elisp:52:31: In call to f2: Duplicated `D' inside character alternative (pos 
2)
   "[DD]"
    ..^
-2.elisp:48:45: In call to f2: Duplicated `F' inside character alternative (pos 
2)
+2.elisp:52:45: In call to f2: Duplicated `F' inside character alternative (pos 
2)
   "[FF]"
    ..^
-2.elisp:48:59: In call to f2: Duplicated `H' inside character alternative (pos 
2)
+2.elisp:52:59: In call to f2: Duplicated `H' inside character alternative (pos 
2)
   "[HH]"
    ..^
-2.elisp:48:73: In call to f2: Duplicated `J' inside character alternative (pos 
2)
+2.elisp:52:73: In call to f2: Duplicated `J' inside character alternative (pos 
2)
   "[JJ]"
    ..^
-2.elisp:49:17: In call to s2: Duplicated `B' inside character alternative (pos 
2)
+2.elisp:53:17: In call to s2: Duplicated `B' inside character alternative (pos 
2)
   "[BB]"
    ..^
-2.elisp:49:31: In call to s2: Duplicated `D' inside character alternative (pos 
2)
+2.elisp:53:31: In call to s2: Duplicated `D' inside character alternative (pos 
2)
   "[DD]"
    ..^
-2.elisp:49:45: In call to s2: Duplicated `F' inside character alternative (pos 
2)
+2.elisp:53:45: In call to s2: Duplicated `F' inside character alternative (pos 
2)
   "[FF]"
    ..^
-2.elisp:49:59: In call to s2: Duplicated `H' inside character alternative (pos 
2)
+2.elisp:53:59: In call to s2: Duplicated `H' inside character alternative (pos 
2)
   "[HH]"
    ..^
-2.elisp:49:73: In call to s2: Duplicated `J' inside character alternative (pos 
2)
+2.elisp:53:73: In call to s2: Duplicated `J' inside character alternative (pos 
2)
   "[JJ]"
    ..^
-2.elisp:50:17: In call to m2: Duplicated `B' inside character alternative (pos 
2)
+2.elisp:54:17: In call to m2: Duplicated `B' inside character alternative (pos 
2)
   "[BB]"
    ..^
-2.elisp:50:31: In call to m2: Duplicated `D' inside character alternative (pos 
2)
+2.elisp:54:31: In call to m2: Duplicated `D' inside character alternative (pos 
2)
   "[DD]"
    ..^
-2.elisp:50:45: In call to m2: Duplicated `F' inside character alternative (pos 
2)
+2.elisp:54:45: In call to m2: Duplicated `F' inside character alternative (pos 
2)
   "[FF]"
    ..^
-2.elisp:50:59: In call to m2: Duplicated `H' inside character alternative (pos 
2)
+2.elisp:54:59: In call to m2: Duplicated `H' inside character alternative (pos 
2)
   "[HH]"
    ..^
-2.elisp:50:73: In call to m2: Duplicated `J' inside character alternative (pos 
2)
+2.elisp:54:73: In call to m2: Duplicated `J' inside character alternative (pos 
2)
   "[JJ]"
    ..^
-2.elisp:58:17: In call to f5: Duplicated `b' inside character alternative (pos 
2)
+2.elisp:62:17: In call to f5: Duplicated `b' inside character alternative (pos 
2)
   "[bb]"
    ..^
-2.elisp:58:24: In call to f5: Duplicated `c' inside character alternative (pos 
2)
+2.elisp:62:24: In call to f5: Duplicated `c' inside character alternative (pos 
2)
   "[cc]"
    ..^
-2.elisp:58:31: In call to f5: Duplicated `d' inside character alternative (pos 
2)
+2.elisp:62:31: In call to f5: Duplicated `d' inside character alternative (pos 
2)
   "[dd]"
    ..^
-2.elisp:61:26: In :regexp parameter: Duplicated `1' inside character 
alternative (pos 2)
+2.elisp:65:26: In :regexp parameter: Duplicated `1' inside character 
alternative (pos 2)
   "[11]"
    ..^
-2.elisp:62:20: In :regex parameter: Duplicated `2' inside character 
alternative (pos 2)
+2.elisp:66:20: In :regex parameter: Duplicated `2' inside character 
alternative (pos 2)
   "[22]"
    ..^
-2.elisp:65:31: In call to sort-regexp-fields: Unescaped literal `$' (pos 3)
+2.elisp:69:31: In call to sort-regexp-fields: Unescaped literal `$' (pos 3)
   "^.*$x"
    ...^
-2.elisp:66:35: In call to sort-regexp-fields: Escaped non-special character 
`%' (pos 0)
+2.elisp:70:35: In call to sort-regexp-fields: Escaped non-special character 
`%' (pos 0)
   "\\%"
    ^
diff --git a/test/9.elisp b/test/9.elisp
index ef6ae86b59..dff1d80b31 100644
--- a/test/9.elisp
+++ b/test/9.elisp
@@ -17,12 +17,28 @@
         (page-delimiter "[jj]"))
     (let* ((comment-start-skip "[kk]")
            (comment-end-skip "[ll]"))
-      (asdf))))
+      (asdf)))
+
+  (setq treesit-sentence-type-regexp "+0")
+  (setq treesit-sexp-type-regexp "+1"))
+
+(defvar bad-imenu
+  '(("*less*" "" 0)
+    (nil "+b+" 0)))
+
+(defvar bad-treesit-imenu
+  '((nil "node" nil nil)
+    ("+++" "+c+" nil nil)))
 
 (defun test-9-ge ()
   (setq-local imenu-generic-expression
               '((nil "oh" 0)
-                ("*more*" "+a+" 0))))
+                ("*more*" "+a+" 0)))
+  (setq imenu-generic-expression bad-imenu)
+  (setq-local treesit-simple-imenu-settings bad-treesit-imenu)
+  (set (make-local-variable 'treesit-simple-imenu-settings)
+       '((nil "type" nil nil)
+         ("+more+" "+d+" nil nil))))
 
 (defun test-9-fl-kw ()
   (setq-local font-lock-keywords '(("[mm]" . tag)))
@@ -40,3 +56,15 @@
         '((my-fl-keyw-1
            my-font-lock-keywords-2)
           moo mooo)))
+
+(defun test-9-ts-indent ()
+  (setq treesit-simple-indent-rules
+        '((a ((match "+e+" "+f+" "+g+") a 0)
+             ((n-p-gp "+h+" "+i+" "+j+") a 0))
+          (b ((parent-is "+k+") b 0)
+             ((node-is "+l+") b 0)
+             ((field-is "+m+") b 0)))))
+
+(defun test-9-ts-defun ()
+  (setq treesit-defun-type-regexp "+n+")
+  (setq treesit-defun-type-regexp (cons "+o+" #'ignore)))
diff --git a/test/9.expected b/test/9.expected
index b960f813f3..df8f7e682a 100644
--- a/test/9.expected
+++ b/test/9.expected
@@ -34,21 +34,69 @@
 9.elisp:19:33: In comment-end-skip: Duplicated `l' inside character 
alternative (pos 2)
   "[ll]"
    ..^
-9.elisp:25:28: In imenu-generic-expression: Unescaped literal `+' (pos 0)
+9.elisp:22:39: In treesit-sentence-type-regexp: Unescaped literal `+' (pos 0)
+  "+0"
+   ^
+9.elisp:23:35: In treesit-sexp-type-regexp: Unescaped literal `+' (pos 0)
+  "+1"
+   ^
+9.elisp:36:28: In imenu-generic-expression: Unescaped literal `+' (pos 0)
   "+a+"
    ^
-9.elisp:28:40: In font-lock-keywords (tag): Duplicated `m' inside character 
alternative (pos 2)
+9.elisp:37:34: In imenu-generic-expression: Unescaped literal `+' (pos 0)
+  "+b+"
+   ^
+9.elisp:38:45: In treesit-simple-imenu-settings: Unescaped literal `+' (pos 0)
+  "+c+"
+   ^
+9.elisp:41:21: In treesit-simple-imenu-settings: Unescaped literal `+' (pos 0)
+  "+d+"
+   ^
+9.elisp:44:40: In font-lock-keywords (tag): Duplicated `m' inside character 
alternative (pos 2)
   "[mm]"
    ..^
-9.elisp:29:34: In font-lock-keywords (tag): Duplicated `n' inside character 
alternative (pos 2)
+9.elisp:45:34: In font-lock-keywords (tag): Duplicated `n' inside character 
alternative (pos 2)
   "[nn]"
    ..^
-9.elisp:30:56: In font-lock-keywords (tag): Duplicated `o' inside character 
alternative (pos 2)
+9.elisp:46:56: In font-lock-keywords (tag): Duplicated `o' inside character 
alternative (pos 2)
   "[oo]"
    ..^
-9.elisp:36:9: In my-font-lock-keywords-2 (beta): Duplicated `q' inside 
character alternative (pos 2)
+9.elisp:52:9: In my-font-lock-keywords-2 (beta): Duplicated `q' inside 
character alternative (pos 2)
   "[qq]"
    ..^
-9.elisp:40:9: In font-lock-defaults (alpha): Duplicated `p' inside character 
alternative (pos 2)
+9.elisp:56:9: In font-lock-defaults (alpha): Duplicated `p' inside character 
alternative (pos 2)
   "[pp]"
    ..^
+9.elisp:62:23: In treesit-simple-indent-rules (a): Unescaped literal `+' (pos 
0)
+  "+e+"
+   ^
+9.elisp:62:29: In treesit-simple-indent-rules (a): Unescaped literal `+' (pos 
0)
+  "+f+"
+   ^
+9.elisp:62:35: In treesit-simple-indent-rules (a): Unescaped literal `+' (pos 
0)
+  "+g+"
+   ^
+9.elisp:63:24: In treesit-simple-indent-rules (a): Unescaped literal `+' (pos 
0)
+  "+h+"
+   ^
+9.elisp:63:30: In treesit-simple-indent-rules (a): Unescaped literal `+' (pos 
0)
+  "+i+"
+   ^
+9.elisp:63:36: In treesit-simple-indent-rules (a): Unescaped literal `+' (pos 
0)
+  "+j+"
+   ^
+9.elisp:64:27: In treesit-simple-indent-rules (b): Unescaped literal `+' (pos 
0)
+  "+k+"
+   ^
+9.elisp:65:25: In treesit-simple-indent-rules (b): Unescaped literal `+' (pos 
0)
+  "+l+"
+   ^
+9.elisp:66:26: In treesit-simple-indent-rules (b): Unescaped literal `+' (pos 
0)
+  "+m+"
+   ^
+9.elisp:69:36: In treesit-defun-type-regexp: Unescaped literal `+' (pos 0)
+  "+n+"
+   ^
+9.elisp:70:35: In treesit-defun-type-regexp: Unescaped literal `+' (pos 0)
+  "+o+"
+   ^



reply via email to

[Prev in Thread] Current Thread [Next in Thread]