From 7d60d1652fc107c81c95cc7f7406a720996f3b8e 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. (Bug#59920) (checkdoc-lexical-binding-flag): New user option. --- etc/NEWS | 8 ++++++++ lisp/emacs-lisp/checkdoc.el | 39 +++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/etc/NEWS b/etc/NEWS index 9a98db8c83a..d7c6edefe4b 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -711,6 +711,14 @@ without specifying a file, like this: *** New user option 'image-dired-thumb-naming'. You can now configure how a thumbnail is named using this option. +** 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 3c4b6baca53..e918ec1eebd 100644 --- a/lisp/emacs-lisp/checkdoc.el +++ b/lisp/emacs-lisp/checkdoc.el @@ -128,6 +128,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 @@ -339,6 +347,12 @@ See Info node `(elisp) Documentation Tips' for background." :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 "30.1") + ;; This is how you can use checkdoc to make mass fixes on the Emacs ;; source tree: ;; @@ -2377,6 +2391,31 @@ Code:, and others referenced in the style guide." (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.39.2