From 58bfb6a4f597b98f01169f42410df3184c451408 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Tue, 2 Feb 2016 19:16:22 +0200 Subject: [PATCH] More improvements for Ruby support in 'etags' * lib-src/etags.c (Ruby_functions): Tag Ruby accessors and alias_method. Identify constants even if the assignment is not followed by whitespace. (Bug#22241) * test/etags/ruby-src/test1.ruby: Add tests for constants, accessors, and alias_method. * 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 tests. --- lib-src/etags.c | 58 ++++++++++++++++++++++++++++++++-- test/etags/CTAGS.good | 14 +++++++- test/etags/ETAGS.good_1 | 22 ++++++++++--- test/etags/ETAGS.good_2 | 22 ++++++++++--- test/etags/ETAGS.good_3 | 22 ++++++++++--- test/etags/ETAGS.good_4 | 22 ++++++++++--- test/etags/ETAGS.good_5 | 22 ++++++++++--- test/etags/ETAGS.good_6 | 22 ++++++++++--- test/etags/ruby-src/test1.ruby | 9 ++++++ 9 files changed, 180 insertions(+), 33 deletions(-) diff --git a/lib-src/etags.c b/lib-src/etags.c index bdfced5bc9c..769a22027f7 100644 --- a/lib-src/etags.c +++ b/lib-src/etags.c @@ -4642,7 +4642,7 @@ Ruby_functions (FILE *inf) if (cp > name + 1) { bp = skip_spaces (cp); - if (*bp == '=' && c_isspace (bp[1])) + if (*bp == '=' && !(bp[1] == '=' || bp[1] == '>')) { if (colon && !c_isspace (colon[1])) name = colon + 1; @@ -4656,7 +4656,7 @@ Ruby_functions (FILE *inf) || LOOKING_AT (cp, "module")) { const char self_name[] = "self."; - const size_t self_size1 = sizeof ("self.") - 1; + const size_t self_size1 = sizeof (self_name) - 1; name = cp; @@ -4688,6 +4688,60 @@ Ruby_functions (FILE *inf) make_tag (name, cp - name, true, lb.buffer, cp - lb.buffer + 1, lineno, linecharno); } + else + { + /* Tag accessors and aliases. */ + 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")) + { + reader = true; + writer = true; + } + else if (LOOKING_AT (cp, "alias_method")) + alias = true; + if (reader || writer || alias) + { + do { + char *np = cp; + + cp = skip_name (cp); + if (reader) + make_tag (np, cp - np, true, + lb.buffer, cp - lb.buffer + 1, + lineno, linecharno); + if (writer) + { + size_t name_len = cp - np + 1; + char *wr_name = xnew (name_len + 1, char); + + memcpy (wr_name, np, name_len - 1); + memcpy (wr_name + name_len - 1, "=", 2); + pfnote (wr_name, true, lb.buffer, cp - lb.buffer + 1, + lineno, linecharno); + } + if (alias) + { + make_tag (np, cp - np, true, + lb.buffer, cp - lb.buffer + 1, + lineno, linecharno); + while (*cp && *cp != '#' && *cp != ';') + cp++; + } + } while (*cp == ',' + && (cp = skip_spaces (cp + 1), *cp && *cp != '#')); + } + cp = skip_name (cp); + while (*cp && *cp != '#' && notinname (*cp)) + cp++; + } + } } } diff --git a/test/etags/CTAGS.good b/test/etags/CTAGS.good index 846725ef713..c4962a7a207 100644 --- a/test/etags/CTAGS.good +++ b/test/etags/CTAGS.good @@ -177,6 +177,15 @@ $user_comment_lc php-src/lce_functions.php 115 /wh ps-src/rfc1245.ps /^\/wh { $/ /yen ps-src/rfc1245.ps /^\/yen \/.notdef \/.notdef \/.notdef \/.notdef \/.notdef / :a-forth-dictionary-entry forth-src/test-forth.fth /^create :a-forth-dictionary-entry$/ +:bar= ruby-src/test1.ruby /^ attr_writer :bar$/ +:foo ruby-src/test1.ruby /^ attr_reader :foo$/ +:qux ruby-src/test1.ruby /^ alias_method :qux, :tee$/ +:read1 ruby-src/test1.ruby /^ attr_reader :read1, :read2; attr_writer :wri/ +:read2 ruby-src/test1.ruby /^ attr_reader :read1, :read2; attr_writer :wri/ +:tee ruby-src/test1.ruby /^ attr_accessor :tee$/ +:tee= ruby-src/test1.ruby /^ attr_accessor :tee$/ +:write1= ruby-src/test1.ruby /^ attr_reader :read1, :read2; attr_writer :wri/ +:write2= ruby-src/test1.ruby /^ attr_reader :read1, :read2; attr_writer :wri/ < tex-src/texinfo.tex /^\\def<{{\\tt \\less}}$/ << ruby-src/test.rb /^ def <<(y)$/ <= ruby-src/test.rb /^ def <=(y)$/ @@ -460,7 +469,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 +Constant ruby-src/test1.ruby 35 ControlEdit pyt-src/server.py /^class ControlEdit(Frame):$/ Controls pyt-src/server.py /^class Controls:$/ CopyTextString pas-src/common.pas /^function CopyTextString;(*($/ @@ -522,6 +531,7 @@ DOS_NT c-src/etags.c 117 DOS_NT c-src/etags.c 118 DUMPED c-src/emacs/src/gmalloc.c 80 Debug cp-src/functions.cpp /^void Debug ( int lineno, int level, char* func , c/ +Def_ ruby-src/test1.ruby 12 DisposeANameList pas-src/common.pas /^procedure DisposeANameList( $/ DisposeNameList pas-src/common.pas /^procedure DisposeNameList;$/ ELEM_I c-src/h.h 3 @@ -1457,6 +1467,7 @@ WorkingDays cp-src/functions.cpp /^int WorkingDays(Date a, Date b){$/ Write_Lock/p ada-src/2ataspri.adb /^ procedure Write_Lock (L : in out Lock; Ceiling_/ Write_Lock/p ada-src/2ataspri.ads /^ procedure Write_Lock (L : in out Lock; Ceiling_/ X c-src/h.h 100 +X ruby-src/test1.ruby /^ def X$/ XBOOL_VECTOR c-src/emacs/src/lisp.h /^XBOOL_VECTOR (Lisp_Object a)$/ XBUFFER c-src/emacs/src/lisp.h /^XBUFFER (Lisp_Object a)$/ XBUFFER_OBJFWD c-src/emacs/src/lisp.h /^XBUFFER_OBJFWD (union Lisp_Fwd *a)$/ @@ -1534,6 +1545,7 @@ XUNTAG c-src/emacs/src/lisp.h /^# define XUNTAG(a, type) lisp_h_XUNTAG (a, type XUNTAG c-src/emacs/src/lisp.h /^XUNTAG (Lisp_Object a, int type)$/ XWINDOW c-src/emacs/src/lisp.h /^XWINDOW (Lisp_Object a)$/ XX cp-src/x.cc 1 +Xyzzy ruby-src/test1.ruby 13 Y c-src/h.h 100 YACC c-src/etags.c 2199 YELLOW cp-src/screen.hpp 26 diff --git a/test/etags/ETAGS.good_1 b/test/etags/ETAGS.good_1 index c7b122111c4..435cd08da89 100644 --- a/test/etags/ETAGS.good_1 +++ b/test/etags/ETAGS.good_1 @@ -3009,17 +3009,29 @@ module ModuleExample1,0 def module_instance_method46,1051 def ModuleExample.module_class_methodmodule_class_method49,1131 -ruby-src/test1.ruby,191 +ruby-src/test1.ruby,635 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 + Def_ 12,88 + Xyzzy 13,106 + def foo!15,121 + def self._bar?(_bar?18,143 + def qux=(qux=22,194 + def X25,232 + attr_reader :foo26,242 + attr_reader :read1,27,265 + attr_reader :read1, :read2;27,265 + attr_reader :read1, :read2; attr_writer :write1,:write1=27,265 + attr_reader :read1, :read2; attr_writer :write1, :write2:write2=27,265 + attr_writer :bar:bar=28,328 + attr_accessor :tee29,351 + attr_accessor :tee:tee=29,351 + alias_method :qux,30,376 +A::Constant Constant35,425 tex-src/testenv.tex,52 \newcommand{\nm}\nm4,77 diff --git a/test/etags/ETAGS.good_2 b/test/etags/ETAGS.good_2 index 8d0f33824a4..4abdc9098af 100644 --- a/test/etags/ETAGS.good_2 +++ b/test/etags/ETAGS.good_2 @@ -3580,17 +3580,29 @@ module ModuleExample1,0 def module_instance_method46,1051 def ModuleExample.module_class_methodmodule_class_method49,1131 -ruby-src/test1.ruby,191 +ruby-src/test1.ruby,635 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 + Def_ 12,88 + Xyzzy 13,106 + def foo!15,121 + def self._bar?(_bar?18,143 + def qux=(qux=22,194 + def X25,232 + attr_reader :foo26,242 + attr_reader :read1,27,265 + attr_reader :read1, :read2;27,265 + attr_reader :read1, :read2; attr_writer :write1,:write1=27,265 + attr_reader :read1, :read2; attr_writer :write1, :write2:write2=27,265 + attr_writer :bar:bar=28,328 + attr_accessor :tee29,351 + attr_accessor :tee:tee=29,351 + alias_method :qux,30,376 +A::Constant Constant35,425 tex-src/testenv.tex,52 \newcommand{\nm}\nm4,77 diff --git a/test/etags/ETAGS.good_3 b/test/etags/ETAGS.good_3 index 060389c6232..94815caf489 100644 --- a/test/etags/ETAGS.good_3 +++ b/test/etags/ETAGS.good_3 @@ -3356,17 +3356,29 @@ module ModuleExample1,0 def module_instance_method46,1051 def ModuleExample.module_class_methodmodule_class_method49,1131 -ruby-src/test1.ruby,191 +ruby-src/test1.ruby,635 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 + Def_ 12,88 + Xyzzy 13,106 + def foo!15,121 + def self._bar?(_bar?18,143 + def qux=(qux=22,194 + def X25,232 + attr_reader :foo26,242 + attr_reader :read1,27,265 + attr_reader :read1, :read2;27,265 + attr_reader :read1, :read2; attr_writer :write1,:write1=27,265 + attr_reader :read1, :read2; attr_writer :write1, :write2:write2=27,265 + attr_writer :bar:bar=28,328 + attr_accessor :tee29,351 + attr_accessor :tee:tee=29,351 + alias_method :qux,30,376 +A::Constant Constant35,425 tex-src/testenv.tex,52 \newcommand{\nm}\nm4,77 diff --git a/test/etags/ETAGS.good_4 b/test/etags/ETAGS.good_4 index 40404f9fc6e..f71e1b0a432 100644 --- a/test/etags/ETAGS.good_4 +++ b/test/etags/ETAGS.good_4 @@ -3173,17 +3173,29 @@ module ModuleExample1,0 def module_instance_method46,1051 def ModuleExample.module_class_methodmodule_class_method49,1131 -ruby-src/test1.ruby,191 +ruby-src/test1.ruby,635 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 + Def_ 12,88 + Xyzzy 13,106 + def foo!15,121 + def self._bar?(_bar?18,143 + def qux=(qux=22,194 + def X25,232 + attr_reader :foo26,242 + attr_reader :read1,27,265 + attr_reader :read1, :read2;27,265 + attr_reader :read1, :read2; attr_writer :write1,:write1=27,265 + attr_reader :read1, :read2; attr_writer :write1, :write2:write2=27,265 + attr_writer :bar:bar=28,328 + attr_accessor :tee29,351 + attr_accessor :tee:tee=29,351 + alias_method :qux,30,376 +A::Constant Constant35,425 tex-src/testenv.tex,52 \newcommand{\nm}\nm4,77 diff --git a/test/etags/ETAGS.good_5 b/test/etags/ETAGS.good_5 index 432819d3b32..d51542c3a93 100644 --- a/test/etags/ETAGS.good_5 +++ b/test/etags/ETAGS.good_5 @@ -4091,17 +4091,29 @@ module ModuleExample1,0 def module_instance_method46,1051 def ModuleExample.module_class_methodmodule_class_method49,1131 -ruby-src/test1.ruby,191 +ruby-src/test1.ruby,635 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 + Def_ 12,88 + Xyzzy 13,106 + def foo!15,121 + def self._bar?(_bar?18,143 + def qux=(qux=22,194 + def X25,232 + attr_reader :foo26,242 + attr_reader :read1,27,265 + attr_reader :read1, :read2;27,265 + attr_reader :read1, :read2; attr_writer :write1,:write1=27,265 + attr_reader :read1, :read2; attr_writer :write1, :write2:write2=27,265 + attr_writer :bar:bar=28,328 + attr_accessor :tee29,351 + attr_accessor :tee:tee=29,351 + alias_method :qux,30,376 +A::Constant Constant35,425 tex-src/testenv.tex,52 \newcommand{\nm}\nm4,77 diff --git a/test/etags/ETAGS.good_6 b/test/etags/ETAGS.good_6 index 4ad5d76db27..84b73198a4c 100644 --- a/test/etags/ETAGS.good_6 +++ b/test/etags/ETAGS.good_6 @@ -4091,17 +4091,29 @@ module ModuleExample1,0 def module_instance_method46,1051 def ModuleExample.module_class_methodmodule_class_method49,1131 -ruby-src/test1.ruby,191 +ruby-src/test1.ruby,635 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 + Def_ 12,88 + Xyzzy 13,106 + def foo!15,121 + def self._bar?(_bar?18,143 + def qux=(qux=22,194 + def X25,232 + attr_reader :foo26,242 + attr_reader :read1,27,265 + attr_reader :read1, :read2;27,265 + attr_reader :read1, :read2; attr_writer :write1,:write1=27,265 + attr_reader :read1, :read2; attr_writer :write1, :write2:write2=27,265 + attr_writer :bar:bar=28,328 + attr_accessor :tee29,351 + attr_accessor :tee:tee=29,351 + alias_method :qux,30,376 +A::Constant Constant35,425 tex-src/testenv.tex,52 \newcommand{\nm}\nm4,77 diff --git a/test/etags/ruby-src/test1.ruby b/test/etags/ruby-src/test1.ruby index 26b7d538b64..75dcd51bbe0 100644 --- a/test/etags/ruby-src/test1.ruby +++ b/test/etags/ruby-src/test1.ruby @@ -9,6 +9,8 @@ end module A class B ABC = 4 + Def_ = 'blah' + Xyzzy =10 def foo! end @@ -20,6 +22,13 @@ module A def qux=(tee) end end + def X + attr_reader :foo + attr_reader :read1, :read2; attr_writer :write1, :write2 + attr_writer :bar + attr_accessor :tee + alias_method :qux, :tee + end end end -- 2.39.2