Hi Eric,
Following our discussion about mode local variables, here is a patch
to semantic-fw.el and bovine/semantic-el.el that implements
inheritance of semantic behavior between modes.
I finally adopted the name `define-semantic-child-mode' in place of
`define-semantic-inherited-mode', because I found that name simple,
clear and shorter ;-)
I tested it with some Common Lisp files, and it seems to work as
expected :-) However there is a limitation due to the use of the Elisp
reader to parse Lisp syntax. It fails to read forms that contain Lisp
characters like #\, with an (invalid-read-syntax "#") error. Perhaps
have you an idea on how to workaround that?
What do you think?
David
Index: semantic/semantic-fw.el
===================================================================
RCS file: /cvsroot/cedet/cedet/semantic/semantic-fw.el,v
retrieving revision 1.20
diff -c -r1.20 semantic-fw.el
*** semantic/semantic-fw.el 4 Apr 2003 14:37:18 -0000 1.20
--- semantic/semantic-fw.el 22 Jul 2003 09:19:48 -0000
***************
*** 157,162 ****
--- 157,185 ----
;;; Core Semantic bindings API
;;
+ (defsubst semantic-set-parent-mode (mode parent)
+ "Set parent of major mode MODE to PARENT mode.
+ To work properly, this function should be called after PARENT mode
+ local variables have been defined."
+ (put mode 'semantic-mode-parent parent)
+ ;; Refresh mode bindings to get mode local variables inherited from
+ ;; PARENT. To work properly, the following should be called after
+ ;; PARENT mode local variables have been defined.
+ (semantic-map-mode-buffers mode 'semantic-activate-mode-bindings))
+
+ (defsubst semantic-get-parent-mode (mode)
+ "Return the mode parent of the major mode MODE.
+ Return nil if MODE has no parent."
+ (or (get mode 'semantic-mode-parent)
+ (get mode 'derived-mode-parent)))
+
+ (defmacro define-semantic-child-mode (mode parent &optional docstring)
+ "Make major mode MODE inherits semantic behavior from PARENT mode.
+ DOCSTRING is optional and not used.
+ To work properly, this should be put after PARENT mode local variables
+ definition."
+ `(semantic-set-parent-mode ',mode ',parent))
+
(defvar semantic-symbol-table nil
"Buffer local semantic obarray.
These symbols provide a hook for a `major-mode' to specify specific
***************
*** 174,180 ****
mode major-mode))
(while (and mode (not table))
(or (setq table (get mode 'semantic-symbol-table))
! (setq mode (get mode 'derived-mode-parent))))
table))
(defun semantic-new-bindings (&optional table)
--- 197,203 ----
mode major-mode))
(while (and mode (not table))
(or (setq table (get mode 'semantic-symbol-table))
! (setq mode (semantic-get-parent-mode mode))))
table))
(defun semantic-new-bindings (&optional table)
***************
*** 517,522 ****
--- 540,546 ----
"define-lex-regex-analyzer"
"define-lex-simple-regex-analyzer"
"define-mode-overload-implementation"
+ "define-semantic-child-mode"
"define-overload"
"define-wisent-lexer"
"semantic-alias-obsolete"
Index: semantic/bovine/semantic-el.el
===================================================================
RCS file: /cvsroot/cedet/cedet/semantic/bovine/semantic-el.el,v
retrieving revision 1.12
diff -c -r1.12 semantic-el.el
*** semantic/bovine/semantic-el.el 6 Apr 2003 01:06:50 -0000 1.12
--- semantic/bovine/semantic-el.el 22 Jul 2003 09:19:49 -0000
***************
*** 443,448 ****
--- 443,451 ----
(defvar-mode-local emacs-lisp-mode imenu-create-index-function
'semantic-create-imenu-index)
+ (define-semantic-child-mode lisp-mode emacs-lisp-mode
+ "Make `lisp-mode' inherits semantic behavior from `emacs-lisp-mode'.")
+
;;;###autoload
(defun semantic-default-elisp-setup ()
"Setup hook function for Emacs Lisp files and Semantic."
***************
*** 450,455 ****
--- 453,460 ----
;;;###autoload
(add-hook 'emacs-lisp-mode-hook 'semantic-default-elisp-setup)
+ ;;;###autoload
+ (add-hook 'lisp-mode-hook 'semantic-default-elisp-setup)
;;;###autoload
(eval-after-load "semanticdb"
|