* files-x.el (modify-dir-local-variable)
[emacs.git] / lisp / cedet / semantic / bovine / c.el
blob8a773583aee50411920df8a7887f7eeedeaf9660
1 ;;; semantic/bovine/c.el --- Semantic details for C
3 ;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
4 ;; 2008, 2009 Free Software Foundation, Inc.
6 ;; Author: Eric M. Ludlam <zappo@gnu.org>
8 ;; This file is part of GNU Emacs.
10 ;; GNU Emacs is free software: you can redistribute it and/or modify
11 ;; it under the terms of the GNU General Public License as published by
12 ;; the Free Software Foundation, either version 3 of the License, or
13 ;; (at your option) any later version.
15 ;; GNU Emacs is distributed in the hope that it will be useful,
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 ;; GNU General Public License for more details.
20 ;; You should have received a copy of the GNU General Public License
21 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
23 ;;; Commentary:
25 ;; Support for the C/C++ bovine parser for Semantic.
27 ;; @todo - can I support c++-font-lock-extra-types ?
29 (require 'semantic)
30 (require 'semantic/analyze)
31 (require 'semantic/bovine/gcc)
32 (require 'semantic/idle)
33 (require 'semantic/lex-spp)
34 (require 'semantic/bovine/c-by)
36 (eval-when-compile
37 (require 'semantic/find))
39 (declare-function semantic-brute-find-tag-by-attribute "semantic/find")
40 (declare-function semanticdb-minor-mode-p "semantic/db-mode")
41 (declare-function semanticdb-needs-refresh-p "semantic/db")
42 (declare-function c-forward-conditional "cc-cmds")
43 (declare-function ede-system-include-path "ede")
45 ;;; Compatibility
47 (eval-when-compile (require 'cc-mode))
49 (if (fboundp 'c-end-of-macro)
50 (eval-and-compile
51 (defalias 'semantic-c-end-of-macro 'c-end-of-macro))
52 ;; From cc-mode 5.30
53 (defun semantic-c-end-of-macro ()
54 "Go to the end of a preprocessor directive.
55 More accurately, move point to the end of the closest following line
56 that doesn't end with a line continuation backslash.
58 This function does not do any hidden buffer changes."
59 (while (progn
60 (end-of-line)
61 (when (and (eq (char-before) ?\\)
62 (not (eobp)))
63 (forward-char)
64 t))))
67 ;;; Code:
68 (define-child-mode c++-mode c-mode
69 "`c++-mode' uses the same parser as `c-mode'.")
72 ;;; Include Paths
74 (defcustom-mode-local-semantic-dependency-system-include-path
75 c-mode semantic-c-dependency-system-include-path
76 '("/usr/include")
77 "The system include path used by the C langauge.")
79 (defcustom semantic-default-c-path nil
80 "Default set of include paths for C code.
81 Used by `semantic-dep' to define an include path.
82 NOTE: In process of obsoleting this."
83 :group 'c
84 :group 'semantic
85 :type '(repeat (string :tag "Path")))
87 (defvar-mode-local c-mode semantic-dependency-include-path
88 semantic-default-c-path
89 "System path to search for include files.")
91 ;;; Compile Options
93 ;; Compiler options need to show up after path setup, but before
94 ;; the preprocessor section.
96 (when (member system-type '(gnu gnu/linux darwin cygwin))
97 (semantic-gcc-setup))
99 ;;; Pre-processor maps
101 ;;; Lexical analysis
102 (defvar semantic-lex-c-preprocessor-symbol-map-builtin
103 '( ("__THROW" . "")
104 ("__const" . "const")
105 ("__restrict" . "")
106 ("__declspec" . ((spp-arg-list ("foo") 1 . 2)))
107 ("__attribute__" . ((spp-arg-list ("foo") 1 . 2)))
109 "List of symbols to include by default.")
111 (defvar semantic-c-in-reset-preprocessor-table nil
112 "Non-nil while resetting the preprocessor symbol map.
113 Used to prevent a reset while trying to parse files that are
114 part of the preprocessor map.")
116 (defvar semantic-lex-c-preprocessor-symbol-file)
117 (defvar semantic-lex-c-preprocessor-symbol-map)
119 (defun semantic-c-reset-preprocessor-symbol-map ()
120 "Reset the C preprocessor symbol map based on all input variables."
121 (when (featurep 'semantic/bovine/c)
122 (let ((filemap nil)
124 (when (and (not semantic-c-in-reset-preprocessor-table)
125 (featurep 'semantic/db-mode)
126 (semanticdb-minor-mode-p))
127 (let ( ;; Don't use external parsers. We need the internal one.
128 (semanticdb-out-of-buffer-create-table-fcn nil)
129 ;; Don't recurse while parsing these files the first time.
130 (semantic-c-in-reset-preprocessor-table t)
132 (dolist (sf semantic-lex-c-preprocessor-symbol-file)
133 ;; Global map entries
134 (let* ((table (semanticdb-file-table-object sf t)))
135 (when table
136 (when (semanticdb-needs-refresh-p table)
137 (condition-case nil
138 ;; Call with FORCE, as the file is very likely to
139 ;; not be in a buffer.
140 (semanticdb-refresh-table table t)
141 (error (message "Error updating tables for %S"
142 (object-name table)))))
143 (setq filemap (append filemap (oref table lexical-table)))
145 ))))
147 (setq-mode-local c-mode
148 semantic-lex-spp-macro-symbol-obarray
149 (semantic-lex-make-spp-table
150 (append semantic-lex-c-preprocessor-symbol-map-builtin
151 semantic-lex-c-preprocessor-symbol-map
152 filemap))
156 (defcustom semantic-lex-c-preprocessor-symbol-map nil
157 "Table of C Preprocessor keywords used by the Semantic C lexer.
158 Each entry is a cons cell like this:
159 ( \"KEYWORD\" . \"REPLACEMENT\" )
160 Where KEYWORD is the macro that gets replaced in the lexical phase,
161 and REPLACEMENT is a string that is inserted in it's place. Empty string
162 implies that the lexical analyzer will discard KEYWORD when it is encountered.
164 Alternately, it can be of the form:
165 ( \"KEYWORD\" ( LEXSYM1 \"str\" 1 1 ) ... ( LEXSYMN \"str\" 1 1 ) )
166 where LEXSYM is a symbol that would normally be produced by the
167 lexical analyzer, such as `symbol' or `string'. The string in the
168 second position is the text that makes up the replacement. This is
169 the way to have multiple lexical symbols in a replacement. Using the
170 first way to specify text like \"foo::bar\" would not work, because :
171 is a separate lexical symbol.
173 A quick way to see what you would need to insert is to place a
174 definition such as:
176 #define MYSYM foo::bar
178 into a C file, and do this:
179 \\[semantic-lex-spp-describe]
181 The output table will describe the symbols needed."
182 :group 'c
183 :type '(repeat (cons (string :tag "Keyword")
184 (sexp :tag "Replacement")))
185 :set (lambda (sym value)
186 (set-default sym value)
187 (condition-case nil
188 (semantic-c-reset-preprocessor-symbol-map)
189 (error nil))
193 (defcustom semantic-lex-c-preprocessor-symbol-file nil
194 "List of C/C++ files that contain preprocessor macros for the C lexer.
195 Each entry is a filename and each file is parsed, and those macros
196 are included in every C/C++ file parsed by semantic.
197 You can use this variable instead of `semantic-lex-c-preprocessor-symbol-map'
198 to store your global macros in a more natural way."
199 :group 'c
200 :type '(repeat (file :tag "File"))
201 :set (lambda (sym value)
202 (set-default sym value)
203 (condition-case nil
204 (semantic-c-reset-preprocessor-symbol-map)
205 (error nil))
209 (defcustom semantic-c-member-of-autocast 't
210 "Non-nil means classes with a '->' operator will cast to it's return type.
212 For Examples:
214 class Foo {
215 Bar *operator->();
218 Foo foo;
220 if `semantic-c-member-of-autocast' is non-nil :
221 foo->[here completion will list method of Bar]
223 if `semantic-c-member-of-autocast' is nil :
224 foo->[here completion will list method of Foo]"
225 :group 'c
226 :type 'boolean)
228 (define-lex-spp-macro-declaration-analyzer semantic-lex-cpp-define
229 "A #define of a symbol with some value.
230 Record the symbol in the semantic preprocessor.
231 Return the defined symbol as a special spp lex token."
232 "^\\s-*#\\s-*define\\s-+\\(\\(\\sw\\|\\s_\\)+\\)" 1
233 (goto-char (match-end 0))
234 (skip-chars-forward " \t")
235 (if (eolp)
237 (let* ((name (buffer-substring-no-properties
238 (match-beginning 1) (match-end 1)))
239 (with-args (save-excursion
240 (goto-char (match-end 0))
241 (looking-at "(")))
242 (semantic-lex-spp-replacements-enabled nil)
243 ;; Temporarilly override the lexer to include
244 ;; special items needed inside a macro
245 (semantic-lex-analyzer #'semantic-cpp-lexer)
246 (raw-stream
247 (semantic-lex-spp-stream-for-macro (save-excursion
248 (semantic-c-end-of-macro)
249 (point))))
252 ;; Only do argument checking if the paren was immediatly after
253 ;; the macro name.
254 (if with-args
255 (semantic-lex-spp-first-token-arg-list (car raw-stream)))
257 ;; Magical spp variable for end point.
258 (setq semantic-lex-end-point (point))
260 ;; Handled nested macro streams.
261 (semantic-lex-spp-merge-streams raw-stream)
264 (define-lex-spp-macro-undeclaration-analyzer semantic-lex-cpp-undef
265 "A #undef of a symbol.
266 Remove the symbol from the semantic preprocessor.
267 Return the defined symbol as a special spp lex token."
268 "^\\s-*#\\s-*undef\\s-+\\(\\(\\sw\\|\\s_\\)+\\)" 1)
271 ;;; Conditional Skipping
273 (defcustom semantic-c-obey-conditional-section-parsing-flag t
274 "*Non-nil means to interpret preprocessor #if sections.
275 This implies that some blocks of code will not be parsed based on the
276 values of the conditions in the #if blocks."
277 :group 'c
278 :type 'boolean)
280 (defun semantic-c-skip-conditional-section ()
281 "Skip one section of a conditional.
282 Moves forward to a matching #elif, #else, or #endif.
283 Moves completely over balanced #if blocks."
284 (require 'cc-cmds)
285 (let ((done nil))
286 ;; (if (looking-at "^\\s-*#if")
287 ;; (semantic-lex-spp-push-if (point))
288 (end-of-line)
289 (while (and semantic-c-obey-conditional-section-parsing-flag
290 (and (not done)
291 (re-search-forward
292 "^\\s-*#\\s-*\\(if\\(n?def\\)?\\|el\\(if\\|se\\)\\|endif\\)\\>"
293 nil t)))
294 (goto-char (match-beginning 0))
295 (cond
296 ((looking-at "^\\s-*#\\s-*if")
297 ;; We found a nested if. Skip it.
298 (c-forward-conditional 1))
299 ((looking-at "^\\s-*#\\s-*elif")
300 ;; We need to let the preprocessor analize this one.
301 (beginning-of-line)
302 (setq done t)
304 ((looking-at "^\\s-*#\\s-*\\(endif\\|else\\)\\>")
305 ;; We are at the end. Pop our state.
306 ;; (semantic-lex-spp-pop-if)
307 ;; Note: We include ELSE and ENDIF the same. If skip some previous
308 ;; section, then we should do the else by default, making it much
309 ;; like the endif.
310 (end-of-line)
311 (forward-char 1)
312 (setq done t))
314 ;; We found an elif. Stop here.
315 (setq done t))))))
317 (define-lex-regex-analyzer semantic-lex-c-if
318 "Code blocks wrapped up in #if, or #ifdef.
319 Uses known macro tables in SPP to determine what block to skip."
320 "^\\s-*#\\s-*\\(if\\|ifndef\\|ifdef\\|elif\\)\\s-+\\(!?defined(\\|\\)\\s-*\\(\\(\\sw\\|\\s_\\)+\\)\\(\\s-*)\\)?\\s-*$"
321 (semantic-c-do-lex-if))
323 (defun semantic-c-do-lex-if ()
324 "Handle lexical CPP if statements."
325 (let* ((sym (buffer-substring-no-properties
326 (match-beginning 3) (match-end 3)))
327 (defstr (buffer-substring-no-properties
328 (match-beginning 2) (match-end 2)))
329 (defined (string= defstr "defined("))
330 (notdefined (string= defstr "!defined("))
331 (ift (buffer-substring-no-properties
332 (match-beginning 1) (match-end 1)))
333 (ifdef (or (string= ift "ifdef")
334 (and (string= ift "if") defined)
335 (and (string= ift "elif") defined)
337 (ifndef (or (string= ift "ifndef")
338 (and (string= ift "if") notdefined)
339 (and (string= ift "elif") notdefined)
342 (if (or (and (or (string= ift "if") (string= ift "elif"))
343 (string= sym "0"))
344 (and ifdef (not (semantic-lex-spp-symbol-p sym)))
345 (and ifndef (semantic-lex-spp-symbol-p sym)))
346 ;; The if indecates to skip this preprocessor section
347 (let ((pt nil))
348 ;; (message "%s %s yes" ift sym)
349 (beginning-of-line)
350 (setq pt (point))
351 ;;(c-forward-conditional 1)
352 ;; This skips only a section of a conditional. Once that section
353 ;; is opened, encountering any new #else or related conditional
354 ;; should be skipped.
355 (semantic-c-skip-conditional-section)
356 (setq semantic-lex-end-point (point))
357 (semantic-push-parser-warning (format "Skip #%s %s" ift sym)
358 pt (point))
359 ;; (semantic-lex-push-token
360 ;; (semantic-lex-token 'c-preprocessor-skip pt (point)))
361 nil)
362 ;; Else, don't ignore it, but do handle the internals.
363 ;;(message "%s %s no" ift sym)
364 (end-of-line)
365 (setq semantic-lex-end-point (point))
366 nil)))
368 (define-lex-regex-analyzer semantic-lex-c-macro-else
369 "Ignore an #else block.
370 We won't see the #else due to the macro skip section block
371 unless we are actively parsing an open #if statement. In that
372 case, we must skip it since it is the ELSE part."
373 "^\\s-*#\\s-*\\(else\\)"
374 (let ((pt (point)))
375 (semantic-c-skip-conditional-section)
376 (setq semantic-lex-end-point (point))
377 (semantic-push-parser-warning "Skip #else" pt (point))
378 ;; (semantic-lex-push-token
379 ;; (semantic-lex-token 'c-preprocessor-skip pt (point)))
380 nil))
382 (define-lex-regex-analyzer semantic-lex-c-macrobits
383 "Ignore various forms of #if/#else/#endif conditionals."
384 "^\\s-*#\\s-*\\(if\\(n?def\\)?\\|endif\\|elif\\|else\\)"
385 (semantic-c-end-of-macro)
386 (setq semantic-lex-end-point (point))
387 nil)
389 (define-lex-spp-include-analyzer semantic-lex-c-include-system
390 "Identify include strings, and return special tokens."
391 "^\\s-*#\\s-*include\\s-*<\\([^ \t\n>]+\\)>" 0
392 ;; Hit 1 is the name of the include.
393 (goto-char (match-end 0))
394 (setq semantic-lex-end-point (point))
395 (cons (buffer-substring-no-properties (match-beginning 1)
396 (match-end 1))
397 'system))
399 (define-lex-spp-include-analyzer semantic-lex-c-include
400 "Identify include strings, and return special tokens."
401 "^\\s-*#\\s-*include\\s-*\"\\([^ \t\n>]+\\)\"" 0
402 ;; Hit 1 is the name of the include.
403 (goto-char (match-end 0))
404 (setq semantic-lex-end-point (point))
405 (cons (buffer-substring-no-properties (match-beginning 1)
406 (match-end 1))
407 nil))
410 (define-lex-regex-analyzer semantic-lex-c-ignore-ending-backslash
411 "Skip backslash ending a line.
412 Go to the next line."
413 "\\\\\\s-*\n"
414 (setq semantic-lex-end-point (match-end 0)))
416 (define-lex-regex-analyzer semantic-lex-c-namespace-begin-macro
417 "Handle G++'s namespace macros which the pre-processor can't handle."
418 "\\(_GLIBCXX_BEGIN_NAMESPACE\\)(\\s-*\\(\\(?:\\w\\|\\s_\\)+\\)\\s-*)"
419 (let* ((nsend (match-end 1))
420 (sym-start (match-beginning 2))
421 (sym-end (match-end 2))
422 (ms (buffer-substring-no-properties sym-start sym-end)))
423 ;; Push the namespace keyword.
424 (semantic-lex-push-token
425 (semantic-lex-token 'NAMESPACE (match-beginning 0) nsend "namespace"))
426 ;; Push the name.
427 (semantic-lex-push-token
428 (semantic-lex-token 'symbol sym-start sym-end ms))
430 (goto-char (match-end 0))
431 (let ((start (point))
432 (end 0))
433 ;; If we can't find a matching end, then create the fake list.
434 (when (re-search-forward "_GLIBCXX_END_NAMESPACE" nil t)
435 (setq end (point))
436 (semantic-lex-push-token
437 (semantic-lex-token 'semantic-list start end
438 (list 'prefix-fake)))))
439 (setq semantic-lex-end-point (point)))
441 (defcustom semantic-lex-c-nested-namespace-ignore-second t
442 "Should _GLIBCXX_BEGIN_NESTED_NAMESPACE ignore the second namespace?
443 It is really there, but if a majority of uses is to squeeze out
444 the second namespace in use, then it should not be included.
446 If you are having problems with smart completion and STL templates,
447 it may that this is set incorrectly. After changing the value
448 of this flag, you will need to delete any semanticdb cache files
449 that may have been incorrectly parsed."
450 :group 'semantic
451 :type 'boolean)
453 (define-lex-regex-analyzer semantic-lex-c-VC++-begin-std-namespace
454 "Handle VC++'s definition of the std namespace."
455 "\\(_STD_BEGIN\\)"
456 (semantic-lex-push-token
457 (semantic-lex-token 'NAMESPACE (match-beginning 0) (match-end 0) "namespace"))
458 (semantic-lex-push-token
459 (semantic-lex-token 'symbol (match-beginning 0) (match-end 0) "std"))
460 (goto-char (match-end 0))
461 (let ((start (point))
462 (end 0))
463 (when (re-search-forward "_STD_END" nil t)
464 (setq end (point))
465 (semantic-lex-push-token
466 (semantic-lex-token 'semantic-list start end
467 (list 'prefix-fake)))))
468 (setq semantic-lex-end-point (point)))
470 (define-lex-regex-analyzer semantic-lex-c-VC++-end-std-namespace
471 "Handle VC++'s definition of the std namespace."
472 "\\(_STD_END\\)"
473 (goto-char (match-end 0))
474 (setq semantic-lex-end-point (point)))
476 (define-lex-regex-analyzer semantic-lex-c-namespace-begin-nested-macro
477 "Handle G++'s namespace macros which the pre-processor can't handle."
478 "\\(_GLIBCXX_BEGIN_NESTED_NAMESPACE\\)(\\s-*\\(\\(?:\\w\\|\\s_\\)+\\)\\s-*,\\s-*\\(\\(?:\\w\\|\\s_\\)+\\)\\s-*)"
479 (goto-char (match-end 0))
480 (let* ((nsend (match-end 1))
481 (sym-start (match-beginning 2))
482 (sym-end (match-end 2))
483 (ms (buffer-substring-no-properties sym-start sym-end))
484 (sym2-start (match-beginning 3))
485 (sym2-end (match-end 3))
486 (ms2 (buffer-substring-no-properties sym2-start sym2-end)))
487 ;; Push the namespace keyword.
488 (semantic-lex-push-token
489 (semantic-lex-token 'NAMESPACE (match-beginning 0) nsend "namespace"))
490 ;; Push the name.
491 (semantic-lex-push-token
492 (semantic-lex-token 'symbol sym-start sym-end ms))
494 (goto-char (match-end 0))
495 (let ((start (point))
496 (end 0))
497 ;; If we can't find a matching end, then create the fake list.
498 (when (re-search-forward "_GLIBCXX_END_NESTED_NAMESPACE" nil t)
499 (setq end (point))
500 (if semantic-lex-c-nested-namespace-ignore-second
501 ;; The same as _GLIBCXX_BEGIN_NAMESPACE
502 (semantic-lex-push-token
503 (semantic-lex-token 'semantic-list start end
504 (list 'prefix-fake)))
505 ;; Do both the top and second level namespace
506 (semantic-lex-push-token
507 (semantic-lex-token 'semantic-list start end
508 ;; We'll depend on a quick hack
509 (list 'prefix-fake-plus
510 (semantic-lex-token 'NAMESPACE
511 sym-end sym2-start
512 "namespace")
513 (semantic-lex-token 'symbol
514 sym2-start sym2-end
515 ms2)
516 (semantic-lex-token 'semantic-list start end
517 (list 'prefix-fake)))
520 (setq semantic-lex-end-point (point)))
522 (define-lex-regex-analyzer semantic-lex-c-namespace-end-macro
523 "Handle G++'s namespace macros which the pre-processor can't handle."
524 "_GLIBCXX_END_\\(NESTED_\\)?NAMESPACE"
525 (goto-char (match-end 0))
526 (setq semantic-lex-end-point (point)))
528 (define-lex-regex-analyzer semantic-lex-c-string
529 "Detect and create a C string token."
530 "L?\\(\\s\"\\)"
531 ;; Zing to the end of this string.
532 (semantic-lex-push-token
533 (semantic-lex-token
534 'string (point)
535 (save-excursion
536 ;; Skip L prefix if present.
537 (goto-char (match-beginning 1))
538 (semantic-lex-unterminated-syntax-protection 'string
539 (forward-sexp 1)
540 (point))
541 ))))
543 (define-lex-regex-analyzer semantic-c-lex-ignore-newline
544 "Detect and ignore newline tokens.
545 Use this ONLY if newlines are not whitespace characters (such as when
546 they are comment end characters)."
547 ;; Just like semantic-lex-ignore-newline, but also ignores
548 ;; trailing \.
549 "\\s-*\\\\?\\s-*\\(\n\\|\\s>\\)"
550 (setq semantic-lex-end-point (match-end 0)))
553 (define-lex semantic-c-lexer
554 "Lexical Analyzer for C code.
555 Use semantic-cpp-lexer for parsing text inside a CPP macro."
556 ;; C preprocessor features
557 semantic-lex-cpp-define
558 semantic-lex-cpp-undef
559 semantic-lex-c-if
560 semantic-lex-c-macro-else
561 semantic-lex-c-macrobits
562 semantic-lex-c-include
563 semantic-lex-c-include-system
564 semantic-lex-c-ignore-ending-backslash
565 ;; Whitespace handling
566 semantic-lex-ignore-whitespace
567 semantic-c-lex-ignore-newline
568 ;; Non-preprocessor features
569 semantic-lex-number
570 ;; Must detect C strings before symbols because of possible L prefix!
571 semantic-lex-c-string
572 ;; Custom handlers for some macros come before the macro replacement analyzer.
573 semantic-lex-c-namespace-begin-macro
574 semantic-lex-c-namespace-begin-nested-macro
575 semantic-lex-c-namespace-end-macro
576 semantic-lex-c-VC++-begin-std-namespace
577 semantic-lex-c-VC++-end-std-namespace
578 ;; Handle macros, symbols, and keywords
579 semantic-lex-spp-replace-or-symbol-or-keyword
580 semantic-lex-charquote
581 semantic-lex-paren-or-list
582 semantic-lex-close-paren
583 semantic-lex-ignore-comments
584 semantic-lex-punctuation
585 semantic-lex-default-action)
587 (define-lex-simple-regex-analyzer semantic-lex-cpp-hashhash
588 "Match ## inside a CPP macro as special."
589 "##" 'spp-concat)
591 (define-lex semantic-cpp-lexer
592 "Lexical Analyzer for CPP macros in C code."
593 ;; CPP special
594 semantic-lex-cpp-hashhash
595 ;; C preprocessor features
596 semantic-lex-cpp-define
597 semantic-lex-cpp-undef
598 semantic-lex-c-if
599 semantic-lex-c-macro-else
600 semantic-lex-c-macrobits
601 semantic-lex-c-include
602 semantic-lex-c-include-system
603 semantic-lex-c-ignore-ending-backslash
604 ;; Whitespace handling
605 semantic-lex-ignore-whitespace
606 semantic-c-lex-ignore-newline
607 ;; Non-preprocessor features
608 semantic-lex-number
609 ;; Must detect C strings before symbols because of possible L prefix!
610 semantic-lex-c-string
611 ;; Parsing inside a macro means that we don't do macro replacement.
612 ;; semantic-lex-spp-replace-or-symbol-or-keyword
613 semantic-lex-symbol-or-keyword
614 semantic-lex-charquote
615 semantic-lex-paren-or-list
616 semantic-lex-close-paren
617 semantic-lex-ignore-comments
618 semantic-lex-punctuation
619 semantic-lex-default-action)
621 (define-mode-local-override semantic-parse-region c-mode
622 (start end &optional nonterminal depth returnonerror)
623 "Calls 'semantic-parse-region-default', except in a macro expansion.
624 MACRO expansion mode is handled through the nature of Emacs's non-lexical
625 binding of variables.
626 START, END, NONTERMINAL, DEPTH, and RETURNONERRORS are the same
627 as for the parent."
628 (if (and (boundp 'lse) (or (/= start 1) (/= end (point-max))))
629 (let* ((last-lexical-token lse)
630 (llt-class (semantic-lex-token-class last-lexical-token))
631 (llt-fakebits (car (cdr last-lexical-token)))
632 (macroexpand (stringp (car (cdr last-lexical-token)))))
633 (if macroexpand
634 (progn
635 ;; It is a macro expansion. Do something special.
636 ;;(message "MOOSE %S %S, %S : %S" start end nonterminal lse)
637 (semantic-c-parse-lexical-token
638 lse nonterminal depth returnonerror)
640 ;; Not a macro expansion, but perhaps a funny semantic-list
641 ;; is at the start? Remove the depth if our semantic list is not
642 ;; made of list tokens.
643 (if (and depth (= depth 1)
644 (eq llt-class 'semantic-list)
645 (not (null llt-fakebits))
646 (consp llt-fakebits)
647 (symbolp (car llt-fakebits))
649 (progn
650 (setq depth 0)
652 ;; This is a copy of semantic-parse-region-default where we
653 ;; are doing something special with the lexication of the
654 ;; contents of the semantic-list token. Stuff not used by C
655 ;; removed.
656 (let ((tokstream
657 (if (and (consp llt-fakebits)
658 (eq (car llt-fakebits) 'prefix-fake-plus))
659 ;; If our semantic-list is special, then only stick in the
660 ;; fake tokens.
661 (cdr llt-fakebits)
662 ;; Lex up the region with a depth of 0
663 (semantic-lex start end 0))))
665 ;; Do the parse
666 (nreverse
667 (semantic-repeat-parse-whole-stream tokstream
668 nonterminal
669 returnonerror))
673 ;; It was not a macro expansion, nor a special semantic-list.
674 ;; Do old thing.
675 (semantic-parse-region-default start end
676 nonterminal depth
677 returnonerror)
679 ;; Do the parse
680 (semantic-parse-region-default start end nonterminal
681 depth returnonerror)
684 (defvar semantic-c-parse-token-hack-depth 0
685 "Current depth of recursive calls to `semantic-c-parse-lexical-token'.")
687 (defun semantic-c-parse-lexical-token (lexicaltoken nonterminal depth
688 returnonerror)
689 "Do a region parse on the contents of LEXICALTOKEN.
690 Presumably, this token has a string in it from a macro.
691 The text of the token is inserted into a different buffer, and
692 parsed there.
693 Argument NONTERMINAL, DEPTH, and RETURNONERROR are passed into
694 the regular parser."
695 (let* ((semantic-c-parse-token-hack-depth (1+ semantic-c-parse-token-hack-depth))
696 (buf (get-buffer-create (format " *C parse hack %d*"
697 semantic-c-parse-token-hack-depth)))
698 (mode major-mode)
699 (spp-syms semantic-lex-spp-dynamic-macro-symbol-obarray)
700 (stream nil)
701 (start (semantic-lex-token-start lexicaltoken))
702 (end (semantic-lex-token-end lexicaltoken))
703 (symtext (semantic-lex-token-text lexicaltoken))
704 (macros (get-text-property 0 'macros symtext))
706 (save-excursion
707 (set-buffer buf)
708 (erase-buffer)
709 (when (not (eq major-mode mode))
710 (save-match-data
712 ;; Protect against user hooks throwing errors.
713 (condition-case nil
714 (funcall mode)
715 (error nil))
717 ;; Hack in mode-local
718 (activate-mode-local-bindings)
719 ;; CHEATER! The following 3 lines are from
720 ;; `semantic-new-buffer-fcn', but we don't want to turn
721 ;; on all the other annoying modes for this little task.
722 (setq semantic-new-buffer-fcn-was-run t)
723 (semantic-lex-init)
724 (semantic-clear-toplevel-cache)
725 (remove-hook 'semantic-lex-reset-hooks 'semantic-lex-spp-reset-hook
728 ;; Get the macro symbol table right.
729 (setq semantic-lex-spp-dynamic-macro-symbol-obarray spp-syms)
730 ;; (message "%S" macros)
731 (dolist (sym macros)
732 (semantic-lex-spp-symbol-set (car sym) (cdr sym)))
734 (insert symtext)
736 (setq stream
737 (semantic-parse-region-default
738 (point-min) (point-max) nonterminal depth returnonerror))
740 ;; Clean up macro symbols
741 (dolist (sym macros)
742 (semantic-lex-spp-symbol-remove (car sym)))
744 ;; Convert the text of the stream.
745 (dolist (tag stream)
746 ;; Only do two levels here 'cause I'm lazy.
747 (semantic--tag-set-overlay tag (list start end))
748 (dolist (stag (semantic-tag-components-with-overlays tag))
749 (semantic--tag-set-overlay stag (list start end))
752 stream))
754 (defun semantic-expand-c-tag (tag)
755 "Expand TAG into a list of equivalent tags, or nil."
756 (let ((return-list nil)
758 ;; Expand an EXTERN C first.
759 (when (eq (semantic-tag-class tag) 'extern)
760 (let* ((mb (semantic-tag-get-attribute tag :members))
761 (ret mb))
762 (while mb
763 (let ((mods (semantic-tag-get-attribute (car mb) :typemodifiers)))
764 (setq mods (cons "extern" (cons "\"C\"" mods)))
765 (semantic-tag-put-attribute (car mb) :typemodifiers mods))
766 (setq mb (cdr mb)))
767 (setq return-list ret)))
769 ;; Function or variables that have a :type that is some complex
770 ;; thing, extract it, and replace it with a reference.
772 ;; Thus, struct A { int a; } B;
774 ;; will create 2 toplevel tags, one is type A, and the other variable B
775 ;; where the :type of B is just a type tag A that is a prototype, and
776 ;; the actual struct info of A is it's own toplevel tag.
777 (when (or (semantic-tag-of-class-p tag 'function)
778 (semantic-tag-of-class-p tag 'variable))
779 (let* ((basetype (semantic-tag-type tag))
780 (typeref nil)
781 (tname (when (consp basetype)
782 (semantic-tag-name basetype))))
783 ;; Make tname be a string.
784 (when (consp tname) (setq tname (car (car tname))))
785 ;; Is the basetype a full type with a name of its own?
786 (when (and basetype (semantic-tag-p basetype)
787 (not (semantic-tag-prototype-p basetype))
788 tname
789 (not (string= tname "")))
790 ;; a type tag referencing the type we are extracting.
791 (setq typeref (semantic-tag-new-type
792 (semantic-tag-name basetype)
793 (semantic-tag-type basetype)
794 nil nil
795 :prototype t))
796 ;; Convert original tag to only have a reference.
797 (setq tag (semantic-tag-copy tag))
798 (semantic-tag-put-attribute tag :type typeref)
799 ;; Convert basetype to have the location information.
800 (semantic--tag-copy-properties tag basetype)
801 (semantic--tag-set-overlay basetype
802 (semantic-tag-overlay tag))
803 ;; Store the base tag as part of the return list.
804 (setq return-list (cons basetype return-list)))))
806 ;; Name of the tag is a list, so expand it. Tag lists occur
807 ;; for variables like this: int var1, var2, var3;
809 ;; This will expand that to 3 tags that happen to share the
810 ;; same overlay information.
811 (if (consp (semantic-tag-name tag))
812 (let ((rl (semantic-expand-c-tag-namelist tag)))
813 (cond
814 ;; If this returns nothing, then return nil overall
815 ;; because that will restore the old TAG input.
816 ((not rl) (setq return-list nil))
817 ;; If we have a return, append it to the existing list
818 ;; of returns.
819 ((consp rl)
820 (setq return-list (append rl return-list)))
822 ;; If we didn't have a list, but the return-list is non-empty,
823 ;; that means we still need to take our existing tag, and glom
824 ;; it onto our extracted type.
825 (if (consp return-list)
826 (setq return-list (cons tag return-list)))
829 ;; Default, don't change the tag means returning nil.
830 return-list))
832 (defun semantic-expand-c-tag-namelist (tag)
833 "Expand TAG whose name is a list into a list of tags, or nil."
834 (cond ((semantic-tag-of-class-p tag 'variable)
835 ;; The name part comes back in the form of:
836 ;; ( NAME NUMSTARS BITS ARRAY ASSIGN )
837 (let ((vl nil)
838 (basety (semantic-tag-type tag))
839 (ty "")
840 (mods (semantic-tag-get-attribute tag :typemodifiers))
841 (suffix "")
842 (lst (semantic-tag-name tag))
843 (default nil)
844 (cur nil))
845 ;; Open up each name in the name list.
846 (while lst
847 (setq suffix "" ty "")
848 (setq cur (car lst))
849 (if (nth 2 cur)
850 (setq suffix (concat ":" (nth 2 cur))))
851 (if (= (length basety) 1)
852 (setq ty (car basety))
853 (setq ty basety))
854 (setq default (nth 4 cur))
855 (setq vl (cons
856 (semantic-tag-new-variable
857 (car cur) ;name
858 ty ;type
859 (if default
860 (buffer-substring-no-properties
861 (car default) (car (cdr default))))
862 :constant-flag (semantic-tag-variable-constant-p tag)
863 :suffix suffix
864 :typemodifiers mods
865 :dereference (length (nth 3 cur))
866 :pointer (nth 1 cur)
867 :reference (semantic-tag-get-attribute tag :reference)
868 :documentation (semantic-tag-docstring tag) ;doc
870 vl))
871 (semantic--tag-copy-properties tag (car vl))
872 (semantic--tag-set-overlay (car vl)
873 (semantic-tag-overlay tag))
874 (setq lst (cdr lst)))
875 ;; Return the list
876 (nreverse vl)))
877 ((semantic-tag-of-class-p tag 'type)
878 ;; We may someday want to add an extra check for a type
879 ;; of type "typedef".
880 ;; Each elt of NAME is ( STARS NAME )
881 (let ((vl nil)
882 (names (semantic-tag-name tag)))
883 (while names
884 (setq vl (cons (semantic-tag-new-type
885 (nth 1 (car names)) ; name
886 "typedef"
887 (semantic-tag-type-members tag)
888 ;; parent is just tbe name of what
889 ;; is passed down as a tag.
890 (list
891 (semantic-tag-name
892 (semantic-tag-type-superclasses tag)))
893 :pointer
894 (let ((stars (car (car (car names)))))
895 (if (= stars 0) nil stars))
896 ;; This specifies what the typedef
897 ;; is expanded out as. Just the
898 ;; name shows up as a parent of this
899 ;; typedef.
900 :typedef
901 (semantic-tag-get-attribute tag :superclasses)
902 ;;(semantic-tag-type-superclasses tag)
903 :documentation
904 (semantic-tag-docstring tag))
905 vl))
906 (semantic--tag-copy-properties tag (car vl))
907 (semantic--tag-set-overlay (car vl)
908 (semantic-tag-overlay tag))
909 (setq names (cdr names)))
910 vl))
911 ((and (listp (car tag))
912 (semantic-tag-of-class-p (car tag) 'variable))
913 ;; Argument lists come in this way. Append all the expansions!
914 (let ((vl nil))
915 (while tag
916 (setq vl (append (semantic-tag-components (car vl))
918 tag (cdr tag)))
919 vl))
920 (t nil)))
922 (defvar-mode-local c-mode semantic-tag-expand-function 'semantic-expand-c-tag
923 "Function used to expand tags generated in the C bovine parser.")
925 (defvar semantic-c-classname nil
926 "At parse time, assign a class or struct name text here.
927 It is picked up by `semantic-c-reconstitute-token' to determine
928 if something is a constructor. Value should be:
929 ( TYPENAME . TYPEOFTYPE)
930 where typename is the name of the type, and typeoftype is \"class\"
931 or \"struct\".")
933 (defun semantic-c-reconstitute-token (tokenpart declmods typedecl)
934 "Reconstitute a token TOKENPART with DECLMODS and TYPEDECL.
935 This is so we don't have to match the same starting text several times.
936 Optional argument STAR and REF indicate the number of * and & in the typedef."
937 (when (and (listp typedecl)
938 (= 1 (length typedecl))
939 (stringp (car typedecl)))
940 (setq typedecl (car typedecl)))
941 (cond ((eq (nth 1 tokenpart) 'variable)
942 (semantic-tag-new-variable
943 (car tokenpart)
944 (or typedecl "int") ;type
945 nil ;default value (filled with expand)
946 :constant-flag (if (member "const" declmods) t nil)
947 :typemodifiers (delete "const" declmods)
950 ((eq (nth 1 tokenpart) 'function)
951 ;; We should look at part 4 (the arglist) here, and throw an
952 ;; error of some sort if it contains parser errors so that we
953 ;; don't parser function calls, but that is a little beyond what
954 ;; is available for data here.
955 (let* ((constructor
956 (and (or (and semantic-c-classname
957 (string= (car semantic-c-classname)
958 (car tokenpart)))
959 (and (stringp (car (nth 2 tokenpart)))
960 (string= (car (nth 2 tokenpart)) (car tokenpart)))
962 (not (car (nth 3 tokenpart)))))
963 (fcnpointer (string-match "^\\*" (car tokenpart)))
964 (fnname (if fcnpointer
965 (substring (car tokenpart) 1)
966 (car tokenpart)))
967 (operator (if (string-match "[a-zA-Z]" fnname)
971 (if fcnpointer
972 ;; Function pointers are really variables.
973 (semantic-tag-new-variable
974 fnname
975 typedecl
977 ;; It is a function pointer
978 :functionpointer-flag t
980 ;; The function
981 (semantic-tag-new-function
982 fnname
983 (or typedecl ;type
984 (cond ((car (nth 3 tokenpart) )
985 "void") ; Destructors have no return?
986 (constructor
987 ;; Constructors return an object.
988 (semantic-tag-new-type
989 ;; name
990 (or (car semantic-c-classname)
991 (car (nth 2 tokenpart)))
992 ;; type
993 (or (cdr semantic-c-classname)
994 "class")
995 ;; members
997 ;; parents
1000 (t "int")))
1001 (nth 4 tokenpart) ;arglist
1002 :constant-flag (if (member "const" declmods) t nil)
1003 :typemodifiers (delete "const" declmods)
1004 :parent (car (nth 2 tokenpart))
1005 :destructor-flag (if (car (nth 3 tokenpart) ) t)
1006 :constructor-flag (if constructor t)
1007 :pointer (nth 7 tokenpart)
1008 :operator-flag operator
1009 ;; Even though it is "throw" in C++, we use
1010 ;; `throws' as a common name for things that toss
1011 ;; exceptions about.
1012 :throws (nth 5 tokenpart)
1013 ;; Reemtrant is a C++ thingy. Add it here
1014 :reentrant-flag (if (member "reentrant" (nth 6 tokenpart)) t)
1015 ;; A function post-const is funky. Try stuff
1016 :methodconst-flag (if (member "const" (nth 6 tokenpart)) t)
1017 ;; prototypes are functions w/ no body
1018 :prototype-flag (if (nth 8 tokenpart) t)
1019 ;; Pure virtual
1020 :pure-virtual-flag (if (eq (nth 8 tokenpart) :pure-virtual-flag) t)
1021 ;; Template specifier.
1022 :template-specifier (nth 9 tokenpart)
1027 (defun semantic-c-reconstitute-template (tag specifier)
1028 "Reconstitute the token TAG with the template SPECIFIER."
1029 (semantic-tag-put-attribute tag :template (or specifier ""))
1030 tag)
1033 ;;; Override methods & Variables
1035 (define-mode-local-override semantic-format-tag-name
1036 c-mode (tag &optional parent color)
1037 "Convert TAG to a string that is the print name for TAG.
1038 Optional PARENT and COLOR are ignored."
1039 (let ((name (semantic-format-tag-name-default tag parent color))
1040 (fnptr (semantic-tag-get-attribute tag :functionpointer-flag))
1042 (if (not fnptr)
1043 name
1044 (concat "(*" name ")"))
1047 (define-mode-local-override semantic-format-tag-canonical-name
1048 c-mode (tag &optional parent color)
1049 "Create a cannonical name for TAG.
1050 PARENT specifies a parent class.
1051 COLOR indicates that the text should be type colorized.
1052 Enhances the base class to search for the entire parent
1053 tree to make the name accurate."
1054 (semantic-format-tag-canonical-name-default tag parent color)
1057 (define-mode-local-override semantic-format-tag-type c-mode (tag color)
1058 "Convert the data type of TAG to a string usable in tag formatting.
1059 Adds pointer and reference symbols to the default.
1060 Argument COLOR adds color to the text."
1061 (let* ((type (semantic-tag-type tag))
1062 (defaulttype nil)
1063 (point (semantic-tag-get-attribute tag :pointer))
1064 (ref (semantic-tag-get-attribute tag :reference))
1066 (if (semantic-tag-p type)
1067 (let ((typetype (semantic-tag-type type))
1068 (typename (semantic-tag-name type)))
1069 ;; Create the string that expresses the type
1070 (if (string= typetype "class")
1071 (setq defaulttype typename)
1072 (setq defaulttype (concat typetype " " typename))))
1073 (setq defaulttype (semantic-format-tag-type-default tag color)))
1075 ;; Colorize
1076 (when color
1077 (setq defaulttype (semantic--format-colorize-text defaulttype 'type)))
1079 ;; Add refs, ptrs, etc
1080 (if ref (setq ref "&"))
1081 (if point (setq point (make-string point ?*)) "")
1082 (when type
1083 (concat defaulttype ref point))
1086 (define-mode-local-override semantic-find-tags-by-scope-protection
1087 c-mode (scopeprotection parent &optional table)
1088 "Override the usual search for protection.
1089 We can be more effective than the default by scanning through once,
1090 and collecting tags based on the labels we see along the way."
1091 (if (not table) (setq table (semantic-tag-type-members parent)))
1092 (if (null scopeprotection)
1093 table
1094 (let ((ans nil)
1095 (curprot 1)
1096 (targetprot (cond ((eq scopeprotection 'public)
1098 ((eq scopeprotection 'protected)
1100 (t 3)
1102 (alist '(("public" . 1)
1103 ("protected" . 2)
1104 ("private" . 3)))
1106 (dolist (tag table)
1107 (cond
1108 ((semantic-tag-of-class-p tag 'label)
1109 (setq curprot (cdr (assoc (semantic-tag-name tag) alist)))
1111 ((>= targetprot curprot)
1112 (setq ans (cons tag ans)))
1114 ans)))
1116 (define-mode-local-override semantic-tag-protection
1117 c-mode (tag &optional parent)
1118 "Return the protection of TAG in PARENT.
1119 Override function for `semantic-tag-protection'."
1120 (let ((mods (semantic-tag-modifiers tag))
1121 (prot nil))
1122 ;; Check the modifiers for protection if we are not a child
1123 ;; of some class type.
1124 (when (or (not parent) (not (eq (semantic-tag-class parent) 'type)))
1125 (while (and (not prot) mods)
1126 (if (stringp (car mods))
1127 (let ((s (car mods)))
1128 ;; A few silly defaults to get things started.
1129 (cond ((or (string= s "extern")
1130 (string= s "export"))
1131 'public)
1132 ((string= s "static")
1133 'private))))
1134 (setq mods (cdr mods))))
1135 ;; If we have a typed parent, look for :public style labels.
1136 (when (and parent (eq (semantic-tag-class parent) 'type))
1137 (let ((pp (semantic-tag-type-members parent)))
1138 (while (and pp (not (semantic-equivalent-tag-p (car pp) tag)))
1139 (when (eq (semantic-tag-class (car pp)) 'label)
1140 (setq prot
1141 (cond ((string= (semantic-tag-name (car pp)) "public")
1142 'public)
1143 ((string= (semantic-tag-name (car pp)) "private")
1144 'private)
1145 ((string= (semantic-tag-name (car pp)) "protected")
1146 'protected)))
1148 (setq pp (cdr pp)))))
1149 (when (and (not prot) (eq (semantic-tag-class parent) 'type))
1150 (setq prot
1151 (cond ((string= (semantic-tag-type parent) "class") 'private)
1152 ((string= (semantic-tag-type parent) "struct") 'public)
1153 (t 'unknown))))
1154 (or prot
1155 (if (and parent (semantic-tag-of-class-p parent 'type))
1156 'public
1157 nil))))
1159 (define-mode-local-override semantic-tag-components c-mode (tag)
1160 "Return components for TAG."
1161 (if (and (eq (semantic-tag-class tag) 'type)
1162 (string= (semantic-tag-type tag) "typedef"))
1163 ;; A typedef can contain a parent who has positional children,
1164 ;; but that parent will not have a position. Do this funny hack
1165 ;; to make sure we can apply overlays properly.
1166 (let ((sc (semantic-tag-get-attribute tag :typedef)))
1167 (when (semantic-tag-p sc) (semantic-tag-components sc)))
1168 (semantic-tag-components-default tag)))
1170 (defun semantic-c-tag-template (tag)
1171 "Return the template specification for TAG, or nil."
1172 (semantic-tag-get-attribute tag :template))
1174 (defun semantic-c-tag-template-specifier (tag)
1175 "Return the template specifier specification for TAG, or nil."
1176 (semantic-tag-get-attribute tag :template-specifier))
1178 (defun semantic-c-template-string-body (templatespec)
1179 "Convert TEMPLATESPEC into a string.
1180 This might be a string, or a list of tokens."
1181 (cond ((stringp templatespec)
1182 templatespec)
1183 ((semantic-tag-p templatespec)
1184 (semantic-format-tag-abbreviate templatespec))
1185 ((listp templatespec)
1186 (mapconcat 'semantic-format-tag-abbreviate templatespec ", "))))
1188 (defun semantic-c-template-string (token &optional parent color)
1189 "Return a string representing the TEMPLATE attribute of TOKEN.
1190 This string is prefixed with a space, or is the empty string.
1191 Argument PARENT specifies a parent type.
1192 Argument COLOR specifies that the string should be colorized."
1193 (let ((t2 (semantic-c-tag-template-specifier token))
1194 (t1 (semantic-c-tag-template token))
1195 ;; @todo - Need to account for a parent that is a template
1196 (pt1 (if parent (semantic-c-tag-template parent)))
1197 (pt2 (if parent (semantic-c-tag-template-specifier parent)))
1199 (cond (t2 ;; we have a template with specifier
1200 (concat " <"
1201 ;; Fill in the parts here
1202 (semantic-c-template-string-body t2)
1203 ">"))
1204 (t1 ;; we have a template without specifier
1205 " <>")
1207 ""))))
1209 (define-mode-local-override semantic-format-tag-concise-prototype
1210 c-mode (token &optional parent color)
1211 "Return an abbreviated string describing TOKEN for C and C++.
1212 Optional PARENT and COLOR as specified with
1213 `semantic-format-tag-abbreviate-default'."
1214 ;; If we have special template things, append.
1215 (concat (semantic-format-tag-concise-prototype-default token parent color)
1216 (semantic-c-template-string token parent color)))
1218 (define-mode-local-override semantic-format-tag-uml-prototype
1219 c-mode (token &optional parent color)
1220 "Return an uml string describing TOKEN for C and C++.
1221 Optional PARENT and COLOR as specified with
1222 `semantic-abbreviate-tag-default'."
1223 ;; If we have special template things, append.
1224 (concat (semantic-format-tag-uml-prototype-default token parent color)
1225 (semantic-c-template-string token parent color)))
1227 (define-mode-local-override semantic-tag-abstract-p
1228 c-mode (tag &optional parent)
1229 "Return non-nil if TAG is considered abstract.
1230 PARENT is tag's parent.
1231 In C, a method is abstract if it is `virtual', which is already
1232 handled. A class is abstract iff it's destructor is virtual."
1233 (cond
1234 ((eq (semantic-tag-class tag) 'type)
1235 (require 'semantic/find)
1236 (or (semantic-brute-find-tag-by-attribute :pure-virtual-flag
1237 (semantic-tag-components tag)
1239 (let* ((ds (semantic-brute-find-tag-by-attribute
1240 :destructor-flag
1241 (semantic-tag-components tag)
1243 (cs (semantic-brute-find-tag-by-attribute
1244 :constructor-flag
1245 (semantic-tag-components tag)
1247 (and ds (member "virtual" (semantic-tag-modifiers (car ds)))
1248 cs (eq 'protected (semantic-tag-protection (car cs) tag))
1251 ((eq (semantic-tag-class tag) 'function)
1252 (or (semantic-tag-get-attribute tag :pure-virtual-flag)
1253 (member "virtual" (semantic-tag-modifiers tag))))
1254 (t (semantic-tag-abstract-p-default tag parent))))
1256 (defun semantic-c-dereference-typedef (type scope &optional type-declaration)
1257 "If TYPE is a typedef, get TYPE's type by name or tag, and return.
1258 SCOPE is not used, and TYPE-DECLARATION is used only if TYPE is not a typedef."
1259 (if (and (eq (semantic-tag-class type) 'type)
1260 (string= (semantic-tag-type type) "typedef"))
1261 (let ((dt (semantic-tag-get-attribute type :typedef)))
1262 (cond ((and (semantic-tag-p dt)
1263 (not (semantic-analyze-tag-prototype-p dt)))
1264 ;; In this case, DT was declared directly. We need
1265 ;; to clone DT and apply a filename to it.
1266 (let* ((fname (semantic-tag-file-name type))
1267 (def (semantic-tag-copy dt nil fname)))
1268 (list def def)))
1269 ((stringp dt) (list dt (semantic-tag dt 'type)))
1270 ((consp dt) (list (car dt) dt))))
1272 (list type type-declaration)))
1274 (defun semantic-c--instantiate-template (tag def-list spec-list)
1275 "Replace TAG name according to template specification.
1276 DEF-LIST is the template information.
1277 SPEC-LIST is the template specifier of the datatype instantiated."
1278 (when (and (car def-list) (car spec-list))
1280 (when (and (string= (semantic-tag-type (car def-list)) "class")
1281 (string= (semantic-tag-name tag) (semantic-tag-name (car def-list))))
1282 (semantic-tag-set-name tag (semantic-tag-name (car spec-list))))
1284 (semantic-c--instantiate-template tag (cdr def-list) (cdr spec-list))))
1286 (defun semantic-c--template-name-1 (spec-list)
1287 "Return a string used to compute template class name.
1288 Based on SPEC-LIST, for ref<Foo,Bar> it will return 'Foo,Bar'."
1289 (when (car spec-list)
1290 (let* ((endpart (semantic-c--template-name-1 (cdr spec-list)))
1291 (separator (and endpart ",")))
1292 (concat (semantic-tag-name (car spec-list)) separator endpart))))
1294 (defun semantic-c--template-name (type spec-list)
1295 "Return a template class name for TYPE based on SPEC-LIST.
1296 For a type `ref' with a template specifier of (Foo Bar) it will
1297 return 'ref<Foo,Bar>'."
1298 (concat (semantic-tag-name type)
1299 "<" (semantic-c--template-name-1 (cdr spec-list)) ">"))
1301 (defun semantic-c-dereference-template (type scope &optional type-declaration)
1302 "Dereference any template specifiers in TYPE within SCOPE.
1303 If TYPE is a template, return a TYPE copy with the templates types
1304 instantiated as specified in TYPE-DECLARATION."
1305 (when (semantic-tag-p type-declaration)
1306 (let ((def-list (semantic-tag-get-attribute type :template))
1307 (spec-list (semantic-tag-get-attribute type-declaration :template-specifier)))
1308 (when (and def-list spec-list)
1309 (setq type (semantic-tag-deep-copy-one-tag
1310 type
1311 (lambda (tag)
1312 (when (semantic-tag-of-class-p tag 'type)
1313 (semantic-c--instantiate-template
1314 tag def-list spec-list))
1315 tag)
1317 (semantic-tag-set-name type (semantic-c--template-name type spec-list))
1318 (semantic-tag-put-attribute type :template nil)
1319 (semantic-tag-set-faux type))))
1320 (list type type-declaration))
1322 ;;; Patch here by "Raf" for instantiating templates.
1323 (defun semantic-c-dereference-member-of (type scope &optional type-declaration)
1324 "Dereference through the `->' operator of TYPE.
1325 Uses the return type of the '->' operator if it is contained in TYPE.
1326 SCOPE is the current local scope to perform searches in.
1327 TYPE-DECLARATION is passed through."
1328 (if semantic-c-member-of-autocast
1329 (let ((operator (car (semantic-find-tags-by-name "->" (semantic-analyze-scoped-type-parts type)))))
1330 (if operator
1331 (list (semantic-tag-get-attribute operator :type) (semantic-tag-get-attribute operator :type))
1332 (list type type-declaration)))
1333 (list type type-declaration)))
1335 ;; David Engster: The following three functions deal with namespace
1336 ;; aliases and types which are member of a namespace through a using
1337 ;; statement. For examples, see the file semantic/tests/testusing.cpp,
1338 ;; tests 5 and following.
1340 (defun semantic-c-dereference-namespace (type scope &optional type-declaration)
1341 "Dereference namespace which might hold an 'alias' for TYPE.
1342 Such an alias can be created through 'using' statements in a
1343 namespace declaration. This function checks the namespaces in
1344 SCOPE for such statements."
1345 (let ((scopetypes (oref scope scopetypes))
1346 typename currentns tmp usingname result namespaces)
1347 (when (and (semantic-tag-p type-declaration)
1348 (or (null type) (semantic-tag-prototype-p type)))
1349 (setq typename (semantic-analyze-split-name (semantic-tag-name type-declaration)))
1350 ;; If we already have that TYPE in SCOPE, we do nothing
1351 (unless (semantic-deep-find-tags-by-name (or (car-safe typename) typename) scopetypes)
1352 (if (stringp typename)
1353 ;; The type isn't fully qualified, so we have to search in all namespaces in SCOPE.
1354 (setq namespaces (semantic-find-tags-by-type "namespace" scopetypes))
1355 ;; This is a fully qualified name, so we only have to search one namespace.
1356 (setq namespaces (semanticdb-typecache-find (car typename)))
1357 ;; Make sure it's really a namespace.
1358 (if (string= (semantic-tag-type namespaces) "namespace")
1359 (setq namespaces (list namespaces))
1360 (setq namespaces nil)))
1361 (setq result nil)
1362 ;; Iterate over all the namespaces we have to check.
1363 (while (and namespaces
1364 (null result))
1365 (setq currentns (car namespaces))
1366 ;; Check if this is namespace is an alias and dereference it if necessary.
1367 (setq result (semantic-c-dereference-namespace-alias type-declaration currentns))
1368 (unless result
1369 ;; Otherwise, check if we can reach the type through 'using' statements.
1370 (setq result
1371 (semantic-c-check-type-namespace-using type-declaration currentns)))
1372 (setq namespaces (cdr namespaces)))))
1373 (if result
1374 ;; we have found the original type
1375 (list result result)
1376 (list type type-declaration))))
1378 (defun semantic-c-dereference-namespace-alias (type namespace)
1379 "Dereference TYPE in NAMESPACE, given that NAMESPACE is an alias.
1380 Checks if NAMESPACE is an alias and if so, returns a new type
1381 with a fully qualified name in the original namespace. Returns
1382 nil if NAMESPACE is not an alias."
1383 (when (eq (semantic-tag-get-attribute namespace :kind) 'alias)
1384 (let ((typename (semantic-analyze-split-name (semantic-tag-name type)))
1385 ns nstype originaltype newtype)
1386 ;; Make typename unqualified
1387 (if (listp typename)
1388 (setq typename (last typename))
1389 (setq typename (list typename)))
1390 (when
1391 (and
1392 ;; Get original namespace and make sure TYPE exists there.
1393 (setq ns (semantic-tag-name
1394 (car (semantic-tag-get-attribute namespace :members))))
1395 (setq nstype (semanticdb-typecache-find ns))
1396 (setq originaltype (semantic-find-tags-by-name
1397 (car typename)
1398 (semantic-tag-get-attribute nstype :members))))
1399 ;; Construct new type with name in original namespace.
1400 (setq ns (semantic-analyze-split-name ns))
1401 (setq newtype
1402 (semantic-tag-clone
1403 (car originaltype)
1404 (semantic-analyze-unsplit-name
1405 (if (listp ns)
1406 (append ns typename)
1407 (append (list ns) typename)))))))))
1409 ;; This searches a type in a namespace, following through all using
1410 ;; statements.
1411 (defun semantic-c-check-type-namespace-using (type namespace)
1412 "Check if TYPE is accessible in NAMESPACE through a using statement.
1413 Returns the original type from the namespace where it is defined,
1414 or nil if it cannot be found."
1415 (let (usings result usingname usingtype unqualifiedname members shortname tmp)
1416 ;; Get all using statements from NAMESPACE.
1417 (when (and (setq usings (semantic-tag-get-attribute namespace :members))
1418 (setq usings (semantic-find-tags-by-class 'using usings)))
1419 ;; Get unqualified typename.
1420 (when (listp (setq unqualifiedname (semantic-analyze-split-name
1421 (semantic-tag-name type))))
1422 (setq unqualifiedname (car (last unqualifiedname))))
1423 ;; Iterate over all using statements in NAMESPACE.
1424 (while (and usings
1425 (null result))
1426 (setq usingname (semantic-analyze-split-name
1427 (semantic-tag-name (car usings)))
1428 usingtype (semantic-tag-type (semantic-tag-type (car usings))))
1429 (cond
1430 ((or (string= usingtype "namespace")
1431 (stringp usingname))
1432 ;; We are dealing with a 'using [namespace] NAMESPACE;'
1433 ;; Search for TYPE in that namespace
1434 (setq result
1435 (semanticdb-typecache-find usingname))
1436 (if (and result
1437 (setq members (semantic-tag-get-attribute result :members))
1438 (setq members (semantic-find-tags-by-name unqualifiedname members)))
1439 ;; TYPE is member of that namespace, so we are finished
1440 (setq result (car members))
1441 ;; otherwise recursively search in that namespace for an alias
1442 (setq result (semantic-c-check-type-namespace-using type result))
1443 (when result
1444 (setq result (semantic-tag-type result)))))
1445 ((and (string= usingtype "class")
1446 (listp usingname))
1447 ;; We are dealing with a 'using TYPE;'
1448 (when (string= unqualifiedname (car (last usingname)))
1449 ;; We have found the correct tag.
1450 (setq result (semantic-tag-type (car usings))))))
1451 (setq usings (cdr usings))))
1452 result))
1455 (define-mode-local-override semantic-analyze-dereference-metatype
1456 c-mode (type scope &optional type-declaration)
1457 "Dereference TYPE as described in `semantic-analyze-dereference-metatype'.
1458 Handle typedef, template instantiation, and '->' operator."
1459 (let* ((dereferencer-list '(semantic-c-dereference-typedef
1460 semantic-c-dereference-template
1461 semantic-c-dereference-member-of
1462 semantic-c-dereference-namespace))
1463 (dereferencer (pop dereferencer-list))
1464 (type-tuple)
1465 (original-type type))
1466 (while dereferencer
1467 (setq type-tuple (funcall dereferencer type scope type-declaration)
1468 type (car type-tuple)
1469 type-declaration (cadr type-tuple))
1470 (if (not (eq type original-type))
1471 ;; we found a new type so break the dereferencer loop now !
1472 ;; (we will be recalled with the new type expanded by
1473 ;; semantic-analyze-dereference-metatype-stack).
1474 (setq dereferencer nil)
1475 ;; no new type found try the next dereferencer :
1476 (setq dereferencer (pop dereferencer-list)))))
1477 (list type type-declaration))
1479 (define-mode-local-override semantic-analyze-type-constants c-mode (type)
1480 "When TYPE is a tag for an enum, return it's parts.
1481 These are constants which are of type TYPE."
1482 (if (and (eq (semantic-tag-class type) 'type)
1483 (string= (semantic-tag-type type) "enum"))
1484 (semantic-tag-type-members type)))
1486 (define-mode-local-override semantic-analyze-split-name c-mode (name)
1487 "Split up tag names on colon (:) boundaries."
1488 (let ((ans (split-string name ":")))
1489 (if (= (length ans) 1)
1490 name
1491 (delete "" ans))))
1493 (define-mode-local-override semantic-analyze-unsplit-name c-mode (namelist)
1494 "Assemble the list of names NAMELIST into a namespace name."
1495 (mapconcat 'identity namelist "::"))
1497 (define-mode-local-override semantic-ctxt-scoped-types c++-mode (&optional point)
1498 "Return a list of tags of CLASS type based on POINT.
1499 DO NOT return the list of tags encompassing point."
1500 (when point (goto-char (point)))
1501 (let ((tagsaroundpoint (semantic-find-tag-by-overlay))
1502 (tagreturn nil)
1503 (tmp nil))
1504 ;; In C++, we want to find all the namespaces declared
1505 ;; locally and add them to the list.
1506 (setq tmp (semantic-find-tags-by-class 'type (current-buffer)))
1507 (setq tmp (semantic-find-tags-by-type "namespace" tmp))
1508 (setq tmp (semantic-find-tags-by-name "unnamed" tmp))
1509 (setq tagreturn tmp)
1510 ;; We should also find all "using" type statements and
1511 ;; accept those entities in as well.
1512 (setq tmp (semanticdb-find-tags-by-class 'using))
1513 (let ((idx 0)
1514 (len (semanticdb-find-result-length tmp)))
1515 (while (< idx len)
1516 (setq tagreturn (cons (semantic-tag-type (car (semanticdb-find-result-nth tmp idx))) tagreturn))
1517 (setq idx (1+ idx)))
1519 ;; Use the encompased types around point to also look for using statements.
1520 ;;(setq tagreturn (cons "bread_name" tagreturn))
1521 (while (cdr tagsaroundpoint) ; don't search the last one
1522 (setq tmp (semantic-find-tags-by-class 'using (semantic-tag-components (car tagsaroundpoint))))
1523 (dolist (T tmp)
1524 (setq tagreturn (cons (semantic-tag-type T) tagreturn))
1526 (setq tagsaroundpoint (cdr tagsaroundpoint))
1528 ;; If in a function...
1529 (when (and (semantic-tag-of-class-p (car tagsaroundpoint) 'function)
1530 ;; ...search for using statements in the local scope...
1531 (setq tmp (semantic-find-tags-by-class
1532 'using
1533 (semantic-get-local-variables))))
1534 ;; ... and add them.
1535 (setq tagreturn
1536 (append tagreturn
1537 (mapcar 'semantic-tag-type tmp))))
1538 ;; Return the stuff
1539 tagreturn
1542 (define-mode-local-override semantic-get-local-variables c++-mode ()
1543 "Do what `semantic-get-local-variables' does, plus add `this' if needed."
1544 (let* ((origvar (semantic-get-local-variables-default))
1545 (ct (semantic-current-tag))
1546 (p (semantic-tag-function-parent ct)))
1547 ;; If we have a function parent, then that implies we can
1548 (if (and p (semantic-tag-of-class-p ct 'function))
1549 ;; Append a new tag THIS into our space.
1550 (cons (semantic-tag-new-variable "this" p nil)
1551 origvar)
1552 ;; No parent, just return the usual
1553 origvar)
1556 (define-mode-local-override semantic-idle-summary-current-symbol-info
1557 c-mode ()
1558 "Handle the SPP keywords, then use the default mechanism."
1559 (let* ((sym (car (semantic-ctxt-current-thing)))
1560 (spp-sym (semantic-lex-spp-symbol sym)))
1561 (if spp-sym
1562 (let* ((txt (concat "Macro: " sym))
1563 (sv (symbol-value spp-sym))
1564 (arg (semantic-lex-spp-macro-with-args sv))
1566 (when arg
1567 (setq txt (concat txt (format "%S" arg)))
1568 (setq sv (cdr sv)))
1570 ;; This is optional, and potentially fraught w/ errors.
1571 (condition-case nil
1572 (dolist (lt sv)
1573 (setq txt (concat txt " " (semantic-lex-token-text lt))))
1574 (error (setq txt (concat txt " #error in summary fcn"))))
1576 txt)
1577 (semantic-idle-summary-current-symbol-info-default))))
1579 (defvar-mode-local c-mode semantic-orphaned-member-metaparent-type "struct"
1580 "When lost memberes are found in the class hierarchy generator, use a struct.")
1582 (defvar-mode-local c-mode semantic-symbol->name-assoc-list
1583 '((type . "Types")
1584 (variable . "Variables")
1585 (function . "Functions")
1586 (include . "Includes")
1588 "List of tag classes, and strings to describe them.")
1590 (defvar-mode-local c-mode semantic-symbol->name-assoc-list-for-type-parts
1591 '((type . "Types")
1592 (variable . "Attributes")
1593 (function . "Methods")
1594 (label . "Labels")
1596 "List of tag classes in a datatype decl, and strings to describe them.")
1598 (defvar-mode-local c-mode imenu-create-index-function 'semantic-create-imenu-index
1599 "Imenu index function for C.")
1601 (defvar-mode-local c-mode semantic-type-relation-separator-character
1602 '("." "->" "::")
1603 "Separator characters between something of a given type, and a field.")
1605 (defvar-mode-local c-mode semantic-command-separation-character ";"
1606 "Commen separation character for C")
1608 (defvar-mode-local c-mode senator-step-at-tag-classes '(function variable)
1609 "Tag classes where senator will stop at the end.")
1611 ;;;###autoload
1612 (defun semantic-default-c-setup ()
1613 "Set up a buffer for semantic parsing of the C language."
1614 (semantic-c-by--install-parser)
1615 (setq semantic-lex-syntax-modifications '((?> ".")
1616 (?< ".")
1620 (setq semantic-lex-analyzer #'semantic-c-lexer)
1621 (add-hook 'semantic-lex-reset-hooks 'semantic-lex-spp-reset-hook nil t)
1624 ;;;###autoload
1625 (defun semantic-c-add-preprocessor-symbol (sym replacement)
1626 "Add a preprocessor symbol SYM with a REPLACEMENT value."
1627 (interactive "sSymbol: \nsReplacement: ")
1628 (let ((SA (assoc sym semantic-lex-c-preprocessor-symbol-map)))
1629 (if SA
1630 ;; Replace if there is one.
1631 (setcdr SA replacement)
1632 ;; Otherwise, append
1633 (setq semantic-lex-c-preprocessor-symbol-map
1634 (cons (cons sym replacement)
1635 semantic-lex-c-preprocessor-symbol-map))))
1637 (semantic-c-reset-preprocessor-symbol-map)
1640 ;;; SETUP QUERY
1642 (defun semantic-c-describe-environment ()
1643 "Describe the Semantic features of the current C environment."
1644 (interactive)
1645 (if (not (or (eq major-mode 'c-mode) (eq major-mode 'c++-mode)))
1646 (error "Not useful to query C mode in %s mode" major-mode))
1647 (let ((gcc (when (boundp 'semantic-gcc-setup-data)
1648 semantic-gcc-setup-data))
1650 (semantic-fetch-tags)
1652 (with-output-to-temp-buffer "*Semantic C Environment*"
1653 (when gcc
1654 (princ "Calculated GCC Parameters:")
1655 (dolist (P gcc)
1656 (princ "\n ")
1657 (princ (car P))
1658 (princ " = ")
1659 (princ (cdr P))
1663 (princ "\n\nInclude Path Summary:\n")
1664 (when (and (boundp 'ede-object) ede-object)
1665 (princ "\n This file's project include is handled by:\n")
1666 (princ " ")
1667 (princ (object-print ede-object))
1668 (princ "\n with the system path:\n")
1669 (dolist (dir (ede-system-include-path ede-object))
1670 (princ " ")
1671 (princ dir)
1672 (princ "\n"))
1675 (when semantic-dependency-include-path
1676 (princ "\n This file's generic include path is:\n")
1677 (dolist (dir semantic-dependency-include-path)
1678 (princ " ")
1679 (princ dir)
1680 (princ "\n")))
1682 (when semantic-dependency-system-include-path
1683 (princ "\n This file's system include path is:\n")
1684 (dolist (dir semantic-dependency-system-include-path)
1685 (princ " ")
1686 (princ dir)
1687 (princ "\n")))
1689 (princ "\n\nMacro Summary:\n")
1690 (when semantic-lex-c-preprocessor-symbol-file
1691 (princ "\n Your CPP table is primed from these files:\n")
1692 (dolist (file semantic-lex-c-preprocessor-symbol-file)
1693 (princ " ")
1694 (princ file)
1695 (princ "\n")
1696 (princ " in table: ")
1697 (princ (object-print (semanticdb-file-table-object file)))
1698 (princ "\n")
1701 (when semantic-lex-c-preprocessor-symbol-map-builtin
1702 (princ "\n Built-in symbol map:\n")
1703 (dolist (S semantic-lex-c-preprocessor-symbol-map-builtin)
1704 (princ " ")
1705 (princ (car S))
1706 (princ " = ")
1707 (princ (cdr S))
1708 (princ "\n")
1711 (when semantic-lex-c-preprocessor-symbol-map
1712 (princ "\n User symbol map:\n")
1713 (dolist (S semantic-lex-c-preprocessor-symbol-map)
1714 (princ " ")
1715 (princ (car S))
1716 (princ " = ")
1717 (princ (cdr S))
1718 (princ "\n")
1721 (princ "\n\n Use: M-x semantic-lex-spp-describe RET\n")
1722 (princ "\n to see the complete macro table.\n")
1726 (provide 'semantic/bovine/c)
1728 (semantic-c-reset-preprocessor-symbol-map)
1730 ;; Local variables:
1731 ;; generated-autoload-file: "../loaddefs.el"
1732 ;; generated-autoload-feature: semantic/loaddefs
1733 ;; generated-autoload-load-name: "semantic/bovine/c"
1734 ;; End:
1736 ;; arch-tag: 263951a8-0f18-445d-8e73-eb8f9ac8e2a3
1737 ;;; semantic/bovine/c.el ends here