logic: added type usage edge for types that occur as template arguments

This commit is contained in:
mlangkabel
2018-11-02 13:27:44 +01:00
parent 05649977a6
commit bff7b0d70a
20 changed files with 491 additions and 127 deletions
@@ -94,12 +94,26 @@ void CxxAstVisitorComponentIndexer::beginTraverseTemplateArgumentLoc(const clang
(getAstVisitor()->shouldVisitReference(loc.getLocation(), getAstVisitor()->getComponent<CxxAstVisitorComponentContext>()->getTopmostContextDecl()))
){
// TODO: maybe move this to VisitTemplateName
const Id symbolId = getOrCreateSymbolId(loc.getArgument().getAsTemplate().getAsTemplateDecl());
const ParseLocation parseLocation = getParseLocation(loc.getLocation());
m_client->recordReference(
getAstVisitor()->getComponent<CxxAstVisitorComponentTypeRefKind>()->getReferenceKind(),
getOrCreateSymbolId(loc.getArgument().getAsTemplate().getAsTemplateDecl()),
symbolId,
getOrCreateSymbolId(getAstVisitor()->getComponent<CxxAstVisitorComponentContext>()->getContext()),
getParseLocation(loc.getLocation())
parseLocation
);
if (getAstVisitor()->getComponent<CxxAstVisitorComponentTypeRefKind>()->getReferenceKind() == REFERENCE_TEMPLATE_ARGUMENT)
{
m_client->recordReference(
REFERENCE_TYPE_USAGE,
symbolId,
getOrCreateSymbolId(getAstVisitor()->getComponent<CxxAstVisitorComponentContext>()->getTopmostContextDecl()), // we use the closest named decl here
parseLocation
);
}
}
}
@@ -509,12 +523,24 @@ void CxxAstVisitorComponentIndexer::visitTypeLoc(clang::TypeLoc tl)
loc = tl.getBeginLoc();
}
const ParseLocation parseLocation = getParseLocation(loc);
m_client->recordReference(
getAstVisitor()->getComponent<CxxAstVisitorComponentTypeRefKind>()->getReferenceKind(),
symbolId,
getOrCreateSymbolId(getAstVisitor()->getComponent<CxxAstVisitorComponentContext>()->getContext(1)), // we skip the last element because it refers to this typeloc.
getParseLocation(loc)
parseLocation
);
if (getAstVisitor()->getComponent<CxxAstVisitorComponentTypeRefKind>()->getReferenceKind() == REFERENCE_TEMPLATE_ARGUMENT)
{
m_client->recordReference(
REFERENCE_TYPE_USAGE,
symbolId,
getOrCreateSymbolId(getAstVisitor()->getComponent<CxxAstVisitorComponentContext>()->getTopmostContextDecl()), // we use the closest named decl here
parseLocation
);
}
}
}