[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/relint 365dc91 41/44: Check bad skip-set provenance
From: |
Mattias Engdegård |
Subject: |
[elpa] externals/relint 365dc91 41/44: Check bad skip-set provenance |
Date: |
Tue, 26 Mar 2019 12:57:31 -0400 (EDT) |
branch: externals/relint
commit 365dc91b8f59142a4fa50c3de085b90bc9e92242
Author: Mattias Engdegård <address@hidden>
Commit: Mattias Engdegård <address@hidden>
Check bad skip-set provenance
Check whether known regexp-returning functions such as regexp-quote
are used in the generation of arguments to skip-chars-{forward,backward}.
The check is purely textual; no interpretation is performed, but definitions
of variables and functions are scanned.
---
relint.el | 35 ++++++++++++++++++++++++++++++++++-
1 file changed, 34 insertions(+), 1 deletion(-)
diff --git a/relint.el b/relint.el
index 7018857..844373f 100644
--- a/relint.el
+++ b/relint.el
@@ -648,6 +648,36 @@
re (format "%s (%s)" name rule-name) file pos path)))))
(relint--get-list form file pos path)))
+;; List of known regexp-generating functions used in EXPR.
+;; EXPANDED is a list of expanded functions, to prevent recursion.
+(defun relint--regexp-generators (expr expanded)
+ (cond
+ ((symbolp expr)
+ (let ((def (assq expr relint--variables)))
+ (and def (relint--regexp-generators (cdr def) expanded))))
+ ((atom expr) nil)
+ ((memq (car expr) '(regexp-quote regexp-opt regexp-opt-charset
+ rx rx-to-string wildcard-to-regexp))
+ (list (car expr)))
+ ((memq (car expr) '(looking-at re-search-forward re-search-backward
+ string-match string-match-p looking-back looking-at-p))
+ nil)
+ ((listp (cdr (last expr)))
+ (let ((head (car expr)))
+ (append (mapcan (lambda (x) (relint--regexp-generators x expanded))
+ (cdr expr))
+ (let ((fun (assq head relint--function-defs)))
+ (and fun (not (memq head expanded))
+ (relint--regexp-generators
+ (caddr fun) (cons head expanded)))))))))
+
+(defun relint--check-skip-set-provenance (skip-function form file pos path)
+ (let ((reg-gen (relint--regexp-generators form nil)))
+ (when reg-gen
+ (relint--report file pos path
+ (format "`%s' cannot be used for arguments to `%s'"
+ (car reg-gen) skip-function)))))
+
(defun relint--check-form-recursively-1 (form file pos path)
(pcase form
(`(,(or `defun `defmacro `defsubst)
@@ -743,7 +773,10 @@
(let ((str (relint--get-string skip-arg file pos path)))
(when str
(relint--check-skip-set str (format "call to %s" (car form))
- file pos (cons 1 path)))))
+ file pos (cons 1 path))))
+ (relint--check-skip-set-provenance
+ (car form) skip-arg file pos (cons 1 path))
+ )
(`(,(or `defvar `defconst `defcustom)
,name ,re-arg . ,rest)
(when (symbolp name)
- [elpa] branch externals/relint created (now ee70350), Mattias Engdegård, 2019/03/26
- [elpa] externals/relint 0604fad 43/44: Use a custom mode for the *relint* buffer, Mattias Engdegård, 2019/03/26
- [elpa] externals/relint ee70350 44/44: FSF copyright, URL, and increment version to 1.5, Mattias Engdegård, 2019/03/26
- [elpa] externals/relint 0fd1d46 29/44: Rename trawl to relint, Mattias Engdegård, 2019/03/26
- [elpa] externals/relint e882b71 42/44: Detect regexps spliced into [...], Mattias Engdegård, 2019/03/26
- [elpa] externals/relint c1b92cc 36/44: Wrap and evaluate defined functions passed as parameters, Mattias Engdegård, 2019/03/26
- [elpa] externals/relint d4a6d46 37/44: Evaluate some more functions, macros and special forms, Mattias Engdegård, 2019/03/26
- [elpa] externals/relint 019f4cf 10/44: Rewrite the partial evaluator and extend coverage, Mattias Engdegård, 2019/03/26
- [elpa] externals/relint 365dc91 41/44: Check bad skip-set provenance,
Mattias Engdegård <=
- [elpa] externals/relint a1829d7 39/44: Refactor the file scanning and linting code, Mattias Engdegård, 2019/03/26
- [elpa] externals/relint 0f76132 40/44: Add README.org, Mattias Engdegård, 2019/03/26
- [elpa] externals/relint e824db0 38/44: Expand locally defined macros, Mattias Engdegård, 2019/03/26
- [elpa] externals/relint c215d54 34/44: More careful evaluation of if, when, unless, and, or, Mattias Engdegård, 2019/03/26
- [elpa] externals/relint 15c799e 35/44: Evaluate calls to functions defined in the same file., Mattias Engdegård, 2019/03/26
- [elpa] externals/relint 2d1f488 32/44: mapcar on non-list sequence, Mattias Engdegård, 2019/03/26
- [elpa] externals/relint af745bb 30/44: Update the package description. Increment version to 1.4, Mattias Engdegård, 2019/03/26
- [elpa] externals/relint e1b1ef9 22/44: Run in two phases on each file, Mattias Engdegård, 2019/03/26
- [elpa] externals/relint 7a1b632 33/44: Add wildcard-to-regexp as 'pure' function, Mattias Engdegård, 2019/03/26
- [elpa] externals/relint f6fb8e6 31/44: Sundry cosmetic fixes, Mattias Engdegård, 2019/03/26