From f3ff51288fa0370a9ea33312b188565e4f2b595e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Harald=20J=C3=B6rg?= Date: Fri, 14 Aug 2020 10:01:30 +0200 Subject: [PATCH] cperl-mode: Highlight '{$a++ / $b}' correctly * lisp/progmodes/cperl-mode.el (cperl-find-pods-heres): Recognize {$a++ / $b} correctly as division. (Bug#42168) * test/lisp/progmodes/cperl-mode-tests.el: New file with test verifying the fix. --- lisp/progmodes/cperl-mode.el | 3 ++ test/lisp/progmodes/cperl-mode-tests.el | 50 +++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 test/lisp/progmodes/cperl-mode-tests.el diff --git a/lisp/progmodes/cperl-mode.el b/lisp/progmodes/cperl-mode.el index 6122caf518..2d2713a36a 100644 --- a/lisp/progmodes/cperl-mode.el +++ b/lisp/progmodes/cperl-mode.el @@ -3979,6 +3979,9 @@ cperl-find-pods-heres (and (eq (preceding-char) ?.) (eq (char-after (- (point) 2)) ?.)) (bobp)) + ;; { $a++ / $b } doesn't start a regex, nor does $a-- + (not (and (memq (preceding-char) '(?+ ?-)) + (eq (preceding-char) (char-before (1- (point)))))) ;; m|blah| ? foo : bar; (not (and (eq c ?\?) diff --git a/test/lisp/progmodes/cperl-mode-tests.el b/test/lisp/progmodes/cperl-mode-tests.el new file mode 100644 index 0000000000..f39f1ba658 --- /dev/null +++ b/test/lisp/progmodes/cperl-mode-tests.el @@ -0,0 +1,50 @@ +;;; cperl-mode-tests --- Test for cperl-mode -*- lexical-binding: t -*- + +;; Copyright (C) 2020 Free Software Foundation, Inc. + +;; Author: Harald Jörg +;; Maintainer: Harald Jörg +;; Keywords: internal +;; Homepage: https://github.com/HaraldJoerg/cperl-mode + +;;; Commentary: + +;; This is a collection of tests for the fontification of CPerl-mode. + +;; Run these tests interactively: +;; (ert-run-tests-interactively '(tag :fontification)) + +;;; Code: + +(defun cperl-test-face (text regexp) + "Returns the face of the first character matched by REGEXP in TEXT." + (interactive) + (with-temp-buffer + (insert text) + (cperl-mode) + (font-lock-ensure (point-min) (point-max)) + (goto-char (point-min)) + (re-search-forward regexp) + (get-text-property (match-beginning 0) 'face))) + +(ert-deftest cperl-mode-test-bug-42168 () + "Verify that '/' is a division after ++ or --, not a regexp. +Reported in https://github.com/jrockway/cperl-mode/issues/45. +If seen as regular expression, then the slash is displayed using +font-lock-constant-face. If seen as a division, then it doesn't +have a face property." + :tags '(:fontification) + ;; The next two Perl expressions have divisions. Perl "punctuation" + ;; operators don't get a face. + (let ((code "{ $a++ / $b }")) + (should (equal (cperl-test-face code "/" ) nil))) + (let ((code "{ $a-- / $b }")) + (should (equal (cperl-test-face code "/" ) nil))) + ;; The next two Perl expressions have regular expressions. The + ;; delimiter of a RE is fontified with font-lock-constant-face. + (let ((code "{ $a+ / $b } # /")) + (should (equal (cperl-test-face code "/" ) font-lock-constant-face))) + (let ((code "{ $a- / $b } # /")) + (should (equal (cperl-test-face code "/" ) font-lock-constant-face)))) + +;;; cperl-mode-tests.el ends here -- 2.28.0