From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: haj@posteo.de (Harald =?UTF-8?Q?J=C3=B6rg?=) Newsgroups: gmane.emacs.bugs Subject: bug#47598: cperl-mode: Highlighting confused with ternary and -x [PATCH] Date: Tue, 06 Apr 2021 20:33:07 +0200 Message-ID: <87zgyb2rh8.fsf@hajtower> References: Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="4593"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux) Cc: 47598@debbugs.gnu.org To: "E. Choroba" Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Tue Apr 06 20:34:10 2021 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1lTqWf-00014I-RQ for geb-bug-gnu-emacs@m.gmane-mx.org; Tue, 06 Apr 2021 20:34:09 +0200 Original-Received: from localhost ([::1]:53626 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lTqWe-0005sb-Tq for geb-bug-gnu-emacs@m.gmane-mx.org; Tue, 06 Apr 2021 14:34:08 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:59398) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lTqWY-0005sT-Us for bug-gnu-emacs@gnu.org; Tue, 06 Apr 2021 14:34:02 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:58429) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1lTqWY-0001y6-Nd for bug-gnu-emacs@gnu.org; Tue, 06 Apr 2021 14:34:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1lTqWY-00059M-JZ for bug-gnu-emacs@gnu.org; Tue, 06 Apr 2021 14:34:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: haj@posteo.de (Harald =?UTF-8?Q?J=C3=B6rg?=) Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 06 Apr 2021 18:34:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 47598 X-GNU-PR-Package: emacs Original-Received: via spool by 47598-submit@debbugs.gnu.org id=B47598.161773400119749 (code B ref 47598); Tue, 06 Apr 2021 18:34:02 +0000 Original-Received: (at 47598) by debbugs.gnu.org; 6 Apr 2021 18:33:21 +0000 Original-Received: from localhost ([127.0.0.1]:41742 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lTqVs-00058S-F8 for submit@debbugs.gnu.org; Tue, 06 Apr 2021 14:33:20 -0400 Original-Received: from mout01.posteo.de ([185.67.36.65]:38169) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lTqVo-00058B-Rx for 47598@debbugs.gnu.org; Tue, 06 Apr 2021 14:33:18 -0400 Original-Received: from submission (posteo.de [89.146.220.130]) by mout01.posteo.de (Postfix) with ESMTPS id E1393160061 for <47598@debbugs.gnu.org>; Tue, 6 Apr 2021 20:33:08 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=posteo.de; s=2017; t=1617733988; bh=n4vevaqW6BtTcQo2M/UJMLGl2hQgDvtEExLX58CdcWA=; h=From:To:Cc:Subject:Date:From; b=TKIrWSUzZ3DX2UJ8UnbBf09x/gYjmxV1+Qp8y1lrrg9TAS54T0S/nIW26OcEwvZ9u L3ddTxg9Taad4VpREF8R4Pd+pK6BapOTHpsTs7udANVXoWrPl9h+DMcCa5O3dsCHaf 9c2SnYcdUuM+dlkJY/gR5ZlFJuXRbaqbee1svAq6dqvDmLGdhDsy3umJW0lQAI5EKR EB3lhGhmGbL4J3tRxFwBFKGEWvojZudoytYCLUWH7YkD7yOoI0WG3ES3UAj4kEn2XB OqWtJqb7wUi11O4FL9gPTSWR1V00axwQj1esVnwsDkyqcnxkhqovWIVMLMVNKAIb+H uiENi1iIjqHtg== Original-Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 4FFGP016xYz6tmK; Tue, 6 Apr 2021 20:33:07 +0200 (CEST) In-Reply-To: (E. Choroba's message of "Mon, 5 Apr 2021 02:04:56 +0200 (CEST)") X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.io gmane.emacs.bugs:203646 Archived-At: --=-=-= Content-Type: text/plain E. Choroba writes: > When combining the ternary operator with file tests using the default > argument, cperl-mode gets confused. > > For example: > > my $f = -f ? 'file' > : -l ? [readlink] > : -d ? 'dir' > : 'unknown'; > > It seems to think the ?'s are not part of a ternary operator, but > rather a match-once operator. ... Exactly, that is what is happening here. > ... Note that m?? without m results in a > syntax error since Perl 5.22. Because of that it seems appropriate to stop dealing with bare ?foo? altogether. So, the patch eliminates the recognition of bare ?foo?, and also deletes the corresponding lines from CPerl's builtin short documentation. The test in the patch uses the text from the bug report, and also checks that m?foo? is still processed as a regular expression, and a bare ?foo? isn't. -- Cheers, haj --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=0001-cperl-mode-Eliminate-bad-interpretation-of-foo-bug-4.patch Content-Description: Don't support ?foo? >From 3e9b727d2b7215ca73bc9334bf5b904916640055 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Harald=20J=C3=B6rg?= Date: Tue, 6 Apr 2021 20:21:25 +0200 Subject: [PATCH] ; cperl-mode: Eliminate bad interpretation of ?foo? (bug#47598) * lisp/progmodes/cperl-mode.el (cperl-find-pods-heres): Delete ?? from the allowed bare regexp delimiters. (cperl-short-docs): Delete ?...? from the documentation. * test/lisp/progmodes/cperl-mode-tests.el (cperl-bug-47598): Add tests for good, bad, and ambiguous use of ? as regex delimiter. --- lisp/progmodes/cperl-mode.el | 16 ++++++--------- test/lisp/progmodes/cperl-mode-tests.el | 27 +++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/lisp/progmodes/cperl-mode.el b/lisp/progmodes/cperl-mode.el index 7878e91096..d58b126ae9 100644 --- a/lisp/progmodes/cperl-mode.el +++ b/lisp/progmodes/cperl-mode.el @@ -3585,7 +3585,7 @@ cperl-find-pods-heres "\\<\\(q[wxqr]?\\|[msy]\\|tr\\)\\>" ; QUOTED CONSTRUCT "\\|" ;; 1+6+2+1=10 extra () before this: - "\\([?/<]\\)" ; /blah/ or ?blah? or + "\\([/<]\\)" ; /blah/ or "\\|" ;; 1+6+2+1+1=11 extra () before this "\\<" cperl-sub-regexp "\\>" ; sub with proto/attr @@ -3920,7 +3920,7 @@ cperl-find-pods-heres ;; 1+6+2=9 extra () before this: ;; "\\<\\(q[wxqr]?\\|[msy]\\|tr\\)\\>" ;; "\\|" - ;; "\\([?/<]\\)" ; /blah/ or ?blah? or + ;; "\\([/<]\\)" ; /blah/ or (setq b1 (if (match-beginning 10) 10 11) argument (buffer-substring (match-beginning b1) (match-end b1)) @@ -3958,7 +3958,7 @@ cperl-find-pods-heres (goto-char (match-beginning b1)) (cperl-backward-to-noncomment (point-min)) (or bb - (if (eq b1 11) ; bare /blah/ or ?blah? or + (if (eq b1 11) ; bare /blah/ or (setq argument "" b1 nil bb ; Not a regexp? @@ -3966,7 +3966,7 @@ cperl-find-pods-heres ;; What is below: regexp-p? (and (or (memq (preceding-char) - (append (if (memq c '(?\? ?\<)) + (append (if (char-equal c ?\<) ;; $a++ ? 1 : 2 "~{(=|&*!,;:[" "~{(=|&+-*!,;:[") nil)) @@ -3977,14 +3977,11 @@ cperl-find-pods-heres (forward-sexp -1) ;; After these keywords `/' starts a RE. One should add all the ;; functions/builtins which expect an argument, but ... - (if (eq (preceding-char) ?-) - ;; -d ?foo? is a RE - (looking-at "[a-zA-Z]\\>") (and (not (memq (preceding-char) '(?$ ?@ ?& ?%))) (looking-at - "\\(while\\|if\\|unless\\|until\\|and\\|or\\|not\\|xor\\|split\\|grep\\|map\\|print\\|say\\|return\\)\\>"))))) + "\\(while\\|if\\|unless\\|until\\|and\\|or\\|not\\|xor\\|split\\|grep\\|map\\|print\\|say\\|return\\)\\>")))) (and (eq (preceding-char) ?.) (eq (char-after (- (point) 2)) ?.)) (bobp)) @@ -7232,8 +7229,7 @@ cperl-short-docs ... >= ... Numeric greater than or equal to. ... >> ... Bitwise shift right. ... >>= ... Bitwise shift right assignment. -... ? ... : ... Condition=if-then-else operator. ?PAT? One-time pattern match. -?PATTERN? One-time pattern match. +... ? ... : ... Condition=if-then-else operator. @ARGV Command line arguments (not including the command name - see $0). @INC List of places to look for perl scripts during do/include/use. @_ Parameter array for subroutines; result of split() unless in list context. diff --git a/test/lisp/progmodes/cperl-mode-tests.el b/test/lisp/progmodes/cperl-mode-tests.el index 14bc48b92f..1b3a816d87 100644 --- a/test/lisp/progmodes/cperl-mode-tests.el +++ b/test/lisp/progmodes/cperl-mode-tests.el @@ -495,4 +495,31 @@ cperl-test-bug-47112 'font-lock-constant-face font-lock-string-face)))))) +(ert-deftest cperl-test-bug-47598 () + "Check that a file test followed by ? is no longer interpreted +as a regex." + ;; Testing the text from the bug report + (with-temp-buffer + (insert "my $f = -f ? 'file'\n") + (insert " : -l ? [readlink]\n") + (insert " : -d ? 'dir'\n") + (insert " : 'unknown';\n") + (funcall cperl-test-mode) + ;; Perl mode doesn't highlight file tests as functions, so we + ;; can't test for the function's face. But we can verify that the + ;; function is not a string. + (goto-char (point-min)) + (search-forward "?") + (should-not (nth 3 (syntax-ppss (point))))) + ;; Testing the actual targets for the regexp: m?foo? (still valid) + ;; and ?foo? (invalid since Perl 5.22) + (with-temp-buffer + (insert "m?foo?;") + (funcall cperl-test-mode) + (should (nth 3 (syntax-ppss 3)))) + (with-temp-buffer + (insert " ?foo?;") + (funcall cperl-test-mode) + (should-not (nth 3 (syntax-ppss 3))))) + ;;; cperl-mode-tests.el ends here -- 2.20.1 --=-=-=--