diff options
author | Stefan Monnier <monnier@iro.umontreal.ca> | 2025-03-09 22:07:39 -0400 |
---|---|---|
committer | Stefan Monnier <monnier@iro.umontreal.ca> | 2025-03-09 22:07:39 -0400 |
commit | c4a282316633bdc6a21077350650ecd97868934c (patch) | |
tree | 99fb457b217fa4323985cd8708f922794ad58573 | |
parent | 5176eeb3003a4d31053b07a9c6045da723fa257d (diff) | |
download | emacs-c4a282316633bdc6a21077350650ecd97868934c.tar.gz emacs-c4a282316633bdc6a21077350650ecd97868934c.tar.bz2 emacs-c4a282316633bdc6a21077350650ecd97868934c.zip |
(makefile-dependency-regex): Fix bug#76759
* lisp/progmodes/make-mode.el (makefile-dependency-regex):
Decompose the regexp to be more understandable, and then change
it so the target part can't accidentally match a TAB.
* test/lisp/progmodes/make-mode-tests.el (make-mode-tests--bug17400):
New test.
-rw-r--r-- | lisp/progmodes/make-mode.el | 14 | ||||
-rw-r--r-- | test/lisp/progmodes/make-mode-tests.el | 42 |
2 files changed, 54 insertions, 2 deletions
diff --git a/lisp/progmodes/make-mode.el b/lisp/progmodes/make-mode.el index 782e0168ed8..d5fdd063825 100644 --- a/lisp/progmodes/make-mode.el +++ b/lisp/progmodes/make-mode.el @@ -225,8 +225,18 @@ not be enclosed in { } or ( )." ;; that if you change this regexp you might have to fix the imenu ;; index in makefile-imenu-generic-expression. (defvar makefile-dependency-regex - ;; Allow for two nested levels $(v1:$(v2:$(v3:a=b)=c)=d) - "^\\(\\(?:\\$\\(?:[({]\\(?:\\$\\(?:[({]\\(?:\\$\\(?:[^({]\\|.[^\n$#})]+?[})]\\)\\|[^\n$#)}]\\)+?[})]\\|[^({]\\)\\|[^\n$#)}]\\)+?[})]\\|[^({]\\)\\|[^\n$#:=]\\)+?\\)\\(:\\)\\(?:[ \t]*$\\|[^=\n]\\(?:[^#\n]*?;[ \t]*\\(.+\\)\\)?\\)" + (letrec ((elems-re + (lambda (n &optional outer) + (if (< n 1) + "[^\n$#})]+?" + (concat "\\(?:\\$\\(?:" + "[({]" (funcall elems-re (- n 1)) "[})]" + "\\|[^({]\\)" + "\\|[^\n$#" (if outer "\t:=" ")}") "]\\)+?"))))) + (concat + ;; Allow for two nested levels $(v1:$(v2:$(v3:a=b)=c)=d) + "^\\(" (funcall elems-re 3 'outer) + "\\)\\(:\\)\\(?:[ \t]*$\\|[^=\n]\\(?:[^#\n]*?;[ \t]*\\(.+\\)\\)?\\)")) "Regex used to find dependency lines in a makefile.") (defconst makefile-bsdmake-dependency-regex diff --git a/test/lisp/progmodes/make-mode-tests.el b/test/lisp/progmodes/make-mode-tests.el new file mode 100644 index 00000000000..07b5572b315 --- /dev/null +++ b/test/lisp/progmodes/make-mode-tests.el @@ -0,0 +1,42 @@ +;;; make-mode-tests.el --- tests for make-mode.el -*- lexical-binding: t -*- + +;; Copyright (C) 2025 Free Software Foundation, Inc. + +;; This file is part of GNU Emacs. + +;; GNU Emacs is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. + +;;; Code: + +(require 'ert) + +(ert-deftest make-mode-tests--bug17400 () + (let ((code " +foo: + bar; : baz")) + (with-temp-buffer + (insert code "\n") + (makefile-mode) + (font-lock-ensure) + (re-search-backward "bar") + (let ((bar-pos (point))) + (re-search-backward "foo") + (let ((foo-pos (point))) + ;; Make sure we don't confuse "bar;:" for a target! + (should-not (equal (get-text-property bar-pos 'face) + (get-text-property foo-pos 'face)))))))) + +(provide 'make-mode-tests) + +;;; make-mode-tests.el ends here |