]> git.eshelyaron.com Git - emacs.git/commitdiff
cperl-mode: Delete a misleading comment, add tests for verification
authorHarald Jörg <haj@posteo.de>
Mon, 19 Oct 2020 08:57:57 +0000 (10:57 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Mon, 19 Oct 2020 08:57:57 +0000 (10:57 +0200)
* lisp/progmodes/cperl-mode.el: Delete a comment which explains a
bug which has been fixed a long time ago (bug#44073).
* test/lisp/progmodes/cperl-mode-tests.el
(cperl-mode-fontify-punct-vars): Add regression tests to verify
that fontification of punctuation variables doesn't start strings.

lisp/progmodes/cperl-mode.el
test/lisp/progmodes/cperl-mode-resources/fontify-punctuation-vars.pl [new file with mode: 0644]
test/lisp/progmodes/cperl-mode-tests.el

index 5b6e50c8206ed1cf901933b2c5c0ec93e04b2c82..ebbea6bed926b4edaacc9e9559c95bae1e40b584 100644 (file)
 
 ;; (define-key global-map [M-S-down-mouse-3] 'imenu)
 
-;;;; Font lock bugs as of v4.32:
-
-;; The following kinds of Perl code erroneously start strings:
-;; \$`  \$'  \$"
-;; $opt::s  $opt_s  $opt{s}  (s => ...)  /\s+.../
-;; likewise with m, tr, y, q, qX instead of s
-
 ;;; Code:
 \f
 ;;; Compatibility with older versions (for publishing on ELPA)
diff --git a/test/lisp/progmodes/cperl-mode-resources/fontify-punctuation-vars.pl b/test/lisp/progmodes/cperl-mode-resources/fontify-punctuation-vars.pl
new file mode 100644 (file)
index 0000000..fa32843
--- /dev/null
@@ -0,0 +1,20 @@
+# The following Perl punctiation variables contain characters which
+# are classified as string delimiters in the syntax table.  The mode
+# should not be confused by these.
+# The corresponding tests check that two consecutive '#' characters
+# are seen as comments, not as strings.
+my $pre = $`;  ##  $PREMATCH,      use another ` # to balance out
+my $pos = $';  ##  $POSTMATCH,     use another ' # to balance out
+my $lsp = $";  ##  $LIST_SEPARATOR use another " # to balance out
+
+# In the second level, we use the reference constructor \ on these
+# variables.  The backslash is an escape character *only* in strings.
+my $ref = \$`; ## \$PREMATCH,      use another ` # to balance out
+my $rif = \$'; ## \$POSTMATCH,     use another ' # to balance out
+my $raf = \$"; ## \$LIST_SEPARATOR use another " # to balance out
+
+my $opt::s = 0;       ## s is no substitution here
+my $opt_s  = 0;       ## s is no substitution here
+my %opt = (s => 0);   ## s is no substitution here
+$opt{s} = 0;          ## s is no substitution here
+$opt_s =~ /\s+.../    ## s is no substitution here
index e2af2b5b8de850f995a1bdff28ae859c462e2992..e67678cf6bb3ef9df438e2c567de08a24831e719 100644 (file)
@@ -196,4 +196,26 @@ Perl Best Practices sets some indentation values different from
             (should (equal got expected)))))
       (cperl-set-style "CPerl"))))
 
+(ert-deftest cperl-mode-fontify-punct-vars ()
+  "Test fontification of Perl's punctiation variables.
+Perl has variable names containing unbalanced quotes for the list
+separator $\" and pre- and postmatch $` and $'.  A reference to
+these variables, for example \\$\", should not cause the dollar
+to be escaped, which would then start a string beginning with the
+quote character.  This used to be broken in cperl-mode at some
+point in the distant past, and is still broken in perl-mode. "
+  (skip-unless (eq cperl-test-mode #'cperl-mode))
+  (let ((file (ert-resource-file "fontify-punctuation-vars.pl")))
+    (with-temp-buffer
+      (insert-file-contents file)
+      (goto-char (point-min))
+      (funcall cperl-test-mode)
+      (while (search-forward "##" nil t)
+        ;; The third element of syntax-ppss is true if in a string,
+        ;; which would indicate bad interpretation of the quote.  The
+        ;; fourth element is true if in a comment, which should be the
+        ;; case.
+        (should (equal (nth 3 (syntax-ppss)) nil))
+        (should (equal (nth 4 (syntax-ppss)) t))))))
+
 ;;; cperl-mode-tests.el ends here