[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+"
+ ^
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [elpa] externals/relint a37c0608cb: Add checks for treesit API,
ELPA Syncer <=