X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/c63ae7f26e474174c0f22f5d1615bf15b68099a2..f3f4e600399fdd8bf0a23e50b7704825145fddc4:/lisp/progmodes/cc-menus.el diff --git a/lisp/progmodes/cc-menus.el b/lisp/progmodes/cc-menus.el index 7fbe653b6a..b925d1e653 100644 --- a/lisp/progmodes/cc-menus.el +++ b/lisp/progmodes/cc-menus.el @@ -1,11 +1,13 @@ ;;; cc-menus.el --- imenu support for CC Mode -;; Copyright (C) 1985,87,92,93,94,95,96,97,98 Free Software Foundation, Inc. +;; Copyright (C) 1985,1987,1992-2003, 2004, 2005, 2006 Free Software +;; Foundation, Inc. -;; Authors: 1992-1997 Barry A. Warsaw +;; Authors: 1998- Martin Stjernholm +;; 1992-1999 Barry A. Warsaw ;; 1987 Dave Detlefs and Stewart Clamen ;; 1985 Richard M. Stallman -;; Maintainer: cc-mode-help@python.org +;; Maintainer: bug-cc-mode@gnu.org ;; Created: 22-Apr-1997 (split from cc-mode.el) ;; Version: See cc-mode.el ;; Keywords: c languages oop @@ -23,14 +25,32 @@ ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. +;; 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. + +;;; Commentary: + +;;; Code: + +(eval-when-compile + (let ((load-path + (if (and (boundp 'byte-compile-dest-file) + (stringp byte-compile-dest-file)) + (cons (file-name-directory byte-compile-dest-file) load-path) + load-path))) + (load "cc-bytecomp" nil t))) + +(cc-require 'cc-defs) + +;; The things referenced in imenu, which we don't require. +(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) ;; imenu integration -(eval-when-compile (require 'imenu)) - (defvar cc-imenu-c-prototype-macro-regexp nil "RE matching macro names used to conditionally specify function prototypes. @@ -47,19 +67,17 @@ For example: A sample value might look like: `\\(_P\\|_PROTO\\)'.") (defvar cc-imenu-c++-generic-expression - (` - ( + `( ;; Try to match ::operator definitions first. Otherwise `X::operator new ()' ;; will be incorrectly recognised as function `new ()' because the regexps ;; work by backtracking from the end of the definition. (nil - (, - (concat + ,(concat "^\\<.*" - "[^a-zA-Z0-9_:<>~]" ; match any non-identifier char + "[^" c-alnum "_:<>~]" ; match any non-identifier char ; (note: this can be `\n') "\\(" - "\\([a-zA-Z0-9_:<>~]*::\\)?" ; match an operator + "\\([" c-alnum "_:<>~]*::\\)?" ; match an operator "operator\\>[ \t]*" "\\(()\\|[^(]*\\)" ; special case for `()' operator "\\)" @@ -72,54 +90,55 @@ A sample value might look like: `\\(_P\\|_PROTO\\)'.") ; the parentheses surrounding ; the parameters. e.g.: ; `int foo(int a=bar()) {...}' - )) 1) + ) 1) ;; Special case to match a line like `main() {}' ;; e.g. no return type, not even on the previous line. (nil - (, - (concat + ,(concat "^" - "\\([a-zA-Z_][a-zA-Z0-9_:<>~]*\\)" ; match function name + "\\([" c-alpha "_][" c-alnum "_:<>~]*\\)" ; match function name "[ \t]*(" ; see above, BUT "[ \t]*\\([^ \t(*][^)]*\\)?)" ; the arg list must not start "[ \t]*[^ \t;(]" ; with an asterisk or parentheses - )) 1) + ) 1) ;; General function name regexp (nil - (, - (concat - "^\\<.*" ; line MUST start with word char - "[^a-zA-Z0-9_:<>~]" ; match any non-identifier char - "\\([a-zA-Z_][a-zA-Z0-9_:<>~]*\\)" ; match function name - "[ \t]*(" ; see above, BUT - "[ \t]*\\([^ \t(*][^)]*\\)?)" ; the arg list must not start - "[ \t]*[^ \t;(]" ; with an asterisk or parentheses - )) 1) + ,(concat + "^\\<" ; line MUST start with word char + "[^()]*" ; no parentheses before + "[^" c-alnum "_:<>~]" ; match any non-identifier char + "\\([" c-alpha "_][" c-alnum "_:<>~]*\\)" ; match function name + "\\([ \t\n]\\|\\\\\n\\)*(" ; see above, BUT the arg list + "\\([ \t\n]\\|\\\\\n\\)*\\([^ \t\n(*][^)]*\\)?)" ; must not start + "\\([ \t\n]\\|\\\\\n\\)*[^ \t\n;(]" ; with an asterisk or parentheses + ) 1) ;; Special case for definitions using phony prototype macros like: ;; `int main _PROTO( (int argc,char *argv[]) )'. ;; This case is only included if cc-imenu-c-prototype-macro-regexp is set. ;; Only supported in c-code, so no `:<>~' chars in function name! - (,@ (if cc-imenu-c-prototype-macro-regexp - (` ((nil - (, - (concat + ,@(if cc-imenu-c-prototype-macro-regexp + `((nil + ,(concat "^\\<.*" ; line MUST start with word char - "[^a-zA-Z0-9_]" ; match any non-identifier char - "\\([a-zA-Z_][a-zA-Z0-9_]*\\)" ; match function name + "[^" c-alnum "_]" ; match any non-identifier char + "\\([" c-alpha "_][" c-alnum "_]*\\)" ; match function name "[ \t]*" ; whitespace before macro name cc-imenu-c-prototype-macro-regexp "[ \t]*(" ; ws followed by first paren. "[ \t]*([^)]*)[ \t]*)[ \t]*[^ \t;]" ; see above - )) 1))))) + ) 1))) ;; Class definitions ("Class" - (, (concat + ,(concat "^" ; beginning of line is required "\\(template[ \t]*<[^>]+>[ \t]*\\)?" ; there may be a `template <...>' - "class[ \t]+" - "\\([a-zA-Z0-9_]+\\)" ; the string we want to get - "[ \t]*[:{]" - )) 2))) + "\\(class\\|struct\\)[ \t]+" + "\\(" ; the string we want to get + "[" c-alnum "_]+" ; class name + "\\(<[^>]+>\\)?" ; possibly explicitly specialized + "\\)" + "\\([ \t\n]\\|\\\\\n\\)*[:{]" + ) 3)) "Imenu generic expression for C++ mode. See `imenu-generic-expression'.") (defvar cc-imenu-c-generic-expression @@ -127,22 +146,23 @@ A sample value might look like: `\\(_P\\|_PROTO\\)'.") "Imenu generic expression for C mode. See `imenu-generic-expression'.") (defvar cc-imenu-java-generic-expression - (` - ((nil - (, - (concat - "^\\([ \t]\\)*" - "\\([A-Za-z0-9_-]+[ \t]+\\)?" ; type specs; there can be - "\\([A-Za-z0-9_-]+[ \t]+\\)?" ; more than 3 tokens, right? - "\\([A-Za-z0-9_-]+[ \t]*[[]?[]]?\\)" - "\\([ \t]\\)" - "\\([A-Za-z0-9_-]+\\)" ; the string we want to get - "\\([ \t]*\\)(" - "\\([][a-zA-Z,_1-9\n \t]*\\)" ; arguments - ")[ \t]*" -; "[^;(]" - "[,a-zA-Z_1-9\n \t]*{" - )) 6))) + `((nil + ,(concat + "[" 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* @@ -178,39 +198,39 @@ A sample value might look like: `\\(_P\\|_PROTO\\)'.") "\\|" ;; > General function name regexp ;; Pick a token by (match-string 3) - (car (cdr (nth 2 cc-imenu-c++-generic-expression))) ; -> index += 2 + (car (cdr (nth 2 cc-imenu-c++-generic-expression))) ; -> index += 5 (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[]) )'. - ;; Pick a token by (match-string 5) + ;; Pick a token by (match-string 8) (if cc-imenu-c-prototype-macro-regexp (concat "\\|" (car (cdr (nth 3 cc-imenu-c++-generic-expression))) ; -> index += 1 - (prog2 (setq cc-imenu-objc-generic-expression-objc-base-index 6) "") + (prog2 (setq cc-imenu-objc-generic-expression-objc-base-index 9) "") ) - (prog2 (setq cc-imenu-objc-generic-expression-objc-base-index 5) "") + (prog2 (setq cc-imenu-objc-generic-expression-objc-base-index 8) "") "") ; -> index += 0 - (prog2 (setq cc-imenu-objc-generic-expression-proto-index 5) "") + (prog2 (setq cc-imenu-objc-generic-expression-proto-index 8) "") ;; ;; For Objective-C - ;; Pick a token by (match-string 5 or 6) + ;; Pick a token by (match-string 8 or 9) ;; "\\|\\(" - "^[-+][:a-zA-Z0-9()*_<>\n\t ]*[;{]" ; Methods + "^[-+][:" c-alnum "()*_<>\n\t ]*[;{]" ; Methods "\\|" - "^@interface[\t ]+[a-zA-Z0-9_]+[\t ]*:" + "^@interface[\t ]+[" c-alnum "_]+[\t ]*:" "\\|" - "^@interface[\t ]+[a-zA-Z0-9_]+[\t ]*([a-zA-Z0-9_]+)" + "^@interface[\t ]+[" c-alnum "_]+[\t ]*([" c-alnum "_]+)" "\\|" ;; For NSObject, NSProxy and Object... They don't have super class. - "^@interface[\t ]+[a-zA-Z0-9_]+[\t ]*.*$" + "^@interface[\t ]+[" c-alnum "_]+[\t ]*.*$" "\\|" - "^@implementation[\t ]+[a-zA-Z0-9_]+[\t ]*([a-zA-Z0-9_]+)" + "^@implementation[\t ]+[" c-alnum "_]+[\t ]*([" c-alnum "_]+)" "\\|" - "^@implementation[\t ]+[a-zA-Z0-9_]+" + "^@implementation[\t ]+[" c-alnum "_]+" "\\|" - "^@protocol[\t ]+[a-zA-Z0-9_]+" "\\)") + "^@protocol[\t ]+[" c-alnum "_]+" "\\)") "Imenu generic expression for ObjC mode. See `imenu-generic-expression'.") @@ -307,7 +327,7 @@ Example: (if (fboundp 'buffer-substring-no-properties) 'buffer-substring-no-properties 'buffer-substring))) - (goto-char (point-max)) + (goto-char (point-max)) (imenu-progress-message stupid 0) ;; (while (re-search-backward cc-imenu-objc-generic-expression nil t) @@ -381,11 +401,25 @@ Example: (setq last (cdr last))) (setcdr last clist)))) ;; Add C lang tokens as a sub menu - (setq toplist (cons (cons "C" clist) toplist))) + (if clist + (setq toplist (cons (cons "C" clist) toplist)))) ;; toplist )) +;(defvar cc-imenu-pike-generic-expression +; ()) +; FIXME: Please contribute one! + +(defun cc-imenu-init (mode-generic-expression + &optional mode-create-index-function) + (setq imenu-generic-expression mode-generic-expression + imenu-case-fold-search nil) + (when mode-create-index-function + (setq imenu-create-index-function mode-create-index-function))) + -(provide 'cc-menus) +(cc-provide 'cc-menus) + +;;; arch-tag: f6b60933-91f0-4145-ab44-70ca6d1b919b ;;; cc-menus.el ends here