logic: recording symbol kinds cxx name specifiers (e.g. "std" in "std::string")

This commit is contained in:
malte_langkabel
2017-02-10 17:09:02 +01:00
parent b13dbf2f2d
commit 10e9a4a70d
7 changed files with 129 additions and 50 deletions
-4
View File
@@ -209,10 +209,6 @@ void HierarchyCache::addFirstChildIdsForNodeId(Id nodeId, std::vector<Id>* nodeI
{
node->addChildIds(nodeIds);
}
else
{
nodeIds->push_back(nodeId);
}
}
void HierarchyCache::addFirstVisibleChildIdsForNodeId(Id nodeId, std::vector<Id>* nodeIds) const
+20 -2
View File
@@ -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);
+1 -1
View File
@@ -3322,7 +3322,7 @@ public:
TS_ASSERT_EQUALS(client.errors.size(), 0);
TS_ASSERT_EQUALS(client.typedefs.size(), 1);
TS_ASSERT_EQUALS(client.classes.size(), 4);
TS_ASSERT_EQUALS(client.classes.size(), 5);
TS_ASSERT_EQUALS(client.enums.size(), 1);
TS_ASSERT_EQUALS(client.enumConstants.size(), 2);
TS_ASSERT_EQUALS(client.functions.size(), 5); // used methods are also recorded as functions (these get overridden in the intermediate storage)