From: Kevin Ryde Date: Sun, 2 Dec 2012 01:47:56 +0000 (+0800) Subject: * lib-src/etags.c (Lisp_functions): Skip (defvar foo) declarations X-Git-Tag: emacs-24.3.90~173^2~9^2~100 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=1cbaa705e733d496a6eab3a8f1521dec52953fcf;p=emacs.git * lib-src/etags.c (Lisp_functions): Skip (defvar foo) declarations unless the --declarations flag is enabled. (Lisp_help): Update. (skip_name): New function. * doc/emacs/maintaining.texi (Tag Syntax): Mention (defvar foo) handling. * doc/man/etags.1: Mention effect of --declarations in Lisp. Fixes: debbugs:5600 --- diff --git a/doc/emacs/ChangeLog b/doc/emacs/ChangeLog index fd543789751..c90f6d4b712 100644 --- a/doc/emacs/ChangeLog +++ b/doc/emacs/ChangeLog @@ -1,3 +1,7 @@ +2012-12-02 Kevin Ryde + + * maintaining.texi (Tag Syntax): Mention (defvar foo) handling. + 2012-12-01 Kevin Ryde * maintaining.texi (Tag Syntax): Mention Perl's "use constant". diff --git a/doc/emacs/maintaining.texi b/doc/emacs/maintaining.texi index 06680a6b4e3..555409f6be6 100644 --- a/doc/emacs/maintaining.texi +++ b/doc/emacs/maintaining.texi @@ -1676,9 +1676,11 @@ specifies (using Bourne shell syntax) that the commands @item In Lisp code, any function defined with @code{defun}, any variable -defined with @code{defvar} or @code{defconst}, and in general the first -argument of any expression that starts with @samp{(def} in column zero is -a tag. +defined with @code{defvar} or @code{defconst}, and in general the +first argument of any expression that starts with @samp{(def} in +column zero is a tag. As an exception, expressions of the form +@code{(defvar @var{foo})} are treated as declarations, and are only +tagged if the @samp{--declarations} option is given. @item In Scheme code, tags include anything defined with @code{def} or with a diff --git a/doc/man/ChangeLog b/doc/man/ChangeLog index cc54cd254b5..afd6b7b6051 100644 --- a/doc/man/ChangeLog +++ b/doc/man/ChangeLog @@ -1,3 +1,7 @@ +2012-12-02 Kevin Ryde + + * etags.1: Mention effect of --declarations in Lisp. + 2012-06-03 Glenn Morris * rcs-checkin.1: Remove. diff --git a/doc/man/etags.1 b/doc/man/etags.1 index a1291829665..3f22364a194 100644 --- a/doc/man/etags.1 +++ b/doc/man/etags.1 @@ -88,6 +88,7 @@ Only \fBctags\fP accepts this option. .B \-\-declarations In C and derived languages, create tags for function declarations, and create tags for extern variables unless \-\-no\-globals is used. +In Lisp, create tags for (defvar foo) declarations. .TP .B \-D, \-\-no\-defines Do not create tag entries for C preprocessor constant definitions diff --git a/lib-src/ChangeLog b/lib-src/ChangeLog index 294661a6cb3..480ddabd44a 100644 --- a/lib-src/ChangeLog +++ b/lib-src/ChangeLog @@ -1,3 +1,10 @@ +2012-12-02 Kevin Ryde + + * etags.c (Lisp_functions): Skip (defvar foo) declarations unless + the --declarations flag is enabled (Bug#5600). + (Lisp_help): Update. + (skip_name): New function. + 2012-12-01 Kevin Ryde * etags.c (Perl_functions): Support "use constant" (Bug#5055). diff --git a/lib-src/etags.c b/lib-src/etags.c index ec185c9819f..d393c4d2e4a 100644 --- a/lib-src/etags.c +++ b/lib-src/etags.c @@ -353,6 +353,7 @@ static void put_entries (node *); static char *concat (const char *, const char *, const char *); static char *skip_spaces (char *); static char *skip_non_spaces (char *); +static char *skip_name (char *); static char *savenstr (const char *, int); static char *savestr (const char *); static char *etags_strchr (const char *, int); @@ -619,7 +620,8 @@ static const char Lisp_help [] = "In Lisp code, any function defined with `defun', any variable\n\ defined with `defvar' or `defconst', and in general the first\n\ argument of any expression that starts with `(def' in column zero\n\ -is a tag."; +is a tag.\n\ +The `--declarations' option tags \"(defvar foo)\" constructs too."; static const char *Lua_suffixes [] = { "lua", "LUA", NULL }; @@ -4747,6 +4749,19 @@ Lisp_functions (FILE *inf) if (dbp[0] != '(') continue; + /* "(defvar foo)" is a declaration rather than a definition. */ + if (! declarations) + { + char *p = dbp + 1; + if (LOOKING_AT (p, "defvar")) + { + p = skip_name (p); /* past var name */ + p = skip_spaces (p); + if (*p == ')') + continue; + } + } + if (strneq (dbp+1, "def", 3) || strneq (dbp+1, "DEF", 3)) { dbp = skip_non_spaces (dbp); @@ -6307,6 +6322,16 @@ skip_non_spaces (char *cp) return cp; } +/* Skip any chars in the "name" class.*/ +static char * +skip_name (char *cp) +{ + /* '\0' is a notinname() so loop stops there too */ + while (! notinname (*cp)) + cp++; + return cp; +} + /* Print error message and exit. */ void fatal (const char *s1, const char *s2)