]> git.eshelyaron.com Git - emacs.git/commitdiff
; perl-mode.el: Detect regexes immediately after "|&"
authorHarald Jörg <haj@posteo.de>
Tue, 8 Jun 2021 21:23:25 +0000 (23:23 +0200)
committerHarald Jörg <haj@posteo.de>
Tue, 8 Jun 2021 21:23:25 +0000 (23:23 +0200)
* lisp/progmodes/perl-mode.el (perl-syntax-propertize-function):
Add "|&" to the list of characters after which a slash starts a
regular expression (Bug#23992).

* test/lisp/progmodes/cperl-mode-tests.el (cperl-test-ppss):
Correct the docstring.
(cperl-test-bug-23992): New test for Bug#23992.
(cperl-test-bug-42168): Adapt inline comments to the current code.

* test/lisp/progmodes/cperl-mode-resources/cperl-bug-23992.pl:
Resource file with example code from the bug report.

lisp/progmodes/perl-mode.el
test/lisp/progmodes/cperl-mode-resources/cperl-bug-23992.pl [new file with mode: 0644]
test/lisp/progmodes/cperl-mode-tests.el

index fd23683bc0a016075df00c0d8546958b87c3ea5f..d13c9053d57c23a021d889b9ba87d4e33bc139bd 100644 (file)
              (put-text-property (match-beginning 2) (match-end 2)
                                 'syntax-table (string-to-syntax "\""))
              (perl-syntax-propertize-special-constructs end)))))
-      ("\\(^\\|[?:.,;=!~({[ \t]\\)\\([msy]\\|q[qxrw]?\\|tr\\)\\>\\s-*\\(?:\\([^])}>= \n\t]\\)\\|\\(?3:=\\)[^>]\\)"
+      ("\\(^\\|[?:.,;=|&!~({[ \t]\\)\\([msy]\\|q[qxrw]?\\|tr\\)\\>\\s-*\\(?:\\([^])}>= \n\t]\\)\\|\\(?3:=\\)[^>]\\)"
        ;; Nasty cases:
        ;; /foo/m  $a->m  $#m $m @m %m
        ;; \s (appears often in regexps).
diff --git a/test/lisp/progmodes/cperl-mode-resources/cperl-bug-23992.pl b/test/lisp/progmodes/cperl-mode-resources/cperl-bug-23992.pl
new file mode 100644 (file)
index 0000000..1db639c
--- /dev/null
@@ -0,0 +1,10 @@
+# Test file for Bug#23992
+#
+# The "||" case is directly from the report,
+# the "&&" case has been added for symmetry.
+
+s/LEFT/L/g || s/RIGHT/R/g || s/aVALUE\D+//g;
+s/LEFT/L/g||s/RIGHT/R/g||s/aVALUE\D+//g;
+
+s/LEFT/L/g && s/RIGHT/R/g && s/aVALUE\D+//g;
+s/LEFT/L/g&&s/RIGHT/R/g&&s/aVALUE\D+//g;
index 7cdfa45d6f735e96edb462ca227f56ea345d94ed..036e20d7ccaa9d15a9562a6c156399f5f1756ed5 100644 (file)
@@ -37,7 +37,7 @@
 ;;; Utilities
 
 (defun cperl-test-ppss (text regexp)
-  "Return the `syntax-ppss' of the first character matched by REGEXP in TEXT."
+  "Return the `syntax-ppss' after the last character matched by REGEXP in TEXT."
   (interactive)
   (with-temp-buffer
     (insert text)
@@ -377,6 +377,26 @@ documentation it does the right thing anyway."
      (cperl-indent-command)
      (forward-line 1))))
 
+(ert-deftest cperl-test-bug-23992 ()
+  "Verify that substitutions are fontified directly after \"|&\".
+Regular expressions are strings in both perl-mode and cperl-mode."
+  (with-temp-buffer
+    (insert-file-contents (ert-resource-file "cperl-bug-23992.pl"))
+    (funcall cperl-test-mode)
+    (goto-char (point-min))
+    ;; "or" operator, with spaces
+    (search-forward "RIGHT")
+    (should (nth 3 (syntax-ppss)))
+    ;; "or" operator, without spaces
+    (search-forward "RIGHT")
+    (should (nth 3 (syntax-ppss)))
+    ;; "and" operator, with spaces
+    (search-forward "RIGHT")
+    (should (nth 3 (syntax-ppss)))
+    ;; "and" operator, without spaces
+    (search-forward "RIGHT")
+    (should (nth 3 (syntax-ppss)))))
+
 (ert-deftest cperl-test-bug-28650 ()
   "Verify that regular expressions are recognized after 'return'.
 The test uses the syntax property \"inside a string\" for the
@@ -448,14 +468,14 @@ 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.
+  ;; The next two Perl expressions have divisions.  The slash does not
+  ;; start a string.
   (let ((code "{ $a++ / $b }"))
     (should (equal (nth 8 (cperl-test-ppss code "/")) nil)))
   (let ((code "{ $a-- / $b }"))
     (should (equal (nth 8 (cperl-test-ppss code "/")) nil)))
-  ;; The next two Perl expressions have regular expressions.  The
-  ;; delimiter of a RE is fontified with font-lock-constant-face.
+  ;; The next two Perl expressions have regular expressions. The slash
+  ;; starts a string.
   (let ((code "{ $a+ / $b } # /"))
     (should (equal (nth 8 (cperl-test-ppss code "/")) 7)))
   (let ((code "{ $a- / $b } # /"))