Commit b0fe992f authored by David Engster's avatar David Engster
Browse files

Merge with CEDET upstream.

* admin/grammars/c.by (expr-binop): Add MOD.
(variablearg): Add 'opt-assign'.
(variablearg, varnamelist): Add default values so that it can be
later expanded into the tag.
(opt-stuff-after-symbol): Rename to 'brackets-after-symbol' and
remove empty match.
(multi-stage-dereference): Adapt to above rename.
(unaryexpression): Use 'symbol' instead of 'namespace-symbol',
since the latter also leads to an empty match at the end which
would make this too greedy.
(variablearg-opt-name): Support parsing of function pointers
inside an argument list.

* semantic/analyze.el
(semantic-analyze-find-tag-sequence-default): Always add scope to
the local miniscope for each type.  Otherwise, structure tags are
not analyzed correctly.  Also, always search the extended
miniscope even when not dealing with types.

* semantic/ctxt.el (semantic-get-local-variables-default): Also
try to parse local variables for buffers which are currently
marked as unparseable.  Otherwise, it is often impossible to
complete local variables.

* semantic/scope.el (semantic-analyze-scoped-types-default): If we
cannot find a type in the typecache, also look into the the types
we already found.  This is necessary since in C++, a 'using
namespace' can be dependend on a previous one.
(semantic-completable-tags-from-type): When creating the list of
completable types, pull in types which are referenced through
'using' statements, and also preserve their filenames.

* semanitc/bovine/c.el (semantic/analyze/refs): Require.
(semantic-analyze-tag-references): New override.  Mainly copied
from the default implementation, but if nothing could be found (or
just the tag itself), drop all namespaces from the scope and
search again.  This is necessary for implementations which are
defined outside of the namespace and only pull those in through
'using' statements.
(semantic-ctxt-scoped-types): Go through all tags around point and
search them for using statements.  In the case for using
statements outside of function scope, append them in the correct
order instead of using 'cons'.  This is important since using
statements may depend on previous ones.
(semantic-expand-c-tag-namelist): Do not try to parse struct
definitions as default values.  The grammar parser seems to return
the point positions slightly differently (as a cons instead of a
list).  Also, set parent for typedefs to 'nil'.  It does not
really make sense to set a parent class for typedefs, and it can
also lead to endless loops when calculating scope.
(semantic-c-reconstitute-token): Change handling of function
pointers; instead of seeing them as variables, handle them as
functions with a 'function-pointer' attribute.  Also, correctly
deal with function pointers as function arguments.
(semantic-c-reconstitute-function-arglist): New function to parse
function pointers inside an argument list.
(semantic-format-tag-name): Use 'function-pointer' attribute
instead of the old 'functionpointer-flag'.
(semantic-cpp-lexer): Use new `semantic-lex-spp-paren-or-list'.

* semantic/bovine/gcc.el (semantic-gcc-setup): Add 'features.h' to
the list of files whose preprocessor symbols are included.  This
pulls in things like __USE_POSIX and similar.

* semantic/format.el (semantic-format-tag-prototype-default):
Display default values if available.

* semantic/analyze/refs.el (semantic-analyze-refs-impl)
(semantic-analyze-refs-proto): Add 'default-value' as ignorable in
call to `semantic-tag-similar-p'.

* semantic/db-mode.el (semanticdb-semantic-init-hook-fcn): Always
set buffer for `semanticdb-current-table'.

* semantic/db.el (semanticdb-table::semanticdb-refresh-table): The
previous change turned up a bug in this method.  Since the current
table now correctly has a buffer set, the first clause in the
`cond' would be taken, but there was a `save-excursion' missing.

* semantic/lex-spp.el (semantic-c-end-of-macro): Declare.
(semantic-lex-spp-token-macro-to-macro-stream): Deal with macros
which open/close a scope.  For this, leave an overlay if we
encounter a single open paren and return a semantic-list in the
lexer.  When this list gets expanded, retrieve the old position
from the overlay.  See the comments in the function for further
details.
(semantic-lex-spp-find-closing-macro): New function to find the
next macro which closes scope (i.e., has a closing paren).
(semantic-lex-spp-replace-or-symbol-or-keyword): Go to end of
closing macro if necessary.
(semantic-lex-spp-paren-or-list): New lexer to specially deal with
parens in macro definitions.

