From e47cb4090aca0ad98979f9e153a8b5ed56a6b434 Mon Sep 17 00:00:00 2001 From: Masatake YAMATO Date: Sun, 4 Dec 2022 02:52:03 +0900 Subject: [PATCH] Cxx: add "defvar" role to "unknown" kind struct opt file_ops { .read = file_read, .write = file_write, }; The parser with this change extracts "opt" with "defvar" role of "unknown" kind. Signed-off-by: Masatake YAMATO --- Tmain/list-kinds-full.d/stdout-expected.txt | 4 +-- Tmain/list-roles.d/stdout-expected.txt | 31 +++++++++++++++++++ Tmain/nested-subparsers.d/stdout-expected.txt | 2 +- Units/parser-c.r/c-reftag-member.d/args.ctags | 2 +- .../c-reftag-member.d/expected.tags | 1 + parsers/cxx/cxx_parser.c | 2 +- parsers/cxx/cxx_parser_function.c | 7 +++-- parsers/cxx/cxx_parser_lambda.c | 2 +- parsers/cxx/cxx_parser_template.c | 3 +- parsers/cxx/cxx_parser_typedef.c | 3 +- parsers/cxx/cxx_parser_variable.c | 2 +- parsers/cxx/cxx_tag.c | 26 ++++++++++++++-- parsers/cxx/cxx_tag.h | 4 ++- 13 files changed, 74 insertions(+), 15 deletions(-) diff --git a/Tmain/list-kinds-full.d/stdout-expected.txt b/Tmain/list-kinds-full.d/stdout-expected.txt index d0fb6550ed..14b82eda07 100644 --- a/Tmain/list-kinds-full.d/stdout-expected.txt +++ b/Tmain/list-kinds-full.d/stdout-expected.txt @@ -1,7 +1,7 @@ #LETTER NAME ENABLED REFONLY NROLES MASTER DESCRIPTION D macroparam no no 0 C parameters inside macro definitions L label no no 0 C goto labels -Y unknown no yes 2 C unknown identifier +Y unknown no yes 3 C unknown identifier d macro yes no 2 C macro definitions e enumerator yes no 0 C enumerators (values inside an enumeration) f function yes no 0 C function definitions @@ -22,7 +22,7 @@ D macroparam no no 0 C parameters inside macro definitions L label no no 0 C goto labels N name no no 0 NONE names imported via using scope::symbol U using no no 0 NONE using namespace statements -Y unknown no yes 2 C unknown identifier +Y unknown no yes 3 C unknown identifier Z tparam no no 0 NONE template parameters c class yes no 0 NONE classes d macro yes no 2 C macro definitions diff --git a/Tmain/list-roles.d/stdout-expected.txt b/Tmain/list-roles.d/stdout-expected.txt index ae3fec4476..0f6734a971 100644 --- a/Tmain/list-roles.d/stdout-expected.txt +++ b/Tmain/list-roles.d/stdout-expected.txt @@ -18,6 +18,7 @@ Automake d/directory program on directory for PROGRA Automake d/directory script on directory for SCRIPTS primary Basic f/function decl on declared Bats S/script loaded on script loaed with "load" command +C Y/unknown defvar on (maybe type) used for defining variables C Y/unknown ref off referenced anyhow C Y/unknown value on used as right side value C d/macro condition off used in part of #if/#ifdef/#elif conditions @@ -25,6 +26,7 @@ C d/macro undef on undefined C h/header local on local header C h/header system on system header C m/member initialized on initialized with form '.member = ...' +C++ Y/unknown defvar on (maybe type) used for defining variables C++ Y/unknown ref off referenced anyhow C++ Y/unknown value on used as right side value C++ d/macro condition off used in part of #if/#ifdef/#elif conditions @@ -36,6 +38,7 @@ CPreProcessor d/macro condition off used in part of #if/ CPreProcessor d/macro undef on undefined CPreProcessor h/header local on local header CPreProcessor h/header system on system header +CUDA Y/unknown defvar on (maybe type) used for defining variables CUDA Y/unknown ref off referenced anyhow CUDA Y/unknown value on used as right side value CUDA d/macro condition off used in part of #if/#ifdef/#elif conditions @@ -146,6 +149,7 @@ Automake d/directory program on directory for PROGRA Automake d/directory script on directory for SCRIPTS primary Basic f/function decl on declared Bats S/script loaded on script loaed with "load" command +C Y/unknown defvar on (maybe type) used for defining variables C Y/unknown ref off referenced anyhow C Y/unknown value on used as right side value C d/macro condition off used in part of #if/#ifdef/#elif conditions @@ -153,6 +157,7 @@ C d/macro undef on undefined C h/header local on local header C h/header system on system header C m/member initialized on initialized with form '.member = ...' +C++ Y/unknown defvar on (maybe type) used for defining variables C++ Y/unknown ref off referenced anyhow C++ Y/unknown value on used as right side value C++ d/macro condition off used in part of #if/#ifdef/#elif conditions @@ -164,6 +169,7 @@ CPreProcessor d/macro condition off used in part of #if/ CPreProcessor d/macro undef on undefined CPreProcessor h/header local on local header CPreProcessor h/header system on system header +CUDA Y/unknown defvar on (maybe type) used for defining variables CUDA Y/unknown ref off referenced anyhow CUDA Y/unknown value on used as right side value CUDA d/macro condition off used in part of #if/#ifdef/#elif conditions @@ -259,6 +265,7 @@ Zsh s/script loaded on loaded # C.* # #KIND(L/N) NAME ENABLED DESCRIPTION +Y/unknown defvar on (maybe type) used for defining variables Y/unknown ref off referenced anyhow Y/unknown value on used as right side value d/macro condition off used in part of #if/#ifdef/#elif conditions @@ -299,6 +306,7 @@ s/script loaded on loaded # C.* with disabling all roles of all languages # #KIND(L/N) NAME ENABLED DESCRIPTION +Y/unknown defvar off (maybe type) used for defining variables Y/unknown ref off referenced anyhow Y/unknown value off used as right side value d/macro condition off used in part of #if/#ifdef/#elif conditions @@ -311,6 +319,7 @@ m/member initialized off initialized with form '.member = ...' # C.* with disabling all roles of all kinds of all languages # #KIND(L/N) NAME ENABLED DESCRIPTION +Y/unknown defvar off (maybe type) used for defining variables Y/unknown ref off referenced anyhow Y/unknown value off used as right side value d/macro condition off used in part of #if/#ifdef/#elif conditions @@ -324,6 +333,7 @@ m/member initialized off initialized with form '.member = ...' # after disabling system role of header kind of C language # #KIND(L/N) NAME ENABLED DESCRIPTION +Y/unknown defvar on (maybe type) used for defining variables Y/unknown ref on referenced anyhow Y/unknown value on used as right side value d/macro condition on used in part of #if/#ifdef/#elif conditions @@ -337,6 +347,7 @@ m/member initialized on initialized with form '.member = ...' # after disabling system role of header kind of C language # #KIND(L/N) NAME ENABLED DESCRIPTION +Y/unknown defvar on (maybe type) used for defining variables Y/unknown ref on referenced anyhow Y/unknown value on used as right side value d/macro condition on used in part of #if/#ifdef/#elif conditions @@ -349,6 +360,7 @@ m/member initialized on initialized with form '.member = ...' # C.* with disabling all roles in C language # #KIND(L/N) NAME ENABLED DESCRIPTION +Y/unknown defvar off (maybe type) used for defining variables Y/unknown ref off referenced anyhow Y/unknown value off used as right side value d/macro condition off used in part of #if/#ifdef/#elif conditions @@ -368,6 +380,7 @@ s/script loaded on loaded # C.* with disabling all roles of all kinds in C language # #KIND(L/N) NAME ENABLED DESCRIPTION +Y/unknown defvar off (maybe type) used for defining variables Y/unknown ref off referenced anyhow Y/unknown value off used as right side value d/macro condition off used in part of #if/#ifdef/#elif conditions @@ -388,6 +401,7 @@ s/script loaded on loaded # after disabling all roles in all languages # #KIND(L/N) NAME ENABLED DESCRIPTION +Y/unknown defvar on (maybe type) used for defining variables Y/unknown ref on referenced anyhow Y/unknown value on used as right side value d/macro condition on used in part of #if/#ifdef/#elif conditions @@ -409,6 +423,7 @@ s/script loaded off loaded # after disabling all roles in all languages # #KIND(L/N) NAME ENABLED DESCRIPTION +Y/unknown defvar on (maybe type) used for defining variables Y/unknown ref on referenced anyhow Y/unknown value on used as right side value d/macro condition on used in part of #if/#ifdef/#elif conditions @@ -429,6 +444,7 @@ s/script loaded off loaded # C.* with disabling all roles of {header} kind in C language # #KIND(L/N) NAME ENABLED DESCRIPTION +Y/unknown defvar on (maybe type) used for defining variables Y/unknown ref off referenced anyhow Y/unknown value on used as right side value d/macro condition off used in part of #if/#ifdef/#elif conditions @@ -448,6 +464,7 @@ s/script loaded on loaded # C.* with disabling all roles of h kind in C language # #KIND(L/N) NAME ENABLED DESCRIPTION +Y/unknown defvar on (maybe type) used for defining variables Y/unknown ref off referenced anyhow Y/unknown value on used as right side value d/macro condition off used in part of #if/#ifdef/#elif conditions @@ -468,6 +485,7 @@ s/script loaded on loaded # after disabling all roles in all languages # #KIND(L/N) NAME ENABLED DESCRIPTION +Y/unknown defvar off (maybe type) used for defining variables Y/unknown ref off referenced anyhow Y/unknown value off used as right side value d/macro condition off used in part of #if/#ifdef/#elif conditions @@ -489,6 +507,7 @@ s/script loaded off loaded # after disabling all roles in all languages # #KIND(L/N) NAME ENABLED DESCRIPTION +Y/unknown defvar off (maybe type) used for defining variables Y/unknown ref off referenced anyhow Y/unknown value off used as right side value d/macro condition off used in part of #if/#ifdef/#elif conditions @@ -509,6 +528,7 @@ s/script loaded off loaded # C.* with disabling system role of h kind # #KIND(L/N) NAME ENABLED DESCRIPTION +Y/unknown defvar on (maybe type) used for defining variables Y/unknown ref off referenced anyhow Y/unknown value on used as right side value d/macro condition off used in part of #if/#ifdef/#elif conditions @@ -521,6 +541,7 @@ m/member initialized on initialized with form '.member = ...' # C.* with disabling system role of {header} kind # #KIND(L/N) NAME ENABLED DESCRIPTION +Y/unknown defvar on (maybe type) used for defining variables Y/unknown ref off referenced anyhow Y/unknown value on used as right side value d/macro condition off used in part of #if/#ifdef/#elif conditions @@ -533,6 +554,7 @@ m/member initialized on initialized with form '.member = ...' # C.* with enabling system role of h kind after disabling the role # #KIND(L/N) NAME ENABLED DESCRIPTION +Y/unknown defvar on (maybe type) used for defining variables Y/unknown ref off referenced anyhow Y/unknown value on used as right side value d/macro condition off used in part of #if/#ifdef/#elif conditions @@ -545,6 +567,7 @@ m/member initialized on initialized with form '.member = ...' # C.* with enabling system role of {header} kind after disabling the role # #KIND(L/N) NAME ENABLED DESCRIPTION +Y/unknown defvar on (maybe type) used for defining variables Y/unknown ref off referenced anyhow Y/unknown value on used as right side value d/macro condition off used in part of #if/#ifdef/#elif conditions @@ -557,6 +580,7 @@ m/member initialized on initialized with form '.member = ...' # C.* with disabling system and local roles of h kind # #KIND(L/N) NAME ENABLED DESCRIPTION +Y/unknown defvar on (maybe type) used for defining variables Y/unknown ref off referenced anyhow Y/unknown value on used as right side value d/macro condition off used in part of #if/#ifdef/#elif conditions @@ -569,6 +593,7 @@ m/member initialized on initialized with form '.member = ...' # C.* with disabling system and local roles of {header} kind # #KIND(L/N) NAME ENABLED DESCRIPTION +Y/unknown defvar on (maybe type) used for defining variables Y/unknown ref off referenced anyhow Y/unknown value on used as right side value d/macro condition off used in part of #if/#ifdef/#elif conditions @@ -582,6 +607,7 @@ m/member initialized on initialized with form '.member = ...' # after disabling all roles in all languages # #KIND(L/N) NAME ENABLED DESCRIPTION +Y/unknown defvar off (maybe type) used for defining variables Y/unknown ref off referenced anyhow Y/unknown value off used as right side value d/macro condition off used in part of #if/#ifdef/#elif conditions @@ -595,6 +621,7 @@ m/member initialized off initialized with form '.member = ...' # after disabling all roles in all languages # #KIND(L/N) NAME ENABLED DESCRIPTION +Y/unknown defvar off (maybe type) used for defining variables Y/unknown ref off referenced anyhow Y/unknown value off used as right side value d/macro condition off used in part of #if/#ifdef/#elif conditions @@ -607,6 +634,7 @@ m/member initialized off initialized with form '.member = ...' # C.* with disabling local role of h kind and undef role of d kind # #KIND(L/N) NAME ENABLED DESCRIPTION +Y/unknown defvar on (maybe type) used for defining variables Y/unknown ref off referenced anyhow Y/unknown value on used as right side value d/macro condition off used in part of #if/#ifdef/#elif conditions @@ -619,6 +647,7 @@ m/member initialized on initialized with form '.member = ...' # C.* with enabling all roles of header kinds after disabling all roles of the kind # #KIND(L/N) NAME ENABLED DESCRIPTION +Y/unknown defvar on (maybe type) used for defining variables Y/unknown ref off referenced anyhow Y/unknown value on used as right side value d/macro condition off used in part of #if/#ifdef/#elif conditions @@ -631,6 +660,7 @@ m/member initialized on initialized with form '.member = ...' # C.* with enabling all roles of header kinds after disabling all roles of the kinds of C language # #KIND(L/N) NAME ENABLED DESCRIPTION +Y/unknown defvar off (maybe type) used for defining variables Y/unknown ref off referenced anyhow Y/unknown value off used as right side value d/macro condition off used in part of #if/#ifdef/#elif conditions @@ -643,6 +673,7 @@ m/member initialized off initialized with form '.member = ...' # C.* with enabling all roles of header kinds after disabling all roles of the kinds of C language (short notation) # #KIND(L/N) NAME ENABLED DESCRIPTION +Y/unknown defvar off (maybe type) used for defining variables Y/unknown ref off referenced anyhow Y/unknown value off used as right side value d/macro condition off used in part of #if/#ifdef/#elif conditions diff --git a/Tmain/nested-subparsers.d/stdout-expected.txt b/Tmain/nested-subparsers.d/stdout-expected.txt index d59a8c57b4..a83115aef3 100644 --- a/Tmain/nested-subparsers.d/stdout-expected.txt +++ b/Tmain/nested-subparsers.d/stdout-expected.txt @@ -37,7 +37,7 @@ n name #LETTER NAME ENABLED REFONLY NROLES MASTER DESCRIPTION D macroparam no no 0 C parameters inside macro definitions L label no no 0 C goto labels -Y unknown no yes 2 C unknown identifier +Y unknown no yes 3 C unknown identifier d macro yes no 2 C macro definitions e enumerator yes no 0 C enumerators (values inside an enumeration) f function yes no 0 C function definitions diff --git a/Units/parser-c.r/c-reftag-member.d/args.ctags b/Units/parser-c.r/c-reftag-member.d/args.ctags index 05d5b6508b..6e0571e5a0 100644 --- a/Units/parser-c.r/c-reftag-member.d/args.ctags +++ b/Units/parser-c.r/c-reftag-member.d/args.ctags @@ -3,4 +3,4 @@ --fields=+rKZ --kinds-C=* --roles-C.{member}=* ---roles-C.{unknown}=+{value} +--roles-C.{unknown}=+{value}{defvar} diff --git a/Units/parser-c.r/c-reftag-member.d/expected.tags b/Units/parser-c.r/c-reftag-member.d/expected.tags index c815c4f73c..084b03f12a 100644 --- a/Units/parser-c.r/c-reftag-member.d/expected.tags +++ b/Units/parser-c.r/c-reftag-member.d/expected.tags @@ -1,3 +1,4 @@ +ops input.c /^static struct ops file_ops = {$/;" unknown roles:defvar file_ops input.c /^static struct ops file_ops = {$/;" variable typeref:struct:ops file: roles:def read input.c /^ .read = file_read_fn,$/;" member scope:variable:file_ops roles:initialized file_read_fn input.c /^ .read = file_read_fn,$/;" unknown scope:variable:file_ops roles:value diff --git a/parsers/cxx/cxx_parser.c b/parsers/cxx/cxx_parser.c index 63256ba8a1..34d8589fc0 100644 --- a/parsers/cxx/cxx_parser.c +++ b/parsers/cxx/cxx_parser.c @@ -873,7 +873,7 @@ bool cxxParserParseEnum(void) if(pTypeEnd) { CXX_DEBUG_ASSERT(pTypeBegin,"Type begin should be also set here"); - pTypeName = cxxTagCheckAndSetTypeField(pTypeBegin,pTypeEnd); + pTypeName = cxxTagCheckAndSetTypeField(pTypeBegin,pTypeEnd, false); } if(bIsScopedEnum) diff --git a/parsers/cxx/cxx_parser_function.c b/parsers/cxx/cxx_parser_function.c index 73a72d9161..e1ad05200f 100644 --- a/parsers/cxx/cxx_parser_function.c +++ b/parsers/cxx/cxx_parser_function.c @@ -1654,7 +1654,7 @@ int cxxParserEmitFunctionTags( CXXToken * pTokenBeforeParenthesis = pInfo->pParenthesis->pPrev; cxxTokenChainTake(pInfo->pParenthesisContainerChain,pInfo->pParenthesis); - pTypeName = cxxTagCheckAndSetTypeField(pInfo->pTypeStart,pInfo->pTypeEnd); + pTypeName = cxxTagCheckAndSetTypeField(pInfo->pTypeStart,pInfo->pTypeEnd, false); cxxTokenChainInsertAfter( pInfo->pParenthesisContainerChain, @@ -1665,7 +1665,7 @@ int cxxParserEmitFunctionTags( pTypeName = NULL; } } else { - pTypeName = cxxTagCheckAndSetTypeField(pInfo->pTypeStart,pInfo->pTypeEnd); + pTypeName = cxxTagCheckAndSetTypeField(pInfo->pTypeStart,pInfo->pTypeEnd, false); } } else { pTypeName = NULL; @@ -1918,7 +1918,8 @@ void cxxParserEmitFunctionParameterTags(CXXTypedVariableSet * pInfo) pTypeName = cxxTagCheckAndSetTypeField( pTypeStart, - pTypeEnd + pTypeEnd, + false ); } else { // The declaration contains only the identifier! diff --git a/parsers/cxx/cxx_parser_lambda.c b/parsers/cxx/cxx_parser_lambda.c index bfc73749c4..9625f5418a 100644 --- a/parsers/cxx/cxx_parser_lambda.c +++ b/parsers/cxx/cxx_parser_lambda.c @@ -239,7 +239,7 @@ bool cxxParserHandleLambda(CXXToken * pParenthesis) markTagExtraBit (tag, XTAG_ANONYMOUS); if(pTypeStart) - pTypeName = cxxTagCheckAndSetTypeField(pTypeStart,pTypeEnd); + pTypeName = cxxTagCheckAndSetTypeField(pTypeStart,pTypeEnd, false); else pTypeName = NULL; diff --git a/parsers/cxx/cxx_parser_template.c b/parsers/cxx/cxx_parser_template.c index 71bbd67845..0902a200aa 100644 --- a/parsers/cxx/cxx_parser_template.c +++ b/parsers/cxx/cxx_parser_template.c @@ -825,7 +825,8 @@ void cxxParserEmitTemplateParameterTags(void) CXXToken * pTypeToken = cxxTagCheckAndSetTypeField( g_cxx.oTemplateParameters.aTypeStarts[i], - g_cxx.oTemplateParameters.aTypeEnds[i] + g_cxx.oTemplateParameters.aTypeEnds[i], + false ); cxxTagCommit(NULL); diff --git a/parsers/cxx/cxx_parser_typedef.c b/parsers/cxx/cxx_parser_typedef.c index 34895c0b95..0160339421 100644 --- a/parsers/cxx/cxx_parser_typedef.c +++ b/parsers/cxx/cxx_parser_typedef.c @@ -433,7 +433,8 @@ void cxxParserExtractTypedef( pTypeName = cxxTagCheckAndSetTypeField( cxxTokenChainFirst(pChain), - pComma ? pComma->pPrev : cxxTokenChainLast(pChain) + pComma ? pComma->pPrev : cxxTokenChainLast(pChain), + false ); } diff --git a/parsers/cxx/cxx_parser_variable.c b/parsers/cxx/cxx_parser_variable.c index 458d2669e5..1f405b3eca 100644 --- a/parsers/cxx/cxx_parser_variable.c +++ b/parsers/cxx/cxx_parser_variable.c @@ -815,7 +815,7 @@ bool cxxParserExtractVariableDeclarations(CXXTokenChain * pChain,unsigned int uF } // anything that remains is part of type - CXXToken * pTypeToken = cxxTagCheckAndSetTypeField(cxxTokenChainFirst(pChain),t->pPrev); + CXXToken * pTypeToken = cxxTagCheckAndSetTypeField(cxxTokenChainFirst(pChain),t->pPrev, true); tag->isFileScope = bKnRStyleParameters ? true : diff --git a/parsers/cxx/cxx_tag.c b/parsers/cxx/cxx_tag.c index aa553f6900..f94fad0e87 100644 --- a/parsers/cxx/cxx_tag.c +++ b/parsers/cxx/cxx_tag.c @@ -23,6 +23,7 @@ static roleDefinition __langPrefix##UnknownRoles [] = { \ { false, "ref", "referenced anyhow" }, \ { true, "value", "used as right side value" }, \ + { true, "defvar", "(maybe type) used for defining variables" }, \ } CXX_COMMON_UNKNOWN_ROLES(C); @@ -534,7 +535,8 @@ static bool cxxTagCheckTypeField( CXXToken * cxxTagCheckAndSetTypeField( CXXToken * pTypeStart, - CXXToken * pTypeEnd + CXXToken * pTypeEnd, + bool bVardef ) { CXX_DEBUG_ASSERT(pTypeStart,"Non null type start is expected here"); @@ -606,7 +608,6 @@ CXXToken * cxxTagCheckAndSetTypeField( cxxTokenChainNormalizeTypeNameSpacingInRange(pTypeStart,pTypeEnd); CXXToken * pTypeName = cxxTokenChainExtractRangeFilterTypeName(pTypeStart,pTypeEnd); - /* TODO */ if(!pTypeName) { @@ -614,6 +615,27 @@ CXXToken * cxxTagCheckAndSetTypeField( return NULL; } + if (bVardef && pTypeEnd && cxxTokenTypeIs(pTypeEnd, CXXTokenTypeIdentifier) && + cxxTagRoleEnabled(CXXTagKindUNKNOWN, CXXTagUnknownRoleDEFVAR)) + { + CXXToken *t = pTypeEnd; + if(t->iCorkIndex != CORK_NIL && t->bCorkIndexForReftag) + cxxTagResetRefTag(t->iCorkIndex, CORK_NIL, + CXXTagKindUNKNOWN, CXXTagUnknownRoleDEFVAR, false); + else if(t->iCorkIndex == CORK_NIL) + { + tagEntryInfo oEntry; + initRefTagEntry(&oEntry, vStringValue(t->pszWord), + CXXTagKindUNKNOWN, CXXTagUnknownRoleDEFVAR); + oEntry.lineNumber = t->iLineNumber; + oEntry.filePosition = t->oFilePosition; + oEntry.isFileScope = false; + // TODO: Other scope field must be filled. + t->iCorkIndex = makeTagEntry(&oEntry); + t->bCorkIndexForReftag = 1; + } + } + CXX_DEBUG_PRINT("Type name is '%s'",vStringValue(pTypeName->pszWord)); g_oCXXTag.extensionFields.typeRef[0] = szTypeRef0; diff --git a/parsers/cxx/cxx_tag.h b/parsers/cxx/cxx_tag.h index 1738ccfdc7..5757d09f91 100644 --- a/parsers/cxx/cxx_tag.h +++ b/parsers/cxx/cxx_tag.h @@ -44,6 +44,7 @@ enum CXXTagUnknownRole { CXXTagUnknownRoleREFERENCED, CXXTagUnknownRoleVALUE, + CXXTagUnknownRoleDEFVAR, }; enum CXXTagMemberRole @@ -123,7 +124,8 @@ tagEntryInfo * cxxTagBegin(unsigned int uKind,CXXToken * pToken); // be destroyed after cxxTagCommit() has been called. CXXToken * cxxTagCheckAndSetTypeField( CXXToken * pTypeStart, - CXXToken * pTypeEnd + CXXToken * pTypeEnd, + bool bVardef ); typedef enum _CXXTagProperty