Subject: bug#11142: 24.0.94; objc-mode fails for imenu and which-function-mode

From: Alan Mackenzie <[email-masked]>
Date: Fri, 6 Apr 2012 17:11:54 +0000

Hi, Leo.

On Thu, Apr 05, 2012 at 07:18:59PM +0800, Leo wrote:
> On 2012-04-05 00:18 +0800, Stefan Monnier wrote:
> > That's partly normal: objc-mode is not in `which-func-modes'.
> > But if you add `objc-mode' to which-func-modes, indeed the function name
> > still doesn't show up in the mode-line (whereas it did in Emacs-23, so
> > this is a regression).

> >> Also, M-x imenu-add-menubar-index says: Error in
> >> menu-bar-update-hook (imenu-update-menubar): (wrong-type-argument
> >> integerp nil)

> > I can indeed reproduce it (I used the src/nsfont.m file as sample ObjC file).

> > Hopefully Alan can figure it out

> It seems the bug was brought in by commit

> ------------------------------------------------------------
> revno: 105590
> committer: Alan Mackenzie <[email-masked]>
> branch nick: trunk
> timestamp: Sat 2011-08-27 08:41:23 +0000
> message:
>   progmodes/cc-menus.el (cc-imenu-c++-generic-expression): Make it handle
>   function pointer parameters properly.

> which increases the number of grouped matches by 1 and the sad fact that
> cc-imenu-objc-generic-expression-*-index dependent on that.

Brilliant diagnosis, absolutely right!  Thanks.  There're some pretty
non-standard coding techniques in that file.  ;-)

Here's the final bit of the fix; please try it out if you haven't done
already, and let me know whether it works fully.

> BTW, the warning

> ,----
> | ;;                        *Warning for cc-mode developers*
> | ;;
> | ;; `cc-imenu-objc-generic-expression' elements depend on
> | ....
> `----

> should be placed in front of cc-imenu-c++-generic-expression to be of
> any use.

Yes indeed.

> Leo

diff -r 4b03c7ef6cf2 cc-menus.el
--- a/cc-menus.el	Tue Apr 03 20:57:45 2012 +0000
+++ b/cc-menus.el	Fri Apr 06 17:03:33 2012 +0000
@@ -223,7 +223,7 @@
    "\\|"
    ;; > General function name regexp
    ;; Pick a token by  (match-string 3)
-   (car (cdr (nth 2 cc-imenu-c++-generic-expression))) ; -> index += 5
+   (car (cdr (nth 2 cc-imenu-c++-generic-expression))) ; -> index += 6
    (prog2 (setq cc-imenu-objc-generic-expression-general-func-index 3) "")
    ;; > Special case for definitions using phony prototype macros like:
    ;; > `int main _PROTO( (int argc,char *argv[]) )'.
@@ -232,11 +232,11 @@
        (concat
 	"\\|"
 	(car (cdr (nth 3 cc-imenu-c++-generic-expression))) ; -> index += 1
-	(prog2 (setq cc-imenu-objc-generic-expression-objc-base-index 9) "")
+	(prog2 (setq cc-imenu-objc-generic-expression-objc-base-index 10) "")
 	)
-     (prog2 (setq cc-imenu-objc-generic-expression-objc-base-index 8) "")
+     (prog2 (setq cc-imenu-objc-generic-expression-objc-base-index 9) "")
      "")				; -> index += 0
-   (prog2 (setq cc-imenu-objc-generic-expression-proto-index 8) "")
+   (prog2 (setq cc-imenu-objc-generic-expression-proto-index 9) "")
    ;;
    ;; For Objective-C
    ;; Pick a token by (match-string 8 or 9)

-- 
Alan Mackenzie (Nuremberg, Germany).