On 17/11/2014 0:05, Julien Montmartin wrote:
> 
> Looking at the code, I found an easy way to fix it. Not sure if it's the best 
> way to go, but at least "It works on my machine" ;)

I think you and Shigio are both overthinking it, as it seems ctags & pygments 
simply take the identifier before the brace, so that's what I've done, too (as 
well as doing it for struct).

C:\test>cat test.cpp
class  EXTERNAL1 EXTERNAL2 Class  {};
struct EXTERNAL1 EXTERNAL2 Struct {};

C:\test>gtags   % the current version %

C:\test>global -x .*
EXTERNAL1           1 test.cpp         class  EXTERNAL1 EXTERNAL2 Class  {};

C:\test>gtags   % the patched version %

C:\test>global -x .*
Class               1 test.cpp         class  EXTERNAL1 EXTERNAL2 Class  {};
Struct              2 test.cpp         struct EXTERNAL1 EXTERNAL2 Struct {};

Testing has been *really* minimal (just the above :) ), so I hope it doesn't 
break anything else.

-- 
Jason.

diff -urp global-6.3.2/libparser/Cpp.c global-6.3-2/libparser/Cpp.c
--- global-6.3.2/libparser/Cpp.c        2014-09-04 15:46:14 +1000
+++ global-6.3-2/libparser/Cpp.c        2014-11-18 18:10:30 +1000
@@ -182,19 +182,25 @@ Cpp(const struct parser_param *param)
                        else
                                pushbacktoken();
                        break;
+               case CPP_STRUCT:
                case CPP_CLASS:
-                       DBG_PRINT(level, "class");
-                       if ((c = nexttoken(interested, cpp_reserved_word)) == 
SYMBOL) {
+                       DBG_PRINT(level, cc == CPP_CLASS ? "class" : "struct");
+                       while ((c = nexttoken(interested, cpp_reserved_word)) 
== CPP___ATTRIBUTE__)
+                               process_attribute(param);
+                       while (c == SYMBOL) {
                                strlimcpy(classname, token, sizeof(classname));
-                               /*
-                                * Ignore forward definitions.
-                                * "class name;"
-                                */
-                               if (peekc(0) != ';') {
-                                       startclass = 1;
-                                       PUT(PARSER_DEF, token, lineno, sp);
-                               }
+                               c = nexttoken(interested, cpp_reserved_word);
                        }
+                       /*
+                        * Ignore forward definitions.
+                        * "class name;"
+                        */
+                       if (c != ';') {
+                               startclass = 1;
+                               PUT(PARSER_DEF, classname, lineno, sp);
+                       } else
+                               pushbacktoken();
+
                        break;
                case '{':  /* } */
                        DBG_PRINT(level, "{"); /* } */
@@ -309,7 +315,6 @@ Cpp(const struct parser_param *param)
                        if ((c = nexttoken(interested, cpp_reserved_word)) == 
SYMBOL)
                                PUT(PARSER_REF_SYM, token, lineno, sp);
                        break;
-               case CPP_STRUCT:
                case CPP_ENUM:
                case CPP_UNION:
                        while ((c = nexttoken(interested, cpp_reserved_word)) 
== CPP___ATTRIBUTE__)

_______________________________________________
Bug-global mailing list
Bug-global@gnu.org
https://lists.gnu.org/mailman/listinfo/bug-global

Reply via email to