From 00054d2199d929eb224ae62dec2e55608ff1c07f Mon Sep 17 00:00:00 2001 From: Kevin Ryde Date: Sat, 1 Dec 2012 09:22:28 +0800 Subject: [PATCH] * lib-src/etags.c (Perl_functions): Support "use constant". * doc/emacs/maintaining.texi (Tag Syntax): Mention Perl's "use constant". Fixes: debbugs:5055 --- doc/emacs/ChangeLog | 4 ++++ doc/emacs/maintaining.texi | 10 +++++----- lib-src/ChangeLog | 4 ++++ lib-src/etags.c | 21 ++++++++++++++++++--- 4 files changed, 31 insertions(+), 8 deletions(-) diff --git a/doc/emacs/ChangeLog b/doc/emacs/ChangeLog index 5c4ae2e1ee0..fd543789751 100644 --- a/doc/emacs/ChangeLog +++ b/doc/emacs/ChangeLog @@ -1,3 +1,7 @@ +2012-12-01 Kevin Ryde + + * maintaining.texi (Tag Syntax): Mention Perl's "use constant". + 2012-11-24 Paul Eggert * doclicense.texi, gpl.texi: Update to latest version from FSF. diff --git a/doc/emacs/maintaining.texi b/doc/emacs/maintaining.texi index 67214bde22c..06680a6b4e3 100644 --- a/doc/emacs/maintaining.texi +++ b/doc/emacs/maintaining.texi @@ -1766,11 +1766,11 @@ the file. @item In Perl code, the tags are the packages, subroutines and variables -defined by the @code{package}, @code{sub}, @code{my} and @code{local} -keywords. Use @samp{--globals} if you want to tag global variables. -Tags for subroutines are named @samp{@var{package}::@var{sub}}. The -name for subroutines defined in the default package is -@samp{main::@var{sub}}. +defined by the @code{package}, @code{sub}, @code{use constant}, +@code{my}, and @code{local} keywords. Use @samp{--globals} if you +want to tag global variables. Tags for subroutines are named +@samp{@var{package}::@var{sub}}. The name for subroutines defined in +the default package is @samp{main::@var{sub}}. @item In PHP code, tags are functions, classes and defines. Vars are tags diff --git a/lib-src/ChangeLog b/lib-src/ChangeLog index a74d4b90b9f..294661a6cb3 100644 --- a/lib-src/ChangeLog +++ b/lib-src/ChangeLog @@ -1,3 +1,7 @@ +2012-12-01 Kevin Ryde + + * etags.c (Perl_functions): Support "use constant" (Bug#5055). + 2012-11-27 Paul Eggert Assume POSIX 1003.1-1988 or later for errno.h (Bug#12968). diff --git a/lib-src/etags.c b/lib-src/etags.c index b6af17b8edf..ec185c9819f 100644 --- a/lib-src/etags.c +++ b/lib-src/etags.c @@ -4269,6 +4269,7 @@ Asm_labels (FILE *inf) /* * Perl support * Perl sub names: /^sub[ \t\n]+[^ \t\n{]+/ + * /^use constant[ \t\n]+[^ \t\n{=,;]+/ * Perl variable names: /^(my|local).../ * Original code by Bart Robinson (1995) * Additions by Michael Ernst (1997) @@ -4291,9 +4292,10 @@ Perl_functions (FILE *inf) } else if (LOOKING_AT (cp, "sub")) { - char *pos; - char *sp = cp; + char *pos, *sp; + subr: + sp = cp; while (!notinname (*cp)) cp++; if (cp == sp) @@ -4316,8 +4318,21 @@ Perl_functions (FILE *inf) lb.buffer, cp - lb.buffer + 1, lineno, linecharno); free (name); } + } + else if (LOOKING_AT (cp, "use constant") + || LOOKING_AT (cp, "use constant::defer")) + { + /* For hash style multi-constant like + use constant { FOO => 123, + BAR => 456 }; + only the first FOO is picked up. Parsing across the value + expressions would be difficult in general, due to possible nested + hashes, here-documents, etc. */ + if (*cp == '{') + cp = skip_spaces (cp+1); + goto subr; } - else if (globals) /* only if we are tagging global vars */ + else if (globals) /* only if we are tagging global vars */ { /* Skip a qualifier, if any. */ bool qual = LOOKING_AT (cp, "my") || LOOKING_AT (cp, "local"); -- 2.39.5