ctags/0008-c-Properly-parse-C-11-override-and-final-members.patch

57 lines
1.9 KiB
Diff

From ce27db2946ae2ebc2766138af451d7d981201134 Mon Sep 17 00:00:00 2001
From: Ivan Grokhotkov <igrokhotkov@gmail.com>
Date: Wed, 20 Jan 2016 12:25:18 +0300
Subject: [PATCH 08/19] c++: Properly parse C++11 override and final members
Manual cherry-pick of
- https://github.com/geany/geany/commit/95a0d4db7e2188a62cf7770496ee2a51591f1962
- https://github.com/geany/geany/commit/641863c2647c21abb36aedc40ac93e6cc478f920
---
c.c | 22 ++++++++++++++++++++--
1 file changed, 20 insertions(+), 2 deletions(-)
diff --git a/c.c b/c.c
index 0dd84d7..6e8b5aa 100644
--- a/c.c
+++ b/c.c
@@ -1986,7 +1986,13 @@ static boolean skipPostArgumentStuff (
break;
default:
- if (isType (token, TOKEN_NONE))
+ /* "override" and "final" are only keywords in the declaration of a virtual
+ * member function, so need to be handled specially, not as keywords */
+ if (isLanguage(Lang_cpp) && isType (token, TOKEN_NAME) &&
+ (strcmp ("override", vStringValue (token->name)) == 0 ||
+ strcmp ("final", vStringValue (token->name)) == 0))
+ ;
+ else if (isType (token, TOKEN_NONE))
;
else if (info->isKnrParamList && info->parameterCount > 0)
++elementCount;
@@ -2839,8 +2845,20 @@ static void tagCheck (statementInfo *const st)
st->declaration == DECL_NAMESPACE ||
st->declaration == DECL_PROGRAM)
{
- if (isType (prev, TOKEN_NAME))
+ tokenInfo *name_token = (tokenInfo *)prev;
+
+ /* C++ 11 allows class <name> final { ... } */
+ if (isLanguage (Lang_cpp) && isType (prev, TOKEN_NAME) &&
+ strcmp("final", vStringValue(prev->name)) == 0 &&
+ isType(prev2, TOKEN_NAME))
+ {
+ name_token = (tokenInfo *)prev2;
+ copyToken (st->blockName, name_token);
+ }
+ else if (isType (name_token, TOKEN_NAME))
+ {
copyToken (st->blockName, prev);
+ }
else
{
/* For an anonymous struct or union we use a unique ID
--
2.11.0