* semantic/decorate/mode.el (semantic-decoration-mode): Do not
decorate available tags immediately but in an idle timer, since
EDE will usually not be activated yet, which will make it
impossible to find project includes.

* semantic/decorate/include.el
(semantic-decoration-on-includes-highlight-default): Remove
'unloaded' from throttle when decorating includes, otherwise all
would be loaded.  Rename 'table' to 'currenttable' to make things
clearer.

* ede/linux.el (cl): Require during compile.

* ede/linux.el (project-linux-build-directory-default)
(project-linux-architecture-default): Add customizable variables.
(ede-linux-project): Add additional slots to track Linux-specific
information (out-of-tree build directory and selected
architecture).
(ede-linux--get-build-directory, ede-linux--get-archs)
(ede-linux--detect-architecture, ede-linux--get-architecture)
(ede-linux--include-path): Added function to detect Linux-specific
information.
(ede-linux-load): Set new Linux-specific information when creating
a project.
(ede-expand-filename-impl): Use new and more accurate include
information.

* semantic/scope.el (semantic-calculate-scope): Return a clone of
the scopecache, so that everyone is working with its own (shallow)
copy.  Otherwise, if one caller is resetting the scope, it would
be reset for all others working with the scope cache as well.
parent f4fe8fdd
2013-12-12 David Engster <deng@randomsample.de>
* grammars/c.by (expr-binop): Add MOD.
(variablearg): Add 'opt-assign'.
(variablearg, varnamelist): Add default values so that it can be
later expanded into the tag.
(opt-stuff-after-symbol): Rename to 'brackets-after-symbol' and
remove empty match.
(multi-stage-dereference): Adapt to above rename.
(unaryexpression): Use 'symbol' instead of 'namespace-symbol',
since the latter also leads to an empty match at the end which
would make this too greedy.
(variablearg-opt-name): Support parsing of function pointers
inside an argument list.
2013-12-11 Paul Eggert <eggert@cs.ucla.edu>
Remove the option of using libcrypto.
......
......@@ -901,8 +901,8 @@ varname
;; I should store more in this def, but leave it simple for now.
;; Klaus Berndl: const and volatile can be written after the type!
variablearg
: declmods typeformbase cv-declmods opt-ref variablearg-opt-name
( VARIABLE-TAG (list $5) $2 nil
: declmods typeformbase cv-declmods opt-ref variablearg-opt-name opt-assign
( VARIABLE-TAG (list (append $5 ,$6)) $2 nil
:constant-flag (if (member "const" (append $1 $3)) t nil)
:typemodifiers (delete "const" (append $1 $3))
:reference (car ,$4)
......@@ -912,6 +912,8 @@ variablearg
variablearg-opt-name
: varname
( ,$1 )
| semantic-list arg-list
( (car ( EXPAND $1 function-pointer )) $2)
;; Klaus Berndl: This allows variableargs without a arg-name being
;; parsed correct even if there several pointers (*)
| opt-stars
......@@ -926,9 +928,9 @@ varname-opt-initializer
varnamelist
: opt-ref varname varname-opt-initializer COMA varnamelist
( ,(cons $2 $5) )
( ,(cons (append $2 $3) $5) )
| opt-ref varname varname-opt-initializer
( $2 )
( (append $2 $3) )
;
;; Klaus Berndl: Is necessary to parse stuff like
......@@ -1152,16 +1154,15 @@ type-cast-list
: open-paren typeformbase close-paren
;
opt-stuff-after-symbol
brackets-after-symbol
: PAREN_BLCK
| BRACK_BLCK
| ;; EMPTY
;
multi-stage-dereference
: namespace-symbol opt-stuff-after-symbol PERIOD multi-stage-dereference ;; method call
| namespace-symbol opt-stuff-after-symbol MINUS GREATER multi-stage-dereference ;;method call
| namespace-symbol opt-stuff-after-symbol
: namespace-symbol brackets-after-symbol PERIOD multi-stage-dereference ;; method call
| namespace-symbol brackets-after-symbol MINUS GREATER multi-stage-dereference ;;method call
| namespace-symbol brackets-after-symbol
;
string-seq
......@@ -1187,6 +1188,7 @@ expr-binop
| AMPERSAND
| OR OR
| OR
| MOD
;; There are more.
;
......@@ -1204,8 +1206,7 @@ unaryexpression
| multi-stage-dereference
| NEW multi-stage-dereference
| NEW builtintype-types semantic-list
;; Klaus Berndl: symbol -> namespace-symbol!
| namespace-symbol
| symbol
;; Klaus Berndl: C/C++ allows sequences of strings which are
;; concatenated by the precompiler to one string
| string-seq
......
2013-12-12 David Engster <deng@randomsample.de>
* semantic/analyze.el
(semantic-analyze-find-tag-sequence-default): Always add scope to
the local miniscope for each type. Otherwise, structure tags are
not analyzed correctly. Also, always search the extended
miniscope even when not dealing with types.
* semantic/ctxt.el (semantic-get-local-variables-default): Also
try to parse local variables for buffers which are currently
marked as unparseable. Otherwise, it is often impossible to
complete local variables.
* semantic/scope.el (semantic-analyze-scoped-types-default): If we
cannot find a type in the typecache, also look into the the types
we already found. This is necessary since in C++, a 'using
namespace' can be dependend on a previous one.
(semantic-completable-tags-from-type): When creating the list of
completable types, pull in types which are referenced through
'using' statements, and also preserve their filenames.
* semanitc/bovine/c.el (semantic/analyze/refs): Require.
(semantic-analyze-tag-references): New override. Mainly copied
from the default implementation, but if nothing could be found (or
just the tag itself), drop all namespaces from the scope and
search again. This is necessary for implementations which are
defined outside of the namespace and only pull those in through
'using' statements.
(semantic-ctxt-scoped-types): Go through all tags around point and
search them for using statements. In the case for using
statements outside of function scope, append them in the correct
order instead of using 'cons'. This is important since using
statements may depend on previous ones.
(semantic-expand-c-tag-namelist): Do not try to parse struct
definitions as default values. The grammar parser seems to return
the point positions slightly differently (as a cons instead of a
list). Also, set parent for typedefs to 'nil'. It does not
really make sense to set a parent class for typedefs, and it can
also lead to endless loops when calculating scope.
(semantic-c-reconstitute-token): Change handling of function
pointers; instead of seeing them as variables, handle them as
functions with a 'function-pointer' attribute. Also, correctly
deal with function pointers as function arguments.
(semantic-c-reconstitute-function-arglist): New function to parse
function pointers inside an argument list.
(semantic-format-tag-name): Use 'function-pointer' attribute
instead of the old 'functionpointer-flag'.
(semantic-cpp-lexer): Use new `semantic-lex-spp-paren-or-list'.
* semantic/bovine/gcc.el (semantic-gcc-setup): Add 'features.h' to
the list of files whose preprocessor symbols are included. This
pulls in things like __USE_POSIX and similar.
* semantic/format.el (semantic-format-tag-prototype-default):
Display default values if available.
* semantic/analyze/refs.el (semantic-analyze-refs-impl)
(semantic-analyze-refs-proto): Add 'default-value' as ignorable in
call to `semantic-tag-similar-p'.
* semantic/db-mode.el (semanticdb-semantic-init-hook-fcn): Always
set buffer for `semanticdb-current-table'.
* semantic/db.el (semanticdb-table::semanticdb-refresh-table): The
previous change turned up a bug in this method. Since the current
table now correctly has a buffer set, the first clause in the
`cond' would be taken, but there was a `save-excursion' missing.
* semantic/lex-spp.el (semantic-c-end-of-macro): Declare.
(semantic-lex-spp-token-macro-to-macro-stream): Deal with macros
which open/close a scope. For this, leave an overlay if we
encounter a single open paren and return a semantic-list in the
lexer. When this list gets expanded, retrieve the old position
from the overlay. See the comments in the function for further
details.
(semantic-lex-spp-find-closing-macro): New function to find the
next macro which closes scope (i.e., has a closing paren).
(semantic-lex-spp-replace-or-symbol-or-keyword): Go to end of
closing macro if necessary.
(semantic-lex-spp-paren-or-list): New lexer to specially deal with
parens in macro definitions.
* semantic/decorate/mode.el (semantic-decoration-mode): Do not
decorate available tags immediately but in an idle timer, since
EDE will usually not be activated yet, which will make it
impossible to find project includes.
* semantic/decorate/include.el
(semantic-decoration-on-includes-highlight-default): Remove
'unloaded' from throttle when decorating includes, otherwise all
would be loaded. Rename 'table' to 'currenttable' to make things
clearer.
* ede/linux.el (cl): Require during compile.
2013-12-12 Lluís Vilanova <xscript@gmx.net>
* ede/linux.el (project-linux-build-directory-default)
(project-linux-architecture-default): Add customizable variables.
(ede-linux-project): Add additional slots to track Linux-specific
information (out-of-tree build directory and selected
architecture).
(ede-linux--get-build-directory, ede-linux--get-archs)
(ede-linux--detect-architecture, ede-linux--get-architecture)
(ede-linux--include-path): Added function to detect Linux-specific
information.
(ede-linux-load): Set new Linux-specific information when creating
a project.
(ede-expand-filename-impl): Use new and more accurate include
information.
2013-12-12 Eric Ludlam <zappo@gnu.org>
* semantic/scope.el (semantic-calculate-scope): Return a clone of
the scopecache, so that everyone is working with its own (shallow)
copy. Otherwise, if one caller is resetting the scope, it would
be reset for all others working with the scope cache as well.
2013-12-12 Alex Ott <alexott@gmail.com>
* ede/generic.el (project-run-target): Remove incorrect require.
* semantic/format.el (semantic-format-tag-prototype-default): Use
concat only for strings.
2013-11-30 Glenn Morris <rgm@gnu.org>
Stop keeping (most) generated cedet grammar files in the repository.
......
......@@ -360,7 +360,6 @@ Argument COMMAND is the command to use for compiling the target."
(defmethod project-run-target ((target ede-generic-target))
"Run the current project derived from TARGET."
(require 'ede-shell)
(let* ((proj (ede-target-parent target))
(config (ede-generic-get-configuration proj))
(run (concat "./" (oref config :run-command)))
......
......@@ -32,6 +32,8 @@
;; * Add texinfo lookup options.
;; * Add website
(eval-when-compile (require 'cl))
(require 'ede)
(require 'ede/make)
......@@ -46,6 +48,19 @@
:group 'ede
:version "24.3")
(defcustom project-linux-build-directory-default 'ask
"Build directory."
:group 'project-linux
:type '(choice (const :tag "Same as source directory" 'same)
(const :tag "Ask the user" 'ask)))
(defcustom project-linux-architecture-default 'ask
"Target architecture to assume when not auto-detected."
:group 'project-linux
:type '(choice (string :tag "Architecture name")
(const :tag "Ask the user" 'ask)))
(defcustom project-linux-compile-target-command (concat ede-make-command " -k -C %s SUBDIRS=%s")
"*Default command used to compile a target."
:group 'project-linux
......@@ -109,10 +124,100 @@ DIR is the directory to search from."
(defclass ede-linux-project (ede-project eieio-instance-tracker)
((tracking-symbol :initform 'ede-linux-project-list)
)
(build-directory :initarg :build-directory
:type string
:documentation "Build directory.")
(architecture :initarg :architecture
:type string
:documentation "Target architecture.")
(include-path :initarg :include-path
:type list
:documentation "Include directories.
Contains both common and target architecture-specific directories."))
"Project Type for the Linux source code."
:method-invocation-order :depth-first)
(defun ede-linux--get-build-directory (dir)
"Detect build directory for sources in DIR.
If DIR has not been used as a build directory, fall back to
`project-linux-build-directory-default'."
(or
;; detected build on source directory
(and (file-exists-p (expand-file-name ".config" dir)) dir)
;; use configuration
(case project-linux-build-directory-default
(same dir)
(ask (read-directory-name "Select Linux' build directory: " dir)))))
(defun ede-linux--get-archs (dir)
"Returns a list of architecture names found in DIR."
(let ((archs-dir (expand-file-name "arch" dir))
archs)
(when (file-directory-p archs-dir)
(mapc (lambda (elem)
(when (and
(not (string= elem "."))
(not (string= elem ".."))
(not (string= elem "x86_64")) ; has no separate sources
(file-directory-p
(expand-file-name elem archs-dir)))
(add-to-list 'archs elem t)))
(directory-files archs-dir)))
archs))
(defun ede-linux--detect-architecture (dir)
"Try to auto-detect the architecture as configured in DIR.
DIR is Linux' build directory. If it cannot be auto-detected,
returns `project-linux-architecture-default'."
(let ((archs-dir (expand-file-name "arch" dir))
(archs (ede-linux--get-archs dir))
arch found)
(or (and
archs
;; Look for /arch/<arch>/include/generated
(progn
(while (and archs (not found))
(setq arch (car archs))
(when (file-directory-p
(expand-file-name (concat arch "/include/generated")
archs-dir))
(setq found arch))
(setq archs (cdr archs)))
found))
project-linux-architecture-default)))
(defun ede-linux--get-architecture (dir bdir)
"Try to auto-detect the architecture as configured in BDIR.
Uses `ede-linux--detect-architecture' for the auto-detection. If
the result is `ask', let the user choose from architectures found
in DIR."
(let ((arch (ede-linux--detect-architecture bdir)))
(case arch
(ask
(completing-read "Select target architecture: "
(ede-linux--get-archs dir)))
(t arch))))
(defun ede-linux--include-path (dir bdir arch)
"Returns a list with include directories.
Returned directories might not exist, since they are not created
until Linux is built for the first time."
(map 'list
(lambda (elem) (format (concat (car elem) "/" (cdr elem)) arch))
;; XXX: taken from the output of "make V=1"
(list (cons dir "arch/%s/include")
(cons bdir "arch/%s/include/generated")
(cons dir "include")
(cons bdir "include")
(cons dir "arch/%s/include/uapi")
(cons bdir "arch/%s/include/generated/uapi")
(cons dir "include/uapi")
(cons bdir "include/generated/uapi"))))
;;;###autoload
(defun ede-linux-load (dir &optional rootproj)
"Return an Linux Project object if there is a match.
......@@ -121,15 +226,20 @@ Argument DIR is the directory it is created for.
ROOTPROJ is nil, since there is only one project."
(or (ede-linux-file-existing dir)
;; Doesn't already exist, so let's make one.
(let ((proj (ede-linux-project
(let* ((bdir (ede-linux--get-build-directory dir))
(arch (ede-linux--get-architecture dir bdir))
(include-path (ede-linux--include-path dir bdir arch))
(proj (ede-linux-project
"Linux"
:name "Linux"
:version (ede-linux-version dir)
:directory (file-name-as-directory dir)
:file (expand-file-name "scripts/ver_linux"
dir))))
(ede-add-project-to-global-list proj))
))
dir)
:build-directory bdir
:architecture arch
:include-path include-path)))
(ede-add-project-to-global-list proj))))
;;;###autoload
(ede-add-project-autoload
......@@ -247,16 +357,21 @@ Knows about how the Linux source tree is organized."
(let* ((ext (file-name-extension name))
(root (ede-project-root proj))
(dir (ede-project-root-directory root))
(bdir (oref proj build-directory))
(F (cond
((not ext) nil)
((string-match "h" ext)
(or (ede-linux-file-exists-name name dir "")
(ede-linux-file-exists-name name dir "include"))
)
(let ((dirs (oref proj include-path))
found)
(while (and dirs (not found))
(setq found
(or (ede-linux-file-exists-name name bdir (car dirs))
(ede-linux-file-exists-name name dir (car dirs))))
(setq dirs (cdr dirs)))
found))
((string-match "txt" ext)
(ede-linux-file-exists-name name dir "Documentation"))
(t nil)))
)
(t nil))))
(or F (call-next-method))))
(defmethod project-compile-project ((proj ede-linux-project)
......
......@@ -295,18 +295,10 @@ Optional argument THROWSYM specifies a symbol the throw on non-recoverable error
;; In some cases the found TMP is a type,
;; and we can use it directly.
(cond ((semantic-tag-of-class-p tmp 'type)
;; update the miniscope when we need to analyze types directly.
(when miniscope
(let ((rawscope
(apply 'append
(mapcar 'semantic-tag-type-members
tagtype))))
(oset miniscope fullscope rawscope)))
;; Now analyze the type to remove metatypes.
(or (semantic-analyze-type tmp miniscope)
tmp))
(t
(semantic-analyze-tag-type tmp scope))))
(semantic-analyze-tag-type tmp miniscope))))
(typefile
(when tmptype
(semantic-tag-file-name tmptype)))
......@@ -336,6 +328,11 @@ Optional argument THROWSYM specifies a symbol the throw on non-recoverable error
(semantic--tag-put-property tmp :filename fname))
(setq tag (cons tmp tag))
(setq tagtype (cons tmptype tagtype))
(when miniscope
(let ((rawscope
(apply 'append
(mapcar 'semantic-tag-type-members tagtype))))
(oset miniscope fullscope rawscope)))
)
(setq s (cdr s)))
......
......@@ -118,7 +118,8 @@ Optional argument IN-BUFFER indicates that the returned tag should be in an acti
(semantic-tag-similar-p tag aT
:prototype-flag
:parent
:typemodifiers))
:typemodifiers
:default-value))
(when in-buffer (save-excursion (semantic-go-to-tag aT aDB)))
(push aT impl))))
allhits)
......@@ -141,7 +142,8 @@ Optional argument IN-BUFFER indicates that the returned tag should be in an acti
(semantic-tag-similar-p tag aT
:prototype-flag
:parent
:typemodifiers))
:typemodifiers
:default-value))
(when in-buffer (save-excursion (semantic-go-to-tag aT aDB)))
(push aT proto))))
allhits)
......
......@@ -27,6 +27,7 @@
(require 'semantic)
(require 'semantic/analyze)
(require 'semantic/analyze/refs)
(require 'semantic/bovine)
(require 'semantic/bovine/gcc)
(require 'semantic/idle)
......@@ -812,7 +813,7 @@ Use semantic-cpp-lexer for parsing text inside a CPP macro."
;; semantic-lex-spp-replace-or-symbol-or-keyword
semantic-lex-symbol-or-keyword
semantic-lex-charquote
semantic-lex-paren-or-list
semantic-lex-spp-paren-or-list
semantic-lex-close-paren
semantic-lex-ignore-comments
semantic-lex-punctuation
......@@ -1118,7 +1119,8 @@ is its own toplevel tag. This function will return (cons A B)."
(semantic-tag-new-variable
(car cur) ;name
ty ;type
(if default
(if (and default
(listp (cdr default)))
(buffer-substring-no-properties
(car default) (car (cdr default))))
:constant-flag (semantic-tag-variable-constant-p tag)
......@@ -1173,11 +1175,7 @@ is its own toplevel tag. This function will return (cons A B)."
(nth 1 (car names)) ; name
"typedef"
(semantic-tag-type-members tag)
;; parent is just the name of what
;; is passed down as a tag.
(list
(semantic-tag-name
(semantic-tag-type-superclasses tag)))
nil
:pointer
(let ((stars (car (car (car names)))))
(if (= stars 0) nil stars))
......@@ -1227,6 +1225,45 @@ or \"struct\".")
name
(delete "" ans))))
(define-mode-local-override semantic-analyze-tag-references c-mode (tag &optional db)
"Analyze the references for TAG.
Returns a class with information about TAG.
Optional argument DB is a database. It will be used to help
locate TAG.
Use `semantic-analyze-current-tag' to debug this fcn."
(when (not (semantic-tag-p tag)) (signal 'wrong-type-argument (list 'semantic-tag-p tag)))
(let ((allhits nil)
(scope nil)
(refs nil))
(save-excursion
(semantic-go-to-tag tag db)
(setq scope (semantic-calculate-scope))
(setq allhits (semantic--analyze-refs-full-lookup tag scope t))
(when (or (zerop (semanticdb-find-result-length allhits))
(and (= (semanticdb-find-result-length allhits) 1)
(eq (car (semanticdb-find-result-nth allhits 0)) tag)))
;; It found nothing or only itself - not good enough. As a
;; last resort, let's remove all namespaces from the scope and
;; search again.
(oset scope parents
(let ((parents (oref scope parents))
newparents)
(dolist (cur parents)
(unless (string= (semantic-tag-type cur) "namespace")
(push cur newparents)))
(reverse newparents)))
(setq allhits (semantic--analyze-refs-full-lookup tag scope t)))
(setq refs (semantic-analyze-references (semantic-tag-name tag)
:tag tag
:tagdb db
:scope scope
:rawsearchdata allhits)))))
(defun semantic-c-reconstitute-token (tokenpart declmods typedecl)
"Reconstitute a token TOKENPART with DECLMODS and TYPEDECL.
This is so we don't have to match the same starting text several times.
......@@ -1258,7 +1295,8 @@ Optional argument STAR and REF indicate the number of * and & in the typedef."
(nth 10 tokenpart) ; initializers
)
(not (car (nth 3 tokenpart)))))
(fcnpointer (string-match "^\\*" (car tokenpart)))
(fcnpointer (and (> (length (car tokenpart)) 0)
(= (aref (car tokenpart) 0) ?*)))
(fnname (if fcnpointer
(substring (car tokenpart) 1)
(car tokenpart)))
......@@ -1266,15 +1304,6 @@ Optional argument STAR and REF indicate the number of * and & in the typedef."
nil
t))
)
(if fcnpointer
;; Function pointers are really variables.
(semantic-tag-new-variable
fnname
typedecl
nil
;; It is a function pointer
:functionpointer-flag t
)
;; The function
(semantic-tag-new-function
fnname
......@@ -1299,12 +1328,14 @@ Optional argument STAR and REF indicate the number of * and & in the typedef."
nil
))
(t "int")))
(nth 4 tokenpart) ;arglist
;; Argument list can contain things like function pointers
(semantic-c-reconstitute-function-arglist (nth 4 tokenpart))
:constant-flag (if (member "const" declmods) t nil)
:typemodifiers (delete "const" declmods)
:parent (car (nth 2 tokenpart))
:destructor-flag (if (car (nth 3 tokenpart) ) t)
:constructor-flag (if constructor t)
:function-pointer fcnpointer
:pointer (nth 7 tokenpart)
:operator-flag operator
;; Even though it is "throw" in C++, we use
......@@ -1320,16 +1351,33 @@ Optional argument STAR and REF indicate the number of * and & in the typedef."
;; Pure virtual
:pure-virtual-flag (if (eq (nth 8 tokenpart) :pure-virtual-flag) t)
;; Template specifier.
:template-specifier (nth 9 tokenpart)
)))
)
))
:template-specifier (nth 9 tokenpart))))))
(defun semantic-c-reconstitute-template (tag specifier)
"Reconstitute the token TAG with the template SPECIFIER."
(semantic-tag-put-attribute tag :template (or specifier ""))
tag)
(defun semantic-c-reconstitute-function-arglist (arglist)
"Reconstitute the argument list of a function.
This currently only checks if the function expects a function
pointer as argument."
(let (result)
(dolist (arg arglist)
;; Names starting with a '*' denote a function pointer
(if (and (> (length (semantic-tag-name arg)) 0)
(= (aref (semantic-tag-name arg) 0) ?*))
(setq result
(append result
(list
(semantic-tag-new-function
(substring (semantic-tag-name arg) 1)
(semantic-tag-type arg)