[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: GNU GLOBAL skips indexing of inline functions in files having C++ su
From: |
Hirohito Kato |
Subject: |
Re: GNU GLOBAL skips indexing of inline functions in files having C++ support macros |
Date: |
Fri, 7 Nov 2008 00:35:10 -0800 (PST) |
Hi,
Now I have fixed my patch.
First of all, Iwamoto-san's code:
| extern "C" void foo(void);
| extern "C++" void bar(void);
is just a prototype declaration. Therefore, original gtags and
my patched gtags command also don't treat them as neither function nor
symbol.
To include them as function, the code should be as follows:
---------------
$ cat externC.cc
extern "C" void foo(void){return;}
extern "C++" void bar(void){return;}
int main(void){ foo(); bar(); return 0;}
---------------
In the C(PP)_EXTERN block, gtags can wait not only '{' but also something.
Furthermore, if next token is '{', gtags should treat it as if it is a kind
of
namespace.
Anyway, the following patch is the fixed code that solves the above problem.
>>>>>>>>>>>>>>>>>>>>>>
diff -ru global-5.7.3/gtags-parser/C.c global-5.7.3_new/gtags-parser/C.c
--- global-5.7.3/gtags-parser/C.c 2008-10-29 19:09:47.000000000 +0900
+++ global-5.7.3_new/gtags-parser/C.c 2008-11-07 16:43:05.000000000 +0900
@@ -70,6 +70,7 @@
} stack[MAXPIFSTACK], *cur;
static int piflevel; /* condition macro level */
static int level; /* brace level */
+static int externclevel; /* extern "C" block level */
/*
* yacc: read yacc file and pickup tag entries.
@@ -113,7 +114,7 @@
int yaccstatus = (type == TYPE_YACC) ? DECLARATIONS : PROGRAMS;
int inC = (type == TYPE_YACC) ? 0 : 1; /* 1 while C source */
- level = piflevel = 0;
+ level = piflevel = externclevel = 0;
savelevel = -1;
target = (sflag) ? SYM : (rflag) ? REF : DEF;
startmacro = startsharp = 0;
@@ -197,7 +198,9 @@
/* { */
case '}':
if (--level < 0) {
- if (wflag)
+ if (externclevel > 0)
+ externclevel--;
+ else if (wflag)
warning("missing left '{' [+%d %s].",
lineno, curfile); /* } */
level = 0;
}
@@ -304,6 +307,20 @@
case SHARP_SHARP: /* ## */
(void)nexttoken(interested, c_reserved_word);
break;
+ case C_EXTERN: /* for 'extern "C"/"C++"' */
+ if (peekc(0) != '"') /* " */
+ continue; /* If does not start with '"',
continue. */
+ while ((c = nexttoken(interested, c_reserved_word)) ==
'\n')
+ ;
+ /*
+ * 'extern "C"/"C++"' block is a kind of namespace
block.
+ * (It doesn't have any influence on level.)
+ */
+ if (c == '{') /* } */
+ externclevel++;
+ else
+ pushbacktoken();
+ break;
case C_STRUCT:
case C_ENUM:
case C_UNION:
diff -ru global-5.7.3/gtags-parser/Cpp.c global-5.7.3_new/gtags-parser/Cpp.c
--- global-5.7.3/gtags-parser/Cpp.c 2008-10-29 19:09:47.000000000 +0900
+++ global-5.7.3_new/gtags-parser/Cpp.c 2008-11-07 16:44:08.000000000 +0900
@@ -181,6 +181,20 @@
warning("missing namespace block. [+%d
%s](0x%x).", lineno, curfile,
c);
}
break;
+ case CPP_EXTERN: /* for 'extern "C"/"C++"' */
+ if (peekc(0) != '"') /* " */
+ continue; /* If does not start with '"',
continue. */
+ while ((c = nexttoken(interested, cpp_reserved_word))
== '\n')
+ ;
+ /*
+ * 'extern "C"/"C++"' block is a kind of namespace
block.
+ * (It doesn't have any influence on level.)
+ */
+ if (c == '{') /* } */
+ namespacelevel++;
+ else
+ pushbacktoken();
+ break;
case CPP_CLASS:
DBG_PRINT(level, "class");
if ((c = nexttoken(interested, cpp_reserved_word)) ==
SYMBOL) {
<<<<<<<<<<<<<<<<<<<<<<
Of cource, this works well on Iwamoto-san's code (though the foo/bar
declarations
are ignored).
I hope this patch will be applied future global sources.
Thank you.
Hirohito Kato wrote:
>
> Hello, thank you for confirmation.
>
> This is my mistake. I believed that 'extern "{C,C++}"' must be
> used with '{' and '}' braces.
>
> Therefore, the patch can only recognize 'extern "*" {...}' expression,
> not one like your code.
>
> Now I have to think about this rule again.
> Thank you for telling me a valuable information.
>
> If someone find problems in my code, please let me know.
>
> Regards,
>
>
> Hideki IWAMOTO wrote:
>>
>> Hi.
>>
>> On Thu, 6 Nov 2008 03:26:49 -0800 (PST), Hirohito Kato wrote...
>>> + warning("missing 'extern \"C\"' block.
>>> [+%d %s](0x%x).", lineno,
>>> curfile, c);
>>
>> I can not understand the meaning of this warning message.
>> Is there any problem in the following source code?
>>
>> ===================
>> $ cat externC.cc
>> extern "C" void foo(void);
>> extern "C++" void bar(void);
>>
>> int main(void){ foo(); bar(); return 0;}
>> $ gtags -w
>> Warning: missing 'extern "C"' block. [+1 ./externC.cc](0x812).
>> Warning: missing 'extern "C"' block. [+2 ./externC.cc](0x812).
>> Warning: missing 'extern "C"' block. [+1 ./externC.cc](0x812).
>> Warning: missing 'extern "C"' block. [+2 ./externC.cc](0x812).
>> Warning: missing 'extern "C"' block. [+1 ./externC.cc](0x812).
>> Warning: missing 'extern "C"' block. [+2 ./externC.cc](0x812).
>> ===================
>>
>> ----
>> Hideki IWAMOTO address@hidden
>>
>>
>> _______________________________________________
>> Bug-global mailing list
>> address@hidden
>> http://lists.gnu.org/mailman/listinfo/bug-global
>>
>>
>
>
--
View this message in context:
http://www.nabble.com/GNU-GLOBAL-skips-indexing-of-inline-functions-in-files-having-C%2B%2B-support-macros-tp11539370p20376264.html
Sent from the Gnu - Global - Bugs mailing list archive at Nabble.com.
Re: GNU GLOBAL skips indexing of inline functions in files having C++ support macros, Shigio YAMAGUCHI, 2008/11/06