Function: semantic-parse-region-c-mode
semantic-parse-region-c-mode is a byte-compiled function defined in
c.el.gz.
Signature
(semantic-parse-region-c-mode START END &optional NONTERMINAL DEPTH RETURNONERROR)
Documentation
Calls semantic-parse-region-default, except in a macro expansion.
MACRO expansion mode is handled through the nature of Emacs's non-lexical
binding of variables.
START, END, NONTERMINAL, DEPTH, and RETURNONERRORS are the same
as for the parent.
Override semantic-parse-region in c-mode buffers.
Source Code
;; Defined in /usr/src/emacs/lisp/cedet/semantic/bovine/c.el.gz
(define-mode-local-override semantic-parse-region c-mode
(start end &optional nonterminal depth returnonerror)
"Calls `semantic-parse-region-default', except in a macro expansion.
MACRO expansion mode is handled through the nature of Emacs's non-lexical
binding of variables.
START, END, NONTERMINAL, DEPTH, and RETURNONERRORS are the same
as for the parent."
;; FIXME: We shouldn't depend on the internals of `semantic-bovinate-stream'.
(with-suppressed-warnings ((lexical lse)) (defvar lse))
(if (and (boundp 'lse) (or (/= start (point-min)) (/= end (point-max))))
(let* ((last-lexical-token lse)
(llt-class (semantic-lex-token-class last-lexical-token))
(llt-fakebits (car (cdr last-lexical-token)))
(macroexpand (stringp (car (cdr last-lexical-token)))))
(if macroexpand
(progn
;; It is a macro expansion. Do something special.
;;(message "MOOSE %S %S, %S : %S" start end nonterminal lse)
(semantic-c-parse-lexical-token
lse nonterminal depth returnonerror)
)
;; Not a macro expansion, but perhaps a funny semantic-list
;; is at the start? Remove the depth if our semantic list is not
;; made of list tokens.
(if (and depth (= depth 1)
(eq llt-class 'semantic-list)
(not (null llt-fakebits))
(consp llt-fakebits)
(symbolp (car llt-fakebits))
)
(progn
(setq depth 0)
;; This is a copy of semantic-parse-region-default where we
;; are doing something special with the lexing of the
;; contents of the semantic-list token. Stuff not used by C
;; removed.
(let ((tokstream
(if (and (consp llt-fakebits)
(eq (car llt-fakebits) 'prefix-fake-plus))
;; If our semantic-list is special, then only stick in the
;; fake tokens.
(cdr llt-fakebits)
;; Lex up the region with a depth of 0
(semantic-lex start end 0))))
;; Do the parse
(nreverse
(semantic-repeat-parse-whole-stream tokstream
nonterminal
returnonerror))
))
;; It was not a macro expansion, nor a special semantic-list.
;; Do old thing.
(semantic-parse-region-default start end
nonterminal depth
returnonerror)
)))
;; Do the parse
(semantic-parse-region-default start end nonterminal
depth returnonerror)
))