From ce22e5917a0206bf2688ecbe449660026243a70d Mon Sep 17 00:00:00 2001 From: mlangkabel Date: Mon, 30 Sep 2019 11:30:47 +0200 Subject: [PATCH] logic: record template argument that is a dependent template type as local symbol --- src/lib/data/parser/ParserClientImpl.cpp | 5 ++- .../cxx/CxxAstVisitorComponentIndexer.cpp | 43 +++++++++++-------- src/test/CxxParserTestSuite.h | 2 +- 3 files changed, 31 insertions(+), 19 deletions(-) diff --git a/src/lib/data/parser/ParserClientImpl.cpp b/src/lib/data/parser/ParserClientImpl.cpp index e60afc00..372762ec 100644 --- a/src/lib/data/parser/ParserClientImpl.cpp +++ b/src/lib/data/parser/ParserClientImpl.cpp @@ -50,7 +50,10 @@ void ParserClientImpl::recordDefinitionKind(Id symbolId, DefinitionKind definiti Id ParserClientImpl::recordReference(ReferenceKind referenceKind, Id referencedSymbolId, Id contextSymbolId, const ParseLocation& location) { Id edgeId = addEdge(referenceKindToEdgeType(referenceKind), contextSymbolId, referencedSymbolId); - addSourceLocation(edgeId, location, LOCATION_TOKEN); + if (edgeId) + { + addSourceLocation(edgeId, location, LOCATION_TOKEN); + } return edgeId; } diff --git a/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentIndexer.cpp b/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentIndexer.cpp index 775752ad..f12b8d5e 100644 --- a/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentIndexer.cpp +++ b/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentIndexer.cpp @@ -96,26 +96,35 @@ void CxxAstVisitorComponentIndexer::beginTraverseTemplateArgumentLoc(const clang { // TODO: maybe move this to VisitTemplateName - const Id symbolId = getOrCreateSymbolId(loc.getArgument().getAsTemplate().getAsTemplateDecl()); + const clang::TemplateName templateTemplateArgumentName = loc.getArgument().getAsTemplate(); + const ParseLocation parseLocation = getParseLocation(loc.getLocation()); - - m_client->recordReference( - REFERENCE_TYPE_USAGE, - symbolId, - getOrCreateSymbolId(getAstVisitor()->getComponent()->getContext()), - parseLocation - ); - + if (templateTemplateArgumentName.isDependent()) { - const clang::NamedDecl* namedContextDecl = getAstVisitor()->getComponent()->getTopmostContextDecl(1); - if (namedContextDecl) + m_client->recordLocalSymbol(getLocalSymbolName(templateTemplateArgumentName.getAsTemplateDecl()->getLocation()), parseLocation); + } + else + { + const Id symbolId = getOrCreateSymbolId(templateTemplateArgumentName.getAsTemplateDecl()); + + m_client->recordReference( + REFERENCE_TYPE_USAGE, + symbolId, + getOrCreateSymbolId(getAstVisitor()->getComponent()->getContext()), + parseLocation + ); + { - m_client->recordReference( - REFERENCE_TYPE_USAGE, - symbolId, - getOrCreateSymbolId(namedContextDecl), // we use the closest named decl here (e.g. function decl) - parseLocation - ); + const clang::NamedDecl* namedContextDecl = getAstVisitor()->getComponent()->getTopmostContextDecl(1); + if (namedContextDecl) + { + m_client->recordReference( + REFERENCE_TYPE_USAGE, + symbolId, + getOrCreateSymbolId(namedContextDecl), // we use the closest named decl here (e.g. function decl) + parseLocation + ); + } } } } diff --git a/src/test/CxxParserTestSuite.h b/src/test/CxxParserTestSuite.h index 4f270b1c..feedf416 100644 --- a/src/test/CxxParserTestSuite.h +++ b/src/test/CxxParserTestSuite.h @@ -3641,7 +3641,7 @@ public: client->typeUses, L"B typename U> -> A <8:9 8:9>" )); TS_ASSERT(utility::containsElement( - client->typeUses, L"B typename U> -> B typename U>::U <8:12 8:12>" + client->localSymbols, L"input.cc<7:36> <8:12 8:12>" )); }