#include "data/parser/cxx/name_resolver/CxxSpecifierNameResolver.h" #include #include #include #include "data/parser/cxx/name_resolver/CxxTypeNameResolver.h" #include "data/parser/cxx/name_resolver/CxxDeclNameResolver.h" CxxSpecifierNameResolver::CxxSpecifierNameResolver(std::shared_ptr canonicalFilePathCache) : CxxNameResolver(canonicalFilePathCache, std::vector()) { } CxxSpecifierNameResolver::CxxSpecifierNameResolver( std::shared_ptr canonicalFilePathCache, std::vector ignoredContextDecls ) : CxxNameResolver(canonicalFilePathCache, ignoredContextDecls) { } CxxSpecifierNameResolver::~CxxSpecifierNameResolver() { } std::shared_ptr CxxSpecifierNameResolver::getName(const clang::NestedNameSpecifier* nestedNameSpecifier) { std::shared_ptr name; if (nestedNameSpecifier) { clang::NestedNameSpecifier::SpecifierKind nnsKind = nestedNameSpecifier->getKind(); switch (nnsKind) { case clang::NestedNameSpecifier::Identifier: { name = std::make_shared( nestedNameSpecifier->getAsIdentifier()->getName(), std::vector() ); if (const clang::NestedNameSpecifier* prefix = nestedNameSpecifier->getPrefix()) { std::shared_ptr parentName = getName(prefix); if (parentName) { name->setParent(parentName); } } } break; case clang::NestedNameSpecifier::Namespace: { CxxDeclNameResolver declNameResolver(getCanonicalFilePathCache(), getIgnoredContextDecls()); name = declNameResolver.getName(nestedNameSpecifier->getAsNamespace()); } break; case clang::NestedNameSpecifier::NamespaceAlias: { CxxDeclNameResolver declNameResolver(getCanonicalFilePathCache(), getIgnoredContextDecls()); name = declNameResolver.getName(nestedNameSpecifier->getAsNamespaceAlias()); } break; case clang::NestedNameSpecifier::TypeSpec: case clang::NestedNameSpecifier::TypeSpecWithTemplate: { CxxTypeNameResolver typeNameResolver(getCanonicalFilePathCache(), getIgnoredContextDecls()); name = CxxTypeName::makeUnsolvedIfNull(typeNameResolver.getName(nestedNameSpecifier->getAsType())); } break; case clang::NestedNameSpecifier::Global: // no context name hierarchy needed. break; case clang::NestedNameSpecifier::Super: { CxxDeclNameResolver declNameResolver(getCanonicalFilePathCache(), getIgnoredContextDecls()); name = declNameResolver.getName(nestedNameSpecifier->getAsRecordDecl()); } break; } } return name; }