;;; cc-menus.el --- imenu support for CC Mode
-;; Copyright (C) 1985, 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-;; 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1985, 1987, 1992-2011 Free Software Foundation, Inc.
;; Authors: 1998- Martin Stjernholm
;; 1992-1999 Barry A. Warsaw
-;; 1987 Dave Detlefs and Stewart Clamen
+;; 1987 Dave Detlefs
+;; 1987 Stewart Clamen
;; 1985 Richard M. Stallman
;; Maintainer: bug-cc-mode@gnu.org
;; Created: 22-Apr-1997 (split from cc-mode.el)
-;; Version: See cc-mode.el
-;; Keywords: c languages oop
+;; Keywords: c languages
+;; Package: cc-mode
;; This file is part of GNU Emacs.
-;; GNU Emacs is free software; you can redistribute it and/or modify
+;; GNU Emacs is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 3, or (at your option)
-;; any later version.
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
-;; along with this program; see the file COPYING. If not, write to
-;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-;; Boston, MA 02110-1301, USA.
+;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
(cc-bytecomp-defvar imenu-case-fold-search)
(cc-bytecomp-defvar imenu-generic-expression)
(cc-bytecomp-defvar imenu-create-index-function)
-(cc-bytecomp-defun imenu-progress-message)
\f
;; imenu integration
"[ \t]*([^)]*)[ \t]*)[ \t]*[^ \t;]" ; see above
) 1)))
;; Class definitions
- ("Class"
+ ("Class"
,(concat
"^" ; beginning of line is required
"\\(template[ \t]*<[^>]+>[ \t]*\\)?" ; there may be a `template <...>'
"\\([ \t\n]\\|\\\\\n\\)*[:{]"
) 3))
"Imenu generic expression for C++ mode. See `imenu-generic-expression'.")
-
+
(defvar cc-imenu-c-generic-expression
cc-imenu-c++-generic-expression
"Imenu generic expression for C mode. See `imenu-generic-expression'.")
(defvar cc-imenu-java-generic-expression
`((nil
,(concat
- "[" c-alpha "_][\]\[." c-alnum "_]+[ \t\n\r]+" ; type spec
- "\\([" c-alpha "_][" c-alnum "_]+\\)" ; method name
+ "[" c-alpha "_][\]\[." c-alnum "_<> ]+[ \t\n\r]+" ; type spec
+ "\\([" c-alpha "_][" c-alnum "_]*\\)" ; method name
"[ \t\n\r]*"
- ;; An argument list that is either empty or contains at least
- ;; two identifiers with only space between them. This avoids
- ;; matching e.g. "else if (foo)".
- (concat "([ \t\n\r]*"
- "\\([\]\[.," c-alnum "_]+"
- "[ \t\n\r]+"
- "[\]\[.," c-alnum "_]"
- "[\]\[.," c-alnum "_ \t\n\r]*"
- "\\)?)")
- "[.," c-alnum "_ \t\n\r]*"
- "{"
- ) 1))
- "Imenu generic expression for Java mode. See `imenu-generic-expression'.")
-
-;; *Warning for cc-mode developers*
+ ;; An argument list htat is either empty or contains any number
+ ;; of arguments. An argument is any number of annotations
+ ;; followed by a type spec followed by a word. A word is an
+ ;; identifier. A type spec is an identifier, possibly followed
+ ;; by < typespec > possibly followed by [].
+ (concat "("
+ "\\("
+ "[ \t\n\r]*"
+ "\\("
+ "@"
+ "[" c-alpha "_]"
+ "[" c-alnum "._]""*"
+ "[ \t\n\r]+"
+ "\\)*"
+ "\\("
+ "[" c-alpha "_]"
+ "[\]\[" c-alnum "_.]*"
+ "\\("
+
+ "<"
+ "[ \t\n\r]*"
+ "[\]\[.," c-alnum "_<> \t\n\r]*"
+ ">"
+ "\\)?"
+ "\\(\\[\\]\\)?"
+ "[ \t\n\r]+"
+ "\\)"
+ "[" c-alpha "_]"
+ "[" c-alnum "_]*"
+ "[ \t\n\r,]*"
+ "\\)*"
+ ")"
+ "[.," c-alnum " \t\n\r]*"
+ "{"
+ )) 1))
+ "Imenu generic expression for Java mode. See
+`imenu-generic-expression'.")
+
+;; *Warning for cc-mode developers*
;;
;; `cc-imenu-objc-generic-expression' elements depend on
;; `cc-imenu-c++-generic-expression'. So if you change this
;; order to know where the each regexp *group \\(foobar\\)* elements
;; are started.
;;
-;; *-index variables are initialized during `cc-imenu-objc-generic-expression'
-;; being initialized.
+;; *-index variables are initialized during `cc-imenu-objc-generic-expression'
+;; being initialized.
;;
;; Internal variables
(defvar cc-imenu-objc-generic-expression-proto-index nil)
(defvar cc-imenu-objc-generic-expression-objc-base-index nil)
-(defvar cc-imenu-objc-generic-expression
- (concat
+(defvar cc-imenu-objc-generic-expression
+ (concat
;;
- ;; For C
+ ;; For C
;;
;; > Special case to match a line like `main() {}'
;; > e.g. no return type, not even on the previous line.
;; > `int main _PROTO( (int argc,char *argv[]) )'.
;; Pick a token by (match-string 8)
(if cc-imenu-c-prototype-macro-regexp
- (concat
+ (concat
"\\|"
(car (cdr (nth 3 cc-imenu-c++-generic-expression))) ; -> index += 1
(prog2 (setq cc-imenu-objc-generic-expression-objc-base-index 9) "")
;; For Objective-C
;; Pick a token by (match-string 8 or 9)
;;
- "\\|\\("
+ "\\|\\("
"^[-+][:" c-alnum "()*_<>\n\t ]*[;{]" ; Methods
- "\\|"
+ "\\|"
"^@interface[\t ]+[" c-alnum "_]+[\t ]*:"
- "\\|"
+ "\\|"
"^@interface[\t ]+[" c-alnum "_]+[\t ]*([" c-alnum "_]+)"
- "\\|"
+ "\\|"
;; For NSObject, NSProxy and Object... They don't have super class.
"^@interface[\t ]+[" c-alnum "_]+[\t ]*.*$"
- "\\|"
+ "\\|"
"^@implementation[\t ]+[" c-alnum "_]+[\t ]*([" c-alnum "_]+)"
- "\\|"
+ "\\|"
"^@implementation[\t ]+[" c-alnum "_]+"
- "\\|"
+ "\\|"
"^@protocol[\t ]+[" c-alnum "_]+" "\\)")
"Imenu generic expression for ObjC mode. See `imenu-generic-expression'.")
;; Imenu support for objective-c uses functions.
(defsubst cc-imenu-objc-method-to-selector (method)
"Return the objc selector style string of METHOD.
-Example:
+Example:
- perform: (SEL)aSelector withObject: object1 withObject: object2; /* METHOD */
=>
-perform:withObject:withObject:withObject: /* selector */"
(let ((return "") ; String to be returned
- (p 0) ; Current scanning position in METHOD
- (pmax (length method)) ;
+ (p 0) ; Current scanning position in METHOD
+ (pmax (length method)) ;
char ; Current scanning target
(betweenparen 0) ; CHAR is in parentheses.
argreq ; An argument is required.
(and (<= ?A char) (<= char ?Z))
(and (<= ?0 char) (<= char ?9))
(= ?_ char)))
- (if argreq
+ (if argreq
(setq inargvar t
argreq nil)
(setq return (concat return (char-to-string char)))))
;; Or a white space?
- ((and inargvar (or (eq ?\ char) (eq ?\n char))
+ ((and inargvar (or (eq ?\ char) (eq ?\n char))
(setq inargvar nil)))
;; Or a method separator?
;; If a method separator, the next token will be an argument variable.
- ((eq ?: char)
- (setq argreq t
+ ((eq ?: char)
+ (setq argreq t
return (concat return (char-to-string char))))
;; Or an open parentheses?
((eq ?\( char)
"Remove all spaces and tabs from STR."
(let ((return "")
(p 0)
- (max (length str))
+ (max (length str))
char)
(while (< p max)
(setq char (aref str p))
return))
(defun cc-imenu-objc-function ()
- "imenu supports for objc-mode."
+ "Imenu support for Objective C mode."
(let (methodlist
clist
;;
;; OBJC, Cnoreturn, Cgeneralfunc, Cproto are constants.
;;
- ;; *Warning for developers*
+ ;; *Warning for developers*
;; These constants depend on `cc-imenu-c++-generic-expression'.
;;
(OBJC cc-imenu-objc-generic-expression-objc-base-index)
;;
(classcount 0)
toplist
- stupid
str
- str2
+ str2
(intflen (length "@interface"))
(implen (length "@implementation"))
(prtlen (length "@protocol"))
(func
;;
- ;; Does this emacs has buffer-substring-no-properties?
+ ;; Does this emacs have buffer-substring-no-properties?
;;
(if (fboundp 'buffer-substring-no-properties)
'buffer-substring-no-properties
'buffer-substring)))
(goto-char (point-max))
- (imenu-progress-message stupid 0)
;;
(while (re-search-backward cc-imenu-objc-generic-expression nil t)
- (imenu-progress-message stupid)
- (setq langnum (if (match-beginning OBJC)
+ (setq langnum (if (match-beginning OBJC)
OBJC
(cond
((match-beginning Cproto) Cproto)
((match-beginning Cnoreturn) Cnoreturn))))
(setq str (funcall func (match-beginning langnum) (match-end langnum)))
;;
- (cond
+ (cond
;;
;; C
;;
(setq clist (cons (cons str (match-beginning langnum)) clist)))
;;
;; ObjC
- ;;
+ ;;
;; An instance Method
((eq (aref str 0) ?-)
(setq str (concat "-" (cc-imenu-objc-method-to-selector str)))
(setq methodlist (cons (cons str
(match-beginning langnum))
methodlist)))
- ;; Interface or implementation or protocol
+ ;; Interface or implementation or protocol
((eq (aref str 0) ?@)
(setq classcount (1+ classcount))
- (cond
+ (cond
((and (> (length str) implen)
(string= (substring str 0 implen) "@implementation"))
(setq str (substring str implen)
(setq toplist (cons nil (cons (cons str
methodlist) toplist))
methodlist nil))))
- ;;
- (imenu-progress-message stupid 100)
+ ;;
(if (eq (car toplist) nil)
(setq toplist (cdr toplist)))
\f
(cc-provide 'cc-menus)
-;; arch-tag: f6b60933-91f0-4145-ab44-70ca6d1b919b
;;; cc-menus.el ends here