Subject: bug#5600: closed (Re: bug#5600: 23.1; etags don't tag (defvar foo) declaration)

From: [email-masked] (GNU bug Tracking System)
Date: Sun, 02 Dec 2012 01:52:02 +0000

Your bug report

#5600: 23.1; etags don't tag (defvar foo) declaration

which was filed against the emacs package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
5600: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=5600
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#5600: 23.1; etags don't tag (defvar foo) declaration
From: Chong Yidong <[email-masked]>
To: Kevin Ryde <[email-masked]>
Cc: Francesco Potortì <[email-masked]>, [email-masked]
Date: Sun, 02 Dec 2012 09:49:10 +0800
List-Id: <debbugs-submit.debbugs.gnu.org>

Kevin Ryde <[email-masked]> writes:

> Sounds likely.  I didn't know about that option, new diff below.
> I suppose it could tag `declare-function' and the like too, but start
> with untagging the defvar ones.

I've now committed this patch to trunk.  Thanks.

Subject: 23.1; etags don't tag (defvar foo) declaration
From: Kevin Ryde <[email-masked]>
To: [email-masked]
Date: Fri, 19 Feb 2010 11:00:40 +1100
List-Id: <debbugs-submit.debbugs.gnu.org>

It'd be good if etags didn't tag defvar declaration forms, only actual
variable definitions.  For example it picks up

    (defvar message-indent-citation-function)

in longlines.el ahead of that variable's actual definition in
message.el, so M-. of that var goes to longlines.el first.

Perhaps something along the lines below.

I found the tripe-negative of while(!noninname) hard to follow and
thought a skip_name() could be clearer.  It might be shared by
Perl_functions, PHP_functions and Makefile_functions.

2010-02-18  Kevin Ryde  <[email-masked]>

	* etags.c (Lisp_functions): Don't tag "(defvar foo)" declarations.
	(skip_name): New helper.

--- etags.c.~3.93.~	2009-11-29 08:42:32.000000000 +1100
+++ etags.c	2010-02-19 10:53:57.000000000 +1100
@@ -4849,6 +4849,16 @@
   get_tag (dbp, NULL);
 }
 
+/* skip past any chars at cp which are "name" class */
+static char *
+skip_name (char *cp)
+{
+  /* '\0' is a notinname() so loop stops there too */
+  while (! notinname (*cp))
+    cp++;
+  return cp;
+}
+
 static void
 Lisp_functions (inf)
      FILE *inf;
@@ -4858,6 +4868,17 @@
       if (dbp[0] != '(')
 	continue;
 
+      /* ignore declaration "(defvar foo)", it's not a definition */
+      {
+	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);

In GNU Emacs 23.1.1 (i486-pc-linux-gnu, GTK+ Version 2.16.5)
 of 2009-09-14 on raven, modified by Debian
configured using `configure  '--build=i486-linux-gnu' '--host=i486-linux-gnu' '--prefix=/usr' '--sharedstatedir=/var/lib' '--libexecdir=/usr/lib' '--localstatedir=/var/lib' '--infodir=/usr/share/info' '--mandir=/usr/share/man' '--with-pop=yes' '--enable-locallisppath=/etc/emacs23:/etc/emacs:/usr/local/share/emacs/23.1/site-lisp:/usr/local/share/emacs/site-lisp:/usr/share/emacs/23.1/site-lisp:/usr/share/emacs/site-lisp:/usr/share/emacs/23.1/leim' '--with-x=yes' '--with-x-toolkit=gtk' '--with-toolkit-scroll-bars' 'build_alias=i486-linux-gnu' 'host_alias=i486-linux-gnu' 'CFLAGS=-DDEBIAN -g -O2' 'LDFLAGS=-g' 'CPPFLAGS=''