logic: recording symbol kinds cxx name specifiers (e.g. "std" in "std::string")
This commit is contained in:
@@ -281,8 +281,26 @@ bool CxxAstVisitor::TraverseTemplateTemplateParmDecl(clang::TemplateTemplateParm
|
||||
|
||||
bool CxxAstVisitor::TraverseNestedNameSpecifierLoc(clang::NestedNameSpecifierLoc loc)
|
||||
{
|
||||
// just skip all qualifiers (for now)
|
||||
return true;
|
||||
bool ret = true;
|
||||
if (loc)
|
||||
{
|
||||
for (auto it = m_components.begin(); it != m_components.end(); it++)
|
||||
{
|
||||
(*it)->beginTraverseNestedNameSpecifierLoc(loc);
|
||||
}
|
||||
|
||||
//todo: call method of base class...
|
||||
if (clang::NestedNameSpecifierLoc prefix = loc.getPrefix())
|
||||
{
|
||||
ret = TraverseNestedNameSpecifierLoc(prefix);
|
||||
}
|
||||
|
||||
for (auto it = m_components.rbegin(); it != m_components.rend(); it++)
|
||||
{
|
||||
(*it)->endTraverseNestedNameSpecifierLoc(loc);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool CxxAstVisitor::TraverseConstructorInitializer(clang::CXXCtorInitializer* init)
|
||||
|
||||
@@ -72,6 +72,8 @@ DEF_TRAVERSE_TYPE_PTR(UnresolvedLookupExpr)
|
||||
virtual void beginTraverseTemplateDefaultArgumentLoc() {}
|
||||
virtual void endTraverseTemplateDefaultArgumentLoc() {}
|
||||
|
||||
DEF_TRAVERSE_TYPE(NestedNameSpecifierLoc)
|
||||
|
||||
DEF_TRAVERSE_CUSTOM_TYPE_PTR(ConstructorInitializer, CXXCtorInitializer)
|
||||
|
||||
DEF_TRAVERSE_TYPE_PTR(CXXTemporaryObjectExpr)
|
||||
|
||||
@@ -26,6 +26,68 @@ CxxAstVisitorComponentIndexer::~CxxAstVisitorComponentIndexer()
|
||||
{
|
||||
}
|
||||
|
||||
void CxxAstVisitorComponentIndexer::beginTraverseNestedNameSpecifierLoc(const clang::NestedNameSpecifierLoc loc)
|
||||
{
|
||||
switch (loc.getNestedNameSpecifier()->getKind())
|
||||
{
|
||||
case clang::NestedNameSpecifier::Identifier:
|
||||
break;
|
||||
case clang::NestedNameSpecifier::Namespace:
|
||||
m_client->recordSymbol(
|
||||
getAstVisitor()->getDeclNameCache()->getValue(loc.getNestedNameSpecifier()->getAsNamespace()),
|
||||
SYMBOL_NAMESPACE,
|
||||
ACCESS_NONE,
|
||||
DEFINITION_NONE
|
||||
);
|
||||
break;
|
||||
case clang::NestedNameSpecifier::NamespaceAlias:
|
||||
m_client->recordSymbol(
|
||||
getAstVisitor()->getDeclNameCache()->getValue(loc.getNestedNameSpecifier()->getAsNamespaceAlias()),
|
||||
SYMBOL_NAMESPACE,
|
||||
ACCESS_NONE,
|
||||
DEFINITION_NONE
|
||||
);
|
||||
m_client->recordSymbol(
|
||||
getAstVisitor()->getDeclNameCache()->getValue(loc.getNestedNameSpecifier()->getAsNamespaceAlias()->getAliasedNamespace()),
|
||||
SYMBOL_NAMESPACE,
|
||||
ACCESS_NONE,
|
||||
DEFINITION_NONE
|
||||
);
|
||||
break;
|
||||
case clang::NestedNameSpecifier::Global:
|
||||
case clang::NestedNameSpecifier::Super:
|
||||
break;
|
||||
case clang::NestedNameSpecifier::TypeSpec:
|
||||
case clang::NestedNameSpecifier::TypeSpecWithTemplate:
|
||||
if (const clang::CXXRecordDecl* recordDecl = loc.getNestedNameSpecifier()->getAsRecordDecl())
|
||||
{
|
||||
SymbolKind symbolKind = SYMBOL_KIND_MAX;
|
||||
if (recordDecl->isClass())
|
||||
{
|
||||
symbolKind = SYMBOL_CLASS;
|
||||
}
|
||||
else if (recordDecl->isStruct())
|
||||
{
|
||||
symbolKind = SYMBOL_STRUCT;
|
||||
}
|
||||
else if (recordDecl->isUnion())
|
||||
{
|
||||
symbolKind = SYMBOL_UNION;
|
||||
}
|
||||
|
||||
if (symbolKind != SYMBOL_KIND_MAX)
|
||||
{
|
||||
m_client->recordSymbol(
|
||||
getAstVisitor()->getDeclNameCache()->getValue(recordDecl),
|
||||
symbolKind,
|
||||
ACCESS_NONE,
|
||||
DEFINITION_NONE
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CxxAstVisitorComponentIndexer::beginTraverseTemplateArgumentLoc(const clang::TemplateArgumentLoc& loc)
|
||||
{
|
||||
if (
|
||||
|
||||
@@ -15,6 +15,7 @@ public:
|
||||
CxxAstVisitorComponentIndexer(CxxAstVisitor* astVisitor, clang::ASTContext* astContext, ParserClient* client, FileRegister* fileRegister);
|
||||
virtual ~CxxAstVisitorComponentIndexer();
|
||||
|
||||
virtual void beginTraverseNestedNameSpecifierLoc(const clang::NestedNameSpecifierLoc loc);
|
||||
virtual void beginTraverseTemplateArgumentLoc(const clang::TemplateArgumentLoc& loc);
|
||||
virtual void beginTraverseLambdaCapture(clang::LambdaExpr *lambdaExpr, const clang::LambdaCapture *capture);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user