]> git.eshelyaron.com Git - emacs.git/commitdiff
More improvements for Ruby support in 'etags'
authorEli Zaretskii <eliz@gnu.org>
Tue, 2 Feb 2016 17:16:22 +0000 (19:16 +0200)
committerEli Zaretskii <eliz@gnu.org>
Tue, 2 Feb 2016 17:16:22 +0000 (19:16 +0200)
* 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
test/etags/CTAGS.good
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/ruby-src/test1.ruby

index bdfced5bc9c145faa84ecf9e8a377c9aac76ee45..769a22027f765a86c9890b63a70712547445a636 100644 (file)
@@ -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++;
+           }
+       }
     }
 }
 
index 846725ef71384ad4619f5ed578db900c857c653f..c4962a7a207e0158b69e4e1ce5fbad56fb0148e9 100644 (file)
@@ -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
index c7b122111c4b4b0d252461d7dd684fbf3b18aeaa..435cd08da899a8aa65eafcab2c70a8c00432b9f4 100644 (file)
@@ -3009,17 +3009,29 @@ module ModuleExample\7f1,0
     def module_instance_method\7f46,1051
     def ModuleExample.module_class_method\7fmodule_class_method\ 149,1131
 \f
-ruby-src/test1.ruby,191
+ruby-src/test1.ruby,635
 class A\7f1,0
  def a(\7f2,8
  def b(\7f5,38
 module A\7f9,57
   class B\7f10,66
     ABC \7f11,76
-    def foo!\7f13,89
-    def self._bar?(\7f_bar?\ 116,111
-      def qux=(\7fqux=\ 120,162
-A::Constant \7fConstant\ 126,211
+    Def_ \7f12,88
+    Xyzzy \7f13,106
+    def foo!\7f15,121
+    def self._bar?(\7f_bar?\ 118,143
+      def qux=(\7fqux=\ 122,194
+    def X\7f25,232
+      attr_reader :foo\7f26,242
+      attr_reader :read1,\7f27,265
+      attr_reader :read1, :read2;\7f27,265
+      attr_reader :read1, :read2; attr_writer :write1,\7f:write1=\ 127,265
+      attr_reader :read1, :read2; attr_writer :write1, :write2\7f:write2=\ 127,265
+      attr_writer :bar\7f:bar=\ 128,328
+      attr_accessor :tee\7f29,351
+      attr_accessor :tee\7f:tee=\ 129,351
+      alias_method :qux,\7f30,376
+A::Constant \7fConstant\ 135,425
 \f
 tex-src/testenv.tex,52
 \newcommand{\nm}\7f\nm\ 14,77
index 8d0f33824a4d19b264e3d4fd144fdba8be525125..4abdc9098af4b055baae8e3a105b27cea6d00e18 100644 (file)
@@ -3580,17 +3580,29 @@ module ModuleExample\7f1,0
     def module_instance_method\7f46,1051
     def ModuleExample.module_class_method\7fmodule_class_method\ 149,1131
 \f
-ruby-src/test1.ruby,191
+ruby-src/test1.ruby,635
 class A\7f1,0
  def a(\7f2,8
  def b(\7f5,38
 module A\7f9,57
   class B\7f10,66
     ABC \7f11,76
-    def foo!\7f13,89
-    def self._bar?(\7f_bar?\ 116,111
-      def qux=(\7fqux=\ 120,162
-A::Constant \7fConstant\ 126,211
+    Def_ \7f12,88
+    Xyzzy \7f13,106
+    def foo!\7f15,121
+    def self._bar?(\7f_bar?\ 118,143
+      def qux=(\7fqux=\ 122,194
+    def X\7f25,232
+      attr_reader :foo\7f26,242
+      attr_reader :read1,\7f27,265
+      attr_reader :read1, :read2;\7f27,265
+      attr_reader :read1, :read2; attr_writer :write1,\7f:write1=\ 127,265
+      attr_reader :read1, :read2; attr_writer :write1, :write2\7f:write2=\ 127,265
+      attr_writer :bar\7f:bar=\ 128,328
+      attr_accessor :tee\7f29,351
+      attr_accessor :tee\7f:tee=\ 129,351
+      alias_method :qux,\7f30,376
+A::Constant \7fConstant\ 135,425
 \f
 tex-src/testenv.tex,52
 \newcommand{\nm}\7f\nm\ 14,77
index 060389c6232f6ea6f4acd061d8505c0892035193..94815caf4891e16a6d20ff9b770ef68371003d71 100644 (file)
@@ -3356,17 +3356,29 @@ module ModuleExample\7f1,0
     def module_instance_method\7f46,1051
     def ModuleExample.module_class_method\7fmodule_class_method\ 149,1131
 \f
-ruby-src/test1.ruby,191
+ruby-src/test1.ruby,635
 class A\7f1,0
  def a(\7f2,8
  def b(\7f5,38
 module A\7f9,57
   class B\7f10,66
     ABC \7f11,76
-    def foo!\7f13,89
-    def self._bar?(\7f_bar?\ 116,111
-      def qux=(\7fqux=\ 120,162
-A::Constant \7fConstant\ 126,211
+    Def_ \7f12,88
+    Xyzzy \7f13,106
+    def foo!\7f15,121
+    def self._bar?(\7f_bar?\ 118,143
+      def qux=(\7fqux=\ 122,194
+    def X\7f25,232
+      attr_reader :foo\7f26,242
+      attr_reader :read1,\7f27,265
+      attr_reader :read1, :read2;\7f27,265
+      attr_reader :read1, :read2; attr_writer :write1,\7f:write1=\ 127,265
+      attr_reader :read1, :read2; attr_writer :write1, :write2\7f:write2=\ 127,265
+      attr_writer :bar\7f:bar=\ 128,328
+      attr_accessor :tee\7f29,351
+      attr_accessor :tee\7f:tee=\ 129,351
+      alias_method :qux,\7f30,376
+A::Constant \7fConstant\ 135,425
 \f
 tex-src/testenv.tex,52
 \newcommand{\nm}\7f\nm\ 14,77
index 40404f9fc6e473ac517d0d39874e4b0d52b929eb..f71e1b0a432fd541ead79eeebcb34e02b3214bbc 100644 (file)
@@ -3173,17 +3173,29 @@ module ModuleExample\7f1,0
     def module_instance_method\7f46,1051
     def ModuleExample.module_class_method\7fmodule_class_method\ 149,1131
 \f
-ruby-src/test1.ruby,191
+ruby-src/test1.ruby,635
 class A\7f1,0
  def a(\7f2,8
  def b(\7f5,38
 module A\7f9,57
   class B\7f10,66
     ABC \7f11,76
-    def foo!\7f13,89
-    def self._bar?(\7f_bar?\ 116,111
-      def qux=(\7fqux=\ 120,162
-A::Constant \7fConstant\ 126,211
+    Def_ \7f12,88
+    Xyzzy \7f13,106
+    def foo!\7f15,121
+    def self._bar?(\7f_bar?\ 118,143
+      def qux=(\7fqux=\ 122,194
+    def X\7f25,232
+      attr_reader :foo\7f26,242
+      attr_reader :read1,\7f27,265
+      attr_reader :read1, :read2;\7f27,265
+      attr_reader :read1, :read2; attr_writer :write1,\7f:write1=\ 127,265
+      attr_reader :read1, :read2; attr_writer :write1, :write2\7f:write2=\ 127,265
+      attr_writer :bar\7f:bar=\ 128,328
+      attr_accessor :tee\7f29,351
+      attr_accessor :tee\7f:tee=\ 129,351
+      alias_method :qux,\7f30,376
+A::Constant \7fConstant\ 135,425
 \f
 tex-src/testenv.tex,52
 \newcommand{\nm}\7f\nm\ 14,77
index 432819d3b32cd3c586ab2fa4dc09f8f1a0169136..d51542c3a93c8faf7f261bdbede3496883412f01 100644 (file)
@@ -4091,17 +4091,29 @@ module ModuleExample\7f1,0
     def module_instance_method\7f46,1051
     def ModuleExample.module_class_method\7fmodule_class_method\ 149,1131
 \f
-ruby-src/test1.ruby,191
+ruby-src/test1.ruby,635
 class A\7f1,0
  def a(\7f2,8
  def b(\7f5,38
 module A\7f9,57
   class B\7f10,66
     ABC \7f11,76
-    def foo!\7f13,89
-    def self._bar?(\7f_bar?\ 116,111
-      def qux=(\7fqux=\ 120,162
-A::Constant \7fConstant\ 126,211
+    Def_ \7f12,88
+    Xyzzy \7f13,106
+    def foo!\7f15,121
+    def self._bar?(\7f_bar?\ 118,143
+      def qux=(\7fqux=\ 122,194
+    def X\7f25,232
+      attr_reader :foo\7f26,242
+      attr_reader :read1,\7f27,265
+      attr_reader :read1, :read2;\7f27,265
+      attr_reader :read1, :read2; attr_writer :write1,\7f:write1=\ 127,265
+      attr_reader :read1, :read2; attr_writer :write1, :write2\7f:write2=\ 127,265
+      attr_writer :bar\7f:bar=\ 128,328
+      attr_accessor :tee\7f29,351
+      attr_accessor :tee\7f:tee=\ 129,351
+      alias_method :qux,\7f30,376
+A::Constant \7fConstant\ 135,425
 \f
 tex-src/testenv.tex,52
 \newcommand{\nm}\7f\nm\ 14,77
index 4ad5d76db271c714ad7e3998f84a01e8a2485e6f..84b73198a4c510caa4e938776026ce40409856ab 100644 (file)
@@ -4091,17 +4091,29 @@ module ModuleExample\7f1,0
     def module_instance_method\7f46,1051
     def ModuleExample.module_class_method\7fmodule_class_method\ 149,1131
 \f
-ruby-src/test1.ruby,191
+ruby-src/test1.ruby,635
 class A\7f1,0
  def a(\7f2,8
  def b(\7f5,38
 module A\7f9,57
   class B\7f10,66
     ABC \7f11,76
-    def foo!\7f13,89
-    def self._bar?(\7f_bar?\ 116,111
-      def qux=(\7fqux=\ 120,162
-A::Constant \7fConstant\ 126,211
+    Def_ \7f12,88
+    Xyzzy \7f13,106
+    def foo!\7f15,121
+    def self._bar?(\7f_bar?\ 118,143
+      def qux=(\7fqux=\ 122,194
+    def X\7f25,232
+      attr_reader :foo\7f26,242
+      attr_reader :read1,\7f27,265
+      attr_reader :read1, :read2;\7f27,265
+      attr_reader :read1, :read2; attr_writer :write1,\7f:write1=\ 127,265
+      attr_reader :read1, :read2; attr_writer :write1, :write2\7f:write2=\ 127,265
+      attr_writer :bar\7f:bar=\ 128,328
+      attr_accessor :tee\7f29,351
+      attr_accessor :tee\7f:tee=\ 129,351
+      alias_method :qux,\7f30,376
+A::Constant \7fConstant\ 135,425
 \f
 tex-src/testenv.tex,52
 \newcommand{\nm}\7f\nm\ 14,77
index 26b7d538b641022b6ebd77dc9fb39571928df1d5..75dcd51bbe0bcd182f20a4f4f86e8b052954bf04 100644 (file)
@@ -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