]> git.eshelyaron.com Git - emacs.git/commitdiff
* lib-src/etags.c (Lisp_functions): Skip (defvar foo) declarations
authorKevin Ryde <user42@zip.com.au>
Sun, 2 Dec 2012 01:47:56 +0000 (09:47 +0800)
committerChong Yidong <cyd@gnu.org>
Sun, 2 Dec 2012 01:47:56 +0000 (09:47 +0800)
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
doc/emacs/ChangeLog
doc/emacs/maintaining.texi
doc/man/ChangeLog
doc/man/etags.1
lib-src/ChangeLog
lib-src/etags.c

index fd54378975105ac2c09b88546cc7a6b47be64815..c90f6d4b71263c5fee3b722088ce1b8c3e1348f5 100644 (file)
@@ -1,3 +1,7 @@
+2012-12-02  Kevin Ryde  <user42@zip.com.au>
+
+       * maintaining.texi (Tag Syntax): Mention (defvar foo) handling.
+
 2012-12-01  Kevin Ryde  <user42@zip.com.au>
 
        * maintaining.texi (Tag Syntax): Mention Perl's "use constant".
index 06680a6b4e38fd549214bc144e362464902eee06..555409f6be67135241ef5e85016328d05250c36b 100644 (file)
@@ -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
index cc54cd254b58583938ebb35499a027c468547bf3..afd6b7b6051649e589c0c3458affa71725cbf138 100644 (file)
@@ -1,3 +1,7 @@
+2012-12-02  Kevin Ryde  <user42@zip.com.au>
+
+       * etags.1: Mention effect of --declarations in Lisp.
+
 2012-06-03  Glenn Morris  <rgm@gnu.org>
 
        * rcs-checkin.1: Remove.
index a1291829665a6588085265463781a4159098bbea..3f22364a19498e310f94a118c2d8dfb787370b16 100644 (file)
@@ -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
index 294661a6cb3a13154bb4290b1cc2477c74158f08..480ddabd44aff3d9e06ac04ab124088a774b1ec4 100644 (file)
@@ -1,3 +1,10 @@
+2012-12-02  Kevin Ryde  <user42@zip.com.au>
+
+       * 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  <user42@zip.com.au>
 
        * etags.c (Perl_functions): Support "use constant" (Bug#5055).
index ec185c9819f7a6ff4315287824b92313330268d7..d393c4d2e4a56b4b5e7449d396d8a137ea083811 100644 (file)
@@ -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)