Improve Ruby support in 'etags'

* lib-src/etags.c (Ruby_functions): Tag constants.  Don't tag
singleton classes.  Remove class qualifiers from tags generated
for method and constant names.  (Bug#22241)

* doc/emacs/maintaining.texi (Tag Syntax): Mention that constants
are tagged by etags in Ruby.

* etc/NEWS: Mention that constants are tagged by etags in Ruby.

* test/etags/ruby-src/test1.ruby: Add more tests.
* test/etags/ETAGS.good_1:
* test/etags/ETAGS.good_2:
* test/etags/ETAGS.good_3:
* test/etags/ETAGS.good_4:
* test/etags/ETAGS.good_5:
* test/etags/ETAGS.good_6:
* test/etags/CTAGS.good: Adapt to the changes in etags and in Ruby
tests.
This commit is contained in:
Eli Zaretskii 2016-01-30 14:16:36 +02:00
parent ccc3b3cd68
commit 25b79d7bc7
11 changed files with 154 additions and 33 deletions

View file

@ -2264,7 +2264,7 @@ generate a tag.
@item
In Ruby code, @code{def} or @code{class} or @code{module} at the
beginning of a line generate a tag.
beginning of a line generate a tag. Constants also generate tags.
@end itemize
You can also generate tags based on regexp matching (@pxref{Etags

View file

@ -1830,8 +1830,8 @@ qualified names by hand.
+++
*** New language Ruby
Names of modules, classes, methods, and functions are tagged.
Overloaded operators are also tagged.
Names of modules, classes, methods, functions, and constants are
tagged. Overloaded operators are also tagged.
+++
*** Improved support for Lua

View file

@ -4550,18 +4550,68 @@ Ruby_functions (FILE *inf)
LOOP_ON_INPUT_LINES (inf, lb, cp)
{
bool is_class = false;
bool is_method = false;
char *name;
cp = skip_spaces (cp);
if (LOOKING_AT (cp, "def")
|| LOOKING_AT (cp, "class")
|| LOOKING_AT (cp, "module"))
if (c_isalpha (*cp) && c_isupper (*cp)) /* constants */
{
char *name = cp;
char *bp, *colon = NULL;
name = cp;
for (cp++; c_isalnum (*cp) || *cp == '_' || *cp == ':'; cp++)
{
if (*cp == ':')
colon = cp;
}
if (cp > name + 1)
{
bp = skip_spaces (cp);
if (*bp == '=' && c_isspace (bp[1]))
{
if (colon && !c_isspace (colon[1]))
name = colon + 1;
make_tag (name, cp - name, false,
lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
}
}
}
else if ((is_method = LOOKING_AT (cp, "def")) /* module/class/method */
|| (is_class = LOOKING_AT (cp, "class"))
|| LOOKING_AT (cp, "module"))
{
const char self_name[] = "self.";
const size_t self_size1 = sizeof ("self.") - 1;
name = cp;
/* Ruby method names can end in a '='. Also, operator overloading can
define operators whose names include '='. */
while (!notinname (*cp) || *cp == '=')
cp++;
/* Remove "self." from the method name. */
if (cp - name > self_size1
&& strneq (name, self_name, self_size1))
name += self_size1;
/* Remove the class/module qualifiers from method names. */
if (is_method)
{
char *q;
for (q = name; q < cp && *q != '.'; q++)
;
if (q < cp - 1) /* punt if we see just "FOO." */
name = q + 1;
}
/* Don't tag singleton classes. */
if (is_class && strneq (name, "<<", 2) && cp == name + 2)
continue;
make_tag (name, cp - name, true,
lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
}

View file

@ -227,6 +227,8 @@ A cp-src/c.C 117
A cp-src/fail.C 7
A cp-src/fail.C 23
A ruby-src/test1.ruby /^class A$/
A ruby-src/test1.ruby /^module A$/
ABC ruby-src/test1.ruby 11
ADDRESS c-src/emacs/src/gmalloc.c /^#define ADDRESS(B) ((void *) (((B) - 1) * BLOCKSIZ/
ALIGNOF_STRUCT_LISP_VECTOR c-src/emacs/src/lisp.h 1378
ALLOCATED_BEFORE_DUMPING c-src/emacs/src/gmalloc.c /^#define ALLOCATED_BEFORE_DUMPING(P) \\$/
@ -289,6 +291,7 @@ B cp-src/c.C /^void B::B() {}$/
B cp-src/c.C 122
B cp-src/fail.C 8
B cp-src/fail.C 24
B ruby-src/test1.ruby /^ class B$/
BE_Node cp-src/c.C /^void BE_Node::BE_Node() {}$/
BE_Node cp-src/c.C 77
BITS_PER_BITS_WORD c-src/emacs/src/lisp.h 125
@ -438,7 +441,6 @@ Cjava_entries c-src/etags.c /^Cjava_entries (FILE *inf)$/
Cjava_help c-src/etags.c 551
Cjava_suffixes c-src/etags.c 549
ClassExample ruby-src/test.rb /^ class ClassExample$/
ClassExample.class_method ruby-src/test.rb /^ def ClassExample.class_method$/
Clear/p ada-src/2ataspri.adb /^ procedure Clear (Cell : in out TAS_Cell) is$/
Clear/p ada-src/2ataspri.ads /^ procedure Clear (Cell : in out TAS_Cell)/
Cobol_help c-src/etags.c 558
@ -458,6 +460,7 @@ Condition_Variable/t ada-src/2ataspri.ads /^ type Condition_Variable is privat
Condition_Variable/t ada-src/2ataspri.ads /^ type Condition_Variable is$/
Configure pyt-src/server.py /^class Configure(Frame, ControlEdit):$/
ConfirmQuit pyt-src/server.py /^def ConfirmQuit(frame, context):$/
Constant ruby-src/test1.ruby 26
ControlEdit pyt-src/server.py /^class ControlEdit(Frame):$/
Controls pyt-src/server.py /^class Controls:$/
CopyTextString pas-src/common.pas /^function CopyTextString;(*($/
@ -939,7 +942,6 @@ Metags c-src/etags.c /^main (int argc, char **argv)$/
Mfail cp-src/fail.C /^main()$/
Mkai-test.pl perl-src/kai-test.pl /^package main;$/
ModuleExample ruby-src/test.rb /^module ModuleExample$/
ModuleExample.module_class_method ruby-src/test.rb /^ def ModuleExample.module_class_method$/
More_Lisp_Bits c-src/emacs/src/lisp.h 801
MoveLayerAfter lua-src/allegro.lua /^function MoveLayerAfter (this_one)$/
MoveLayerBefore lua-src/allegro.lua /^function MoveLayerBefore (this_one)$/
@ -2351,6 +2353,7 @@ __str__ pyt-src/server.py /^ def __str__(self):$/
__up c.c 160
_aligned_blocks c-src/emacs/src/gmalloc.c 1004
_aligned_blocks_mutex c-src/emacs/src/gmalloc.c 518
_bar? ruby-src/test1.ruby /^ def self._bar?(abc)$/
_bytes_free c-src/emacs/src/gmalloc.c 376
_bytes_used c-src/emacs/src/gmalloc.c 374
_chunks_free c-src/emacs/src/gmalloc.c 375
@ -2620,6 +2623,7 @@ childDidExit objc-src/Subprocess.m /^- childDidExit$/
chunks_free c-src/emacs/src/gmalloc.c 313
chunks_used c-src/emacs/src/gmalloc.c 311
cjava c-src/etags.c 2936
class_method ruby-src/test.rb /^ def ClassExample.class_method$/
classifyLine php-src/lce_functions.php /^ function classifyLine($line)$/
clear cp-src/conway.hpp /^ void clear(void) { alive = 0; }$/
clear-abbrev-table c-src/abbrev.c /^DEFUN ("clear-abbrev-table", Fclear_abbrev_table, /
@ -2952,6 +2956,7 @@ foo f-src/entry.for /^ character*(*) function foo()$/
foo f-src/entry.strange_suffix /^ character*(*) function foo()$/
foo f-src/entry.strange /^ character*(*) function foo()$/
foo php-src/ptest.php /^foo()$/
foo! ruby-src/test1.ruby /^ def foo!$/
foobar c-src/c.c /^int foobar() {;}$/
foobar c.c /^extern void foobar (void) __attribute__ ((section /
foobar2 c-src/h.h 20
@ -3450,6 +3455,7 @@ miti html-src/softwarelibero.html /^Sfatiamo alcuni miti$/
modifier_names c-src/emacs/src/keyboard.c 6319
modifier_symbols c-src/emacs/src/keyboard.c 6327
modify_event_symbol c-src/emacs/src/keyboard.c /^modify_event_symbol (ptrdiff_t symbol_num, int mod/
module_class_method ruby-src/test.rb /^ def ModuleExample.module_class_method$/
module_instance_method ruby-src/test.rb /^ def module_instance_method$/
more_aligned_int c.c 165
morecore_nolock c-src/emacs/src/gmalloc.c /^morecore_nolock (size_t size)$/
@ -3812,6 +3818,7 @@ quantizing html-src/algrthms.html /^Quantizing the Received$/
questo ../c/c.web 34
quit_char c-src/emacs/src/keyboard.c 192
quit_throw_to_read_char c-src/emacs/src/keyboard.c /^quit_throw_to_read_char (bool from_signal)$/
qux= ruby-src/test1.ruby /^ def qux=(tee)$/
r0 c-src/sysdep.h 54
r1 c-src/sysdep.h 55
r_alloc c-src/emacs/src/lisp.h /^extern void *r_alloc (void **, size_t) ATTRIBUTE_A/

View file

@ -2977,11 +2977,11 @@ class Configure(760,24879
def save(797,26022
def nosave(807,26310
ruby-src/test.rb,604
ruby-src/test.rb,637
module ModuleExample1,0
class ClassExample2,21
def instance_method3,44
def ClassExample.class_method6,121
def ClassExample.class_methodclass_method6,121
def instance_method_exclamation!9,206
def instance_method_question?12,310
def instance_method_equals=instance_method_equals=15,408
@ -2995,12 +2995,19 @@ module ModuleExample1,0
def <=>(<=>39,943
def ===(===42,990
def module_instance_method46,1051
def ModuleExample.module_class_method49,1131
def ModuleExample.module_class_methodmodule_class_method49,1131
ruby-src/test1.ruby,37
ruby-src/test1.ruby,191
class A1,0
def a(2,8
def b(5,38
module A9,57
class B10,66
ABC 11,76
def foo!13,89
def self._bar?(_bar?16,111
def qux=(qux=20,162
A::Constant Constant26,211
tex-src/testenv.tex,52
\newcommand{\nm}\nm4,77

View file

@ -3548,11 +3548,11 @@ class Configure(760,24879
def save(797,26022
def nosave(807,26310
ruby-src/test.rb,604
ruby-src/test.rb,637
module ModuleExample1,0
class ClassExample2,21
def instance_method3,44
def ClassExample.class_method6,121
def ClassExample.class_methodclass_method6,121
def instance_method_exclamation!9,206
def instance_method_question?12,310
def instance_method_equals=instance_method_equals=15,408
@ -3566,12 +3566,19 @@ module ModuleExample1,0
def <=>(<=>39,943
def ===(===42,990
def module_instance_method46,1051
def ModuleExample.module_class_method49,1131
def ModuleExample.module_class_methodmodule_class_method49,1131
ruby-src/test1.ruby,37
ruby-src/test1.ruby,191
class A1,0
def a(2,8
def b(5,38
module A9,57
class B10,66
ABC 11,76
def foo!13,89
def self._bar?(_bar?16,111
def qux=(qux=20,162
A::Constant Constant26,211
tex-src/testenv.tex,52
\newcommand{\nm}\nm4,77

View file

@ -3321,11 +3321,11 @@ class Configure(760,24879
def save(797,26022
def nosave(807,26310
ruby-src/test.rb,604
ruby-src/test.rb,637
module ModuleExample1,0
class ClassExample2,21
def instance_method3,44
def ClassExample.class_method6,121
def ClassExample.class_methodclass_method6,121
def instance_method_exclamation!9,206
def instance_method_question?12,310
def instance_method_equals=instance_method_equals=15,408
@ -3339,12 +3339,19 @@ module ModuleExample1,0
def <=>(<=>39,943
def ===(===42,990
def module_instance_method46,1051
def ModuleExample.module_class_method49,1131
def ModuleExample.module_class_methodmodule_class_method49,1131
ruby-src/test1.ruby,37
ruby-src/test1.ruby,191
class A1,0
def a(2,8
def b(5,38
module A9,57
class B10,66
ABC 11,76
def foo!13,89
def self._bar?(_bar?16,111
def qux=(qux=20,162
A::Constant Constant26,211
tex-src/testenv.tex,52
\newcommand{\nm}\nm4,77

View file

@ -3141,11 +3141,11 @@ class Configure(760,24879
def save(797,26022
def nosave(807,26310
ruby-src/test.rb,604
ruby-src/test.rb,637
module ModuleExample1,0
class ClassExample2,21
def instance_method3,44
def ClassExample.class_method6,121
def ClassExample.class_methodclass_method6,121
def instance_method_exclamation!9,206
def instance_method_question?12,310
def instance_method_equals=instance_method_equals=15,408
@ -3159,12 +3159,19 @@ module ModuleExample1,0
def <=>(<=>39,943
def ===(===42,990
def module_instance_method46,1051
def ModuleExample.module_class_method49,1131
def ModuleExample.module_class_methodmodule_class_method49,1131
ruby-src/test1.ruby,37
ruby-src/test1.ruby,191
class A1,0
def a(2,8
def b(5,38
module A9,57
class B10,66
ABC 11,76
def foo!13,89
def self._bar?(_bar?16,111
def qux=(qux=20,162
A::Constant Constant26,211
tex-src/testenv.tex,52
\newcommand{\nm}\nm4,77

View file

@ -4056,11 +4056,11 @@ class Configure(760,24879
def save(797,26022
def nosave(807,26310
ruby-src/test.rb,604
ruby-src/test.rb,637
module ModuleExample1,0
class ClassExample2,21
def instance_method3,44
def ClassExample.class_method6,121
def ClassExample.class_methodclass_method6,121
def instance_method_exclamation!9,206
def instance_method_question?12,310
def instance_method_equals=instance_method_equals=15,408
@ -4074,12 +4074,19 @@ module ModuleExample1,0
def <=>(<=>39,943
def ===(===42,990
def module_instance_method46,1051
def ModuleExample.module_class_method49,1131
def ModuleExample.module_class_methodmodule_class_method49,1131
ruby-src/test1.ruby,37
ruby-src/test1.ruby,191
class A1,0
def a(2,8
def b(5,38
module A9,57
class B10,66
ABC 11,76
def foo!13,89
def self._bar?(_bar?16,111
def qux=(qux=20,162
A::Constant Constant26,211
tex-src/testenv.tex,52
\newcommand{\nm}\nm4,77

View file

@ -4056,11 +4056,11 @@ class Configure(760,24879
def save(797,26022
def nosave(807,26310
ruby-src/test.rb,604
ruby-src/test.rb,637
module ModuleExample1,0
class ClassExample2,21
def instance_method3,44
def ClassExample.class_method6,121
def ClassExample.class_methodclass_method6,121
def instance_method_exclamation!9,206
def instance_method_question?12,310
def instance_method_equals=instance_method_equals=15,408
@ -4074,12 +4074,19 @@ module ModuleExample1,0
def <=>(<=>39,943
def ===(===42,990
def module_instance_method46,1051
def ModuleExample.module_class_method49,1131
def ModuleExample.module_class_methodmodule_class_method49,1131
ruby-src/test1.ruby,37
ruby-src/test1.ruby,191
class A1,0
def a(2,8
def b(5,38
module A9,57
class B10,66
ABC 11,76
def foo!13,89
def self._bar?(_bar?16,111
def qux=(qux=20,162
A::Constant Constant26,211
tex-src/testenv.tex,52
\newcommand{\nm}\nm4,77

View file

@ -5,3 +5,25 @@ class A
def b()
end
end
module A
class B
ABC = 4
def foo!
end
def self._bar?(abc)
end
class << self
def qux=(tee)
end
end
end
end
A::Constant = 5
# def foo_in_comment
# end