From 1a90d2b6f3243274af347d3cf296f32293f68cc7 Mon Sep 17 00:00:00 2001 From: Stefan Kangas Date: Fri, 9 Dec 2022 10:58:22 +0100 Subject: [PATCH] Make checkdoc warn if not using lexical-binding * lisp/emacs-lisp/checkdoc.el (checkdoc-file-comments-engine): Warn if there is no lexical-binding cookie. --- etc/NEWS | 8 ++++++++ lisp/emacs-lisp/checkdoc.el | 39 +++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/etc/NEWS b/etc/NEWS index 0c1fdfc454..1ed6a31197 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -76,6 +76,14 @@ using this new option. (Or set 'display-buffer-alist' directly.) After manually editing 'eshell-aliases-file', you can use 'M-x eshell-read-aliases-list' to load the edited aliases. +** checkdoc + +--- +*** New checkdock warning if not using lexical-binding. +Checkdoc now warns if the first line of an Emacs Lisp file does not +end with a "-*- lexical-binding: t -*-" cookie. Customize the user +option 'checkdoc-lexical-binding-flag' to nil to disable this warning. + * New Modes and Packages in Emacs 30.1 diff --git a/lisp/emacs-lisp/checkdoc.el b/lisp/emacs-lisp/checkdoc.el index 3bddb93b64..0a2d9680fe 100644 --- a/lisp/emacs-lisp/checkdoc.el +++ b/lisp/emacs-lisp/checkdoc.el @@ -120,6 +120,14 @@ ;; simple style rules to follow which checkdoc will auto-fix for you. ;; `y-or-n-p' and `yes-or-no-p' should also end in "?". ;; +;; Lexical binding: +;; +;; We recommend always using lexical binding in new code, and +;; converting old code to use it. Checkdoc warns if you don't have +;; the recommended string "-*- lexical-binding: t -*-" at the top of +;; the file. You can disable this check with the user option +;; `checkdoc-lexical-binding-flag'. +;; ;; Adding your own checks: ;; ;; You can experiment with adding your own checks by setting the @@ -330,6 +338,12 @@ checkdoc-column-zero-backslash-before-paren :type 'boolean :version "28.1") +(defcustom checkdoc-lexical-binding-flag t + "Non-nil means generate warnings if file is not using lexical binding. +See Info node `(elisp) Converting to Lexical Binding' for more." + :type 'boolean + :version "29.1") + ;; This is how you can use checkdoc to make mass fixes on the Emacs ;; source tree: ;; @@ -2369,6 +2383,31 @@ checkdoc-file-comments-engine (point-min) (save-excursion (goto-char (point-min)) (line-end-position)))) nil)) + (when checkdoc-lexical-binding-flag + (setq + err + ;; Lexical binding cookie. + (if (not (save-excursion + (save-restriction + (goto-char (point-min)) + (narrow-to-region (point) (pos-eol)) + (re-search-forward + (rx "-*-" (* (* nonl) ";") + (* space) "lexical-binding:" (* space) "t" (* space) + (* ";" (* nonl)) + "-*-") + nil t)))) + (let ((pos (save-excursion (goto-char (point-min)) + (goto-char (pos-eol)) + (point)))) + (if (checkdoc-y-or-n-p "There is no lexical-binding cookie! Add one?") + (progn + (goto-char pos) + (insert " -*- lexical-binding: t -*-")) + (checkdoc-create-error + "The first line should end with \"-*- lexical-binding: t -*-\"" + pos (1+ pos) t))) + nil))) (setq err (or -- 2.35.1