From: Eli Zaretskii Date: Wed, 3 Feb 2016 16:24:20 +0000 (+0200) Subject: Etags: yet another improvement in Ruby tags X-Git-Tag: emacs-25.0.91~105 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=504696d75dbd9b8159490ec4cd9da2b5578f2934;p=emacs.git Etags: yet another improvement in Ruby tags * lib-src/etags.c (Ruby_functions): Handle continuation lines in Ruby accessor definitions. (Bug#22241) * test/etags/ruby-src/test1.ru (A::B#X): Add some more tests for accessors and multiline definitions. * 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 changes in Ruby tags. --- diff --git a/lib-src/etags.c b/lib-src/etags.c index ca6fe51bdb6..bb2758941a4 100644 --- a/lib-src/etags.c +++ b/lib-src/etags.c @@ -4630,6 +4630,7 @@ static void Ruby_functions (FILE *inf) { char *cp = NULL; + bool reader = false, writer = false, alias = false, continuation = false; LOOP_ON_INPUT_LINES (inf, lb, cp) { @@ -4638,7 +4639,9 @@ Ruby_functions (FILE *inf) char *name; cp = skip_spaces (cp); - if (c_isalpha (*cp) && c_isupper (*cp)) /* constants */ + if (!continuation + /* Constants. */ + && c_isalpha (*cp) && c_isupper (*cp)) { char *bp, *colon = NULL; @@ -4661,9 +4664,11 @@ Ruby_functions (FILE *inf) } } } - else if ((is_method = LOOKING_AT (cp, "def")) /* module/class/method */ - || (is_class = LOOKING_AT (cp, "class")) - || LOOKING_AT (cp, "module")) + else if (!continuation + /* Modules, classes, methods. */ + && ((is_method = LOOKING_AT (cp, "def")) + || (is_class = LOOKING_AT (cp, "class")) + || LOOKING_AT (cp, "module"))) { const char self_name[] = "self."; const size_t self_size1 = sizeof (self_name) - 1; @@ -4701,21 +4706,27 @@ Ruby_functions (FILE *inf) else { /* Tag accessors and aliases. */ + + if (!continuation) + reader = writer = alias = false; + while (*cp && *cp != '#') { - bool reader = false, writer = false, alias = false; - - if (LOOKING_AT (cp, "attr_reader")) - reader = true; - else if (LOOKING_AT (cp, "attr_writer")) - writer = true; - else if (LOOKING_AT (cp, "attr_accessor")) + if (!continuation) { - reader = true; - writer = true; + reader = writer = alias = false; + if (LOOKING_AT (cp, "attr_reader")) + reader = true; + else if (LOOKING_AT (cp, "attr_writer")) + writer = true; + else if (LOOKING_AT (cp, "attr_accessor")) + { + reader = true; + writer = true; + } + else if (LOOKING_AT (cp, "alias_method")) + alias = true; } - else if (LOOKING_AT (cp, "alias_method")) - alias = true; if (reader || writer || alias) { do { @@ -4725,9 +4736,12 @@ Ruby_functions (FILE *inf) np++; cp = skip_name (cp); if (reader) - make_tag (np, cp - np, true, - lb.buffer, cp - lb.buffer + 1, - lineno, linecharno); + { + make_tag (np, cp - np, true, + lb.buffer, cp - lb.buffer + 1, + lineno, linecharno); + continuation = false; + } if (writer) { size_t name_len = cp - np + 1; @@ -4737,19 +4751,34 @@ Ruby_functions (FILE *inf) memcpy (wr_name + name_len - 1, "=", 2); pfnote (wr_name, true, lb.buffer, cp - lb.buffer + 1, lineno, linecharno); + continuation = false; } if (alias) { - make_tag (np, cp - np, true, - lb.buffer, cp - lb.buffer + 1, - lineno, linecharno); + if (!continuation) + make_tag (np, cp - np, true, + lb.buffer, cp - lb.buffer + 1, + lineno, linecharno); + continuation = false; while (*cp && *cp != '#' && *cp != ';') - cp++; + { + if (*cp == ',') + continuation = true; + else if (!c_isspace (*cp)) + continuation = false; + cp++; + } + if (*cp == ';') + continuation = false; } - } while (*cp == ',' + cp = skip_spaces (cp); + } while ((alias + ? (*cp == ',') + : (continuation = (*cp == ','))) && (cp = skip_spaces (cp + 1), *cp && *cp != '#')); } - cp = skip_name (cp); + if (*cp != '#') + cp = skip_name (cp); while (*cp && *cp != '#' && notinname (*cp)) cp++; } diff --git a/test/etags/CTAGS.good b/test/etags/CTAGS.good index afb1096b084..b78c194ac44 100644 --- a/test/etags/CTAGS.good +++ b/test/etags/CTAGS.good @@ -454,7 +454,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.ru 35 +Constant ruby-src/test1.ru 39 ControlEdit pyt-src/server.py /^class ControlEdit(Frame):$/ Controls pyt-src/server.py /^class Controls:$/ CopyTextString pas-src/common.pas /^function CopyTextString;(*($/ @@ -2556,11 +2556,12 @@ bar c-src/c.c /^void bar() {while(0) {}}$/ bar c.c 143 bar c-src/h.h 19 bar cp-src/x.cc /^XX::bar()$/ -bar= ruby-src/test1.ru /^ attr_writer :bar$/ +bar= ruby-src/test1.ru /^ attr_writer :bar,$/ bas_syn prol-src/natded.prolog /^bas_syn(n(_)).$/ base c-src/emacs/src/lisp.h 2188 base cp-src/c.C /^double base (void) const { return rng_base; }$/ base cp-src/Range.h /^ double base (void) const { return rng_base; }$/ +baz= ruby-src/test1.ru /^ :baz,$/ bb c.c 275 bbb c.c 251 bbbbbb c-src/h.h 113 @@ -3514,6 +3515,7 @@ 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= ruby-src/test1.ru /^ :more$/ more_aligned_int c.c 165 morecore_nolock c-src/emacs/src/gmalloc.c /^morecore_nolock (size_t size)$/ morecore_recursing c-src/emacs/src/gmalloc.c 604 @@ -3879,7 +3881,7 @@ questo ../c/c.web 34 quiettest make-src/Makefile /^quiettest:$/ 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.ru /^ alias_method :qux, :tee$/ +qux ruby-src/test1.ru /^ alias_method :qux, :tee, attr_accessor :bogu/ qux= ruby-src/test1.ru /^ def qux=(tee)$/ r0 c-src/sysdep.h 54 r1 c-src/sysdep.h 55 @@ -3904,8 +3906,8 @@ read cp-src/conway.hpp /^ char read() { return alive; }$/ read php-src/lce_functions.php /^ function read()$/ read-key-sequence c-src/emacs/src/keyboard.c /^DEFUN ("read-key-sequence", Fread_key_sequence, Sr/ read-key-sequence-vector c-src/emacs/src/keyboard.c /^DEFUN ("read-key-sequence-vector", Fread_key_seque/ -read1 ruby-src/test1.ru /^ attr_reader :read1, :read2; attr_writer :wri/ -read2 ruby-src/test1.ru /^ attr_reader :read1, :read2; attr_writer :wri/ +read1 ruby-src/test1.ru /^ attr_reader :read1 , :read2; attr_writer :wr/ +read2 ruby-src/test1.ru /^ attr_reader :read1 , :read2; attr_writer :wr/ read_char c-src/emacs/src/keyboard.c /^read_char (int commandflag, Lisp_Object map,$/ read_char_help_form_unwind c-src/emacs/src/keyboard.c /^read_char_help_form_unwind (void)$/ read_char_minibuf_menu_prompt c-src/emacs/src/keyboard.c /^read_char_minibuf_menu_prompt (int commandflag,$/ @@ -4164,6 +4166,7 @@ substitute c-src/etags.c /^substitute (char *in, char *out, struct re_registe/ subsubsec=\relax tex-src/texinfo.tex /^\\let\\appendixsubsubsec=\\relax$/ subsubsection perl-src/htlmify-cystic 27 subsubsection=\relax tex-src/texinfo.tex /^\\let\\appendixsubsubsection=\\relax$/ +subtle ruby-src/test1.ru /^ :tee ; attr_reader :subtle$/ subtree prol-src/natded.prolog /^subtree(T,T).$/ suffix c-src/etags.c 186 suffixes c-src/etags.c 195 @@ -4450,8 +4453,8 @@ womboid c-src/h.h 75 word_size c-src/emacs/src/lisp.h 1473 write php-src/lce_functions.php /^ function write()$/ write php-src/lce_functions.php /^ function write($save="yes")$/ -write1= ruby-src/test1.ru /^ attr_reader :read1, :read2; attr_writer :wri/ -write2= ruby-src/test1.ru /^ attr_reader :read1, :read2; attr_writer :wri/ +write1= ruby-src/test1.ru /^ attr_reader :read1 , :read2; attr_writer :wr/ +write2= ruby-src/test1.ru /^ attr_reader :read1 , :read2; attr_writer :wr/ write_abbrev c-src/abbrev.c /^write_abbrev (sym, stream)$/ write_classname c-src/etags.c /^write_classname (linebuffer *cn, const char *quali/ write_lex prol-src/natded.prolog /^write_lex(File):-$/ @@ -4492,6 +4495,7 @@ xref-location-marker el-src/emacs/lisp/progmodes/etags.el /^(cl-defmethod xref-l xref-make-etags-location el-src/emacs/lisp/progmodes/etags.el /^(defun xref-make-etags-location (tag-info file)$/ xrnew c-src/etags.c /^#define xrnew(op, n, Type) ((op) = (Type *) xreall/ xx make-src/Makefile /^xx="this line is here because of a fontlock bug$/ +xyz ruby-src/test1.ru /^ alias_method :xyz,$/ y cp-src/conway.hpp 7 y cp-src/clheir.hpp 49 y cp-src/clheir.hpp 58 diff --git a/test/etags/ETAGS.good_1 b/test/etags/ETAGS.good_1 index 87ab88fd6c2..1390187863f 100644 --- a/test/etags/ETAGS.good_1 +++ b/test/etags/ETAGS.good_1 @@ -3061,7 +3061,7 @@ module ModuleExample1,0 def module_instance_method46,1051 def ModuleExample.module_class_methodmodule_class_method49,1131 -ruby-src/test1.ru,655 +ruby-src/test1.ru,828 class A1,0 def a(2,8 def b(5,38 @@ -3075,15 +3075,19 @@ module A9,57 def qux=(qux=22,194 def X25,232 attr_reader :foofoo26,242 - attr_reader :read1,read127,265 - attr_reader :read1, :read2;read227,265 - attr_reader :read1, :read2; attr_writer :write1,write1=27,265 - attr_reader :read1, :read2; attr_writer :write1, :write2write2=27,265 - attr_writer :barbar=28,328 - attr_accessor :teetee29,351 - attr_accessor :teetee=29,351 - alias_method :qux,qux30,376 -A::Constant Constant35,425 + attr_reader :read1 read127,265 + attr_reader :read1 , :read2;read227,265 + attr_reader :read1 , :read2; attr_writer :write1,write1=27,265 + attr_reader :read1 , :read2; attr_writer :write1, :write2write2=27,265 + attr_writer :bar,bar=28,329 + :baz,baz=29,353 + :moremore=30,377 + attr_accessor :teetee31,401 + attr_accessor :teetee=31,401 + alias_method :qux,qux32,426 + alias_method :xyz,xyz33,478 + :tee ; attr_reader :subtlesubtle34,503 +A::Constant Constant39,568 tex-src/testenv.tex,52 \newcommand{\nm}\nm4,77 diff --git a/test/etags/ETAGS.good_2 b/test/etags/ETAGS.good_2 index 861598232a9..f8b1546ef48 100644 --- a/test/etags/ETAGS.good_2 +++ b/test/etags/ETAGS.good_2 @@ -3631,7 +3631,7 @@ module ModuleExample1,0 def module_instance_method46,1051 def ModuleExample.module_class_methodmodule_class_method49,1131 -ruby-src/test1.ru,655 +ruby-src/test1.ru,828 class A1,0 def a(2,8 def b(5,38 @@ -3645,15 +3645,19 @@ module A9,57 def qux=(qux=22,194 def X25,232 attr_reader :foofoo26,242 - attr_reader :read1,read127,265 - attr_reader :read1, :read2;read227,265 - attr_reader :read1, :read2; attr_writer :write1,write1=27,265 - attr_reader :read1, :read2; attr_writer :write1, :write2write2=27,265 - attr_writer :barbar=28,328 - attr_accessor :teetee29,351 - attr_accessor :teetee=29,351 - alias_method :qux,qux30,376 -A::Constant Constant35,425 + attr_reader :read1 read127,265 + attr_reader :read1 , :read2;read227,265 + attr_reader :read1 , :read2; attr_writer :write1,write1=27,265 + attr_reader :read1 , :read2; attr_writer :write1, :write2write2=27,265 + attr_writer :bar,bar=28,329 + :baz,baz=29,353 + :moremore=30,377 + attr_accessor :teetee31,401 + attr_accessor :teetee=31,401 + alias_method :qux,qux32,426 + alias_method :xyz,xyz33,478 + :tee ; attr_reader :subtlesubtle34,503 +A::Constant Constant39,568 tex-src/testenv.tex,52 \newcommand{\nm}\nm4,77 diff --git a/test/etags/ETAGS.good_3 b/test/etags/ETAGS.good_3 index 52d5a613b61..a1e895af7f6 100644 --- a/test/etags/ETAGS.good_3 +++ b/test/etags/ETAGS.good_3 @@ -3408,7 +3408,7 @@ module ModuleExample1,0 def module_instance_method46,1051 def ModuleExample.module_class_methodmodule_class_method49,1131 -ruby-src/test1.ru,655 +ruby-src/test1.ru,828 class A1,0 def a(2,8 def b(5,38 @@ -3422,15 +3422,19 @@ module A9,57 def qux=(qux=22,194 def X25,232 attr_reader :foofoo26,242 - attr_reader :read1,read127,265 - attr_reader :read1, :read2;read227,265 - attr_reader :read1, :read2; attr_writer :write1,write1=27,265 - attr_reader :read1, :read2; attr_writer :write1, :write2write2=27,265 - attr_writer :barbar=28,328 - attr_accessor :teetee29,351 - attr_accessor :teetee=29,351 - alias_method :qux,qux30,376 -A::Constant Constant35,425 + attr_reader :read1 read127,265 + attr_reader :read1 , :read2;read227,265 + attr_reader :read1 , :read2; attr_writer :write1,write1=27,265 + attr_reader :read1 , :read2; attr_writer :write1, :write2write2=27,265 + attr_writer :bar,bar=28,329 + :baz,baz=29,353 + :moremore=30,377 + attr_accessor :teetee31,401 + attr_accessor :teetee=31,401 + alias_method :qux,qux32,426 + alias_method :xyz,xyz33,478 + :tee ; attr_reader :subtlesubtle34,503 +A::Constant Constant39,568 tex-src/testenv.tex,52 \newcommand{\nm}\nm4,77 diff --git a/test/etags/ETAGS.good_4 b/test/etags/ETAGS.good_4 index 333274cb253..32390fab324 100644 --- a/test/etags/ETAGS.good_4 +++ b/test/etags/ETAGS.good_4 @@ -3225,7 +3225,7 @@ module ModuleExample1,0 def module_instance_method46,1051 def ModuleExample.module_class_methodmodule_class_method49,1131 -ruby-src/test1.ru,655 +ruby-src/test1.ru,828 class A1,0 def a(2,8 def b(5,38 @@ -3239,15 +3239,19 @@ module A9,57 def qux=(qux=22,194 def X25,232 attr_reader :foofoo26,242 - attr_reader :read1,read127,265 - attr_reader :read1, :read2;read227,265 - attr_reader :read1, :read2; attr_writer :write1,write1=27,265 - attr_reader :read1, :read2; attr_writer :write1, :write2write2=27,265 - attr_writer :barbar=28,328 - attr_accessor :teetee29,351 - attr_accessor :teetee=29,351 - alias_method :qux,qux30,376 -A::Constant Constant35,425 + attr_reader :read1 read127,265 + attr_reader :read1 , :read2;read227,265 + attr_reader :read1 , :read2; attr_writer :write1,write1=27,265 + attr_reader :read1 , :read2; attr_writer :write1, :write2write2=27,265 + attr_writer :bar,bar=28,329 + :baz,baz=29,353 + :moremore=30,377 + attr_accessor :teetee31,401 + attr_accessor :teetee=31,401 + alias_method :qux,qux32,426 + alias_method :xyz,xyz33,478 + :tee ; attr_reader :subtlesubtle34,503 +A::Constant Constant39,568 tex-src/testenv.tex,52 \newcommand{\nm}\nm4,77 diff --git a/test/etags/ETAGS.good_5 b/test/etags/ETAGS.good_5 index fdf2329ee06..ee19bcfc9d2 100644 --- a/test/etags/ETAGS.good_5 +++ b/test/etags/ETAGS.good_5 @@ -4142,7 +4142,7 @@ module ModuleExample1,0 def module_instance_method46,1051 def ModuleExample.module_class_methodmodule_class_method49,1131 -ruby-src/test1.ru,655 +ruby-src/test1.ru,828 class A1,0 def a(2,8 def b(5,38 @@ -4156,15 +4156,19 @@ module A9,57 def qux=(qux=22,194 def X25,232 attr_reader :foofoo26,242 - attr_reader :read1,read127,265 - attr_reader :read1, :read2;read227,265 - attr_reader :read1, :read2; attr_writer :write1,write1=27,265 - attr_reader :read1, :read2; attr_writer :write1, :write2write2=27,265 - attr_writer :barbar=28,328 - attr_accessor :teetee29,351 - attr_accessor :teetee=29,351 - alias_method :qux,qux30,376 -A::Constant Constant35,425 + attr_reader :read1 read127,265 + attr_reader :read1 , :read2;read227,265 + attr_reader :read1 , :read2; attr_writer :write1,write1=27,265 + attr_reader :read1 , :read2; attr_writer :write1, :write2write2=27,265 + attr_writer :bar,bar=28,329 + :baz,baz=29,353 + :moremore=30,377 + attr_accessor :teetee31,401 + attr_accessor :teetee=31,401 + alias_method :qux,qux32,426 + alias_method :xyz,xyz33,478 + :tee ; attr_reader :subtlesubtle34,503 +A::Constant Constant39,568 tex-src/testenv.tex,52 \newcommand{\nm}\nm4,77 diff --git a/test/etags/ETAGS.good_6 b/test/etags/ETAGS.good_6 index 95d59d3db39..f4d9ab8c1a1 100644 --- a/test/etags/ETAGS.good_6 +++ b/test/etags/ETAGS.good_6 @@ -4142,7 +4142,7 @@ module ModuleExample1,0 def module_instance_method46,1051 def ModuleExample.module_class_methodmodule_class_method49,1131 -ruby-src/test1.ru,655 +ruby-src/test1.ru,828 class A1,0 def a(2,8 def b(5,38 @@ -4156,15 +4156,19 @@ module A9,57 def qux=(qux=22,194 def X25,232 attr_reader :foofoo26,242 - attr_reader :read1,read127,265 - attr_reader :read1, :read2;read227,265 - attr_reader :read1, :read2; attr_writer :write1,write1=27,265 - attr_reader :read1, :read2; attr_writer :write1, :write2write2=27,265 - attr_writer :barbar=28,328 - attr_accessor :teetee29,351 - attr_accessor :teetee=29,351 - alias_method :qux,qux30,376 -A::Constant Constant35,425 + attr_reader :read1 read127,265 + attr_reader :read1 , :read2;read227,265 + attr_reader :read1 , :read2; attr_writer :write1,write1=27,265 + attr_reader :read1 , :read2; attr_writer :write1, :write2write2=27,265 + attr_writer :bar,bar=28,329 + :baz,baz=29,353 + :moremore=30,377 + attr_accessor :teetee31,401 + attr_accessor :teetee=31,401 + alias_method :qux,qux32,426 + alias_method :xyz,xyz33,478 + :tee ; attr_reader :subtlesubtle34,503 +A::Constant Constant39,568 tex-src/testenv.tex,52 \newcommand{\nm}\nm4,77 diff --git a/test/etags/ruby-src/test1.ru b/test/etags/ruby-src/test1.ru index 75dcd51bbe0..bc9dbec36a2 100644 --- a/test/etags/ruby-src/test1.ru +++ b/test/etags/ruby-src/test1.ru @@ -24,10 +24,14 @@ module A end def X attr_reader :foo - attr_reader :read1, :read2; attr_writer :write1, :write2 - attr_writer :bar + attr_reader :read1 , :read2; attr_writer :write1, :write2 + attr_writer :bar, + :baz, + :more attr_accessor :tee - alias_method :qux, :tee + alias_method :qux, :tee, attr_accessor :bogus + alias_method :xyz, + :tee ; attr_reader :subtle end end end