void cxxTokenChainNormalizeTypeNameSpacing(CXXTokenChain * pChain) { if(!pChain) return; if(pChain->iCount < 1) return; cxxTokenChainNormalizeTypeNameSpacingInRange(pChain->pHead,pChain->pTail); }
CXXToken * cxxTagCheckAndSetTypeField( CXXToken * pTypeStart, CXXToken * pTypeEnd ) { CXX_DEBUG_ASSERT(pTypeStart && pTypeEnd,"Non null parameters are expected"); const char * szTypeRef0; // "typename" is debatable since it's not really // allowed by C++ for unqualified types. However I haven't been able // to come up with something better... so "typename" it is for now. static const char * szTypename = "typename"; if(pTypeStart != pTypeEnd) { // Note that this does not work for types like "const enum X" // But that's not backward compatible anyway, so we live with it. if( cxxTokenTypeIs(pTypeStart,CXXTokenTypeKeyword) && cxxKeywordIsTypeRefMarker(pTypeStart->eKeyword) ) { szTypeRef0 = cxxKeywordName(pTypeStart->eKeyword); pTypeStart = pTypeStart->pNext; } else { szTypeRef0 = szTypename; } } else { szTypeRef0 = szTypename; } if(!cxxTagCheckTypeField(pTypeStart,pTypeEnd)) { CXX_DEBUG_PRINT("Type name looks suspicious: refusing to emit it"); return NULL; } cxxTokenChainNormalizeTypeNameSpacingInRange(pTypeStart,pTypeEnd); CXXToken * pTypeName = cxxTokenChainExtractRange(pTypeStart,pTypeEnd,0); CXX_DEBUG_PRINT("Type name is '%s'",vStringValue(pTypeName->pszWord)); g_oCXXTag.extensionFields.typeRef[0] = szTypeRef0; g_oCXXTag.extensionFields.typeRef[1] = vStringValue(pTypeName->pszWord); return pTypeName; }