emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master bb7605c0870: Fontify Java constructor names and arglists


From: Alan Mackenzie
Subject: master bb7605c0870: Fontify Java constructor names and arglists
Date: Fri, 26 May 2023 10:35:01 -0400 (EDT)

branch: master
commit bb7605c087006b714236165f88341545355d3673
Author: Alan Mackenzie <acm@muc.de>
Commit: Alan Mackenzie <acm@muc.de>

    Fontify Java constructor names and arglists
    
    This fixes bug#63328.
    
    * lisp/progmodes/cc-engine.el (c-forward-decl-or-cast-1): New
    variable got-stmt-block.  After scanning an arglist, set
    got-arglist to t.  When we have as yet no identifier,
    got-arglist, and scan an open brace, test the "type" for being
    the name of the enclosing class.
    (c-directly-in-class-called-p): Test the two names for
    equality, not merely one being the head of the other.
---
 lisp/progmodes/cc-engine.el | 30 ++++++++++++++++++++++++++----
 1 file changed, 26 insertions(+), 4 deletions(-)

diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el
index d21e082d0b6..66cfd3dee9e 100644
--- a/lisp/progmodes/cc-engine.el
+++ b/lisp/progmodes/cc-engine.el
@@ -10636,6 +10636,10 @@ This function might do hidden buffer changes."
          got-parens
          ;; True if there is a terminated argument list.
          got-arglist
+         ;; True when `got-arglist' and the token after the end of the
+         ;; arglist is an opening brace.  Used only when we have a
+         ;; suspected typeless function name.
+         got-stmt-block
          ;; True if there is an identifier in the declarator.
          got-identifier
          ;; True if we find a number where an identifier was expected.
@@ -10788,6 +10792,10 @@ This function might do hidden buffer changes."
                    (setq got-arglist t))
                  t)
              (when (cond
+                     ((and (eq (char-after) ?\()
+                           (c-safe (c-forward-sexp 1) t))
+                      (when (eq (char-before) ?\))
+                        (setq got-arglist t)))
                     ((save-match-data (looking-at "\\s("))
                      (c-safe (c-forward-sexp 1) t))
                     ((save-match-data
@@ -10802,6 +10810,11 @@ This function might do hidden buffer changes."
                  (setq got-suffix-after-parens (match-beginning 0)))
                (setq got-suffix t))))
 
+          ((and got-arglist
+                (eq (char-after) ?{))
+           (setq got-stmt-block t)
+           nil)
+
           (t
            ;; No suffix matched.  We might have matched the
            ;; identifier as a type and the open paren of a
@@ -10870,9 +10883,17 @@ This function might do hidden buffer changes."
                     (not (memq context '(arglist decl))))
                 (or (and new-style-auto
                          (looking-at c-auto-ops-re))
-                    (and (or maybe-typeless backup-maybe-typeless)
-                         (not got-prefix)
-                         at-type)))
+                    (and (not got-prefix)
+                         at-type
+                         (or maybe-typeless backup-maybe-typeless
+                             ;; Do we have a (typeless) constructor?
+                             (and got-stmt-block
+                                  (save-excursion
+                                    (goto-char type-start)
+                                    (and
+                                     (looking-at c-identifier-key)
+                                     (c-directly-in-class-called-p
+                                      (match-string 0)))))))))
        ;; Have found no identifier but `c-typeless-decl-kwds' has
        ;; matched so we know we're inside a declaration.  The
        ;; preceding type must be the identifier instead.
@@ -12554,7 +12575,8 @@ comment at the start of cc-engine.el for more info."
                   (looking-at c-class-key))
          (goto-char (match-end 1))
          (c-forward-syntactic-ws)
-         (looking-at name))))))
+         (and (looking-at c-identifier-key)
+              (string= (match-string 0) name)))))))
 
 (defun c-search-uplist-for-classkey (paren-state)
   ;; Check if the closest containing paren sexp is a declaration



reply via email to

[Prev in Thread] Current Thread [Next in Thread]