#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() : CxxNameResolver(std::vector()) { } CxxSpecifierNameResolver::CxxSpecifierNameResolver(std::vector ignoredContextDecls) : CxxNameResolver(ignoredContextDecls) { } CxxSpecifierNameResolver::~CxxSpecifierNameResolver() { } std::shared_ptr CxxSpecifierNameResolver::getName(const clang::NestedNameSpecifier* nestedNameSpecifier) { clang::NestedNameSpecifier::SpecifierKind nnsKind = nestedNameSpecifier->getKind(); std::shared_ptr name; 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(getIgnoredContextDecls()); name = declNameResolver.getName(nestedNameSpecifier->getAsNamespace()); } break; case clang::NestedNameSpecifier::NamespaceAlias: { CxxDeclNameResolver declNameResolver(getIgnoredContextDecls()); name = declNameResolver.getName(nestedNameSpecifier->getAsNamespaceAlias()); } break; case clang::NestedNameSpecifier::TypeSpec: case clang::NestedNameSpecifier::TypeSpecWithTemplate: { CxxTypeNameResolver typeNameResolver(getIgnoredContextDecls()); name = typeNameResolver.getName(nestedNameSpecifier->getAsType()); } break; case clang::NestedNameSpecifier::Global: // no context name hierarchy needed. break; case clang::NestedNameSpecifier::Super: { CxxDeclNameResolver declNameResolver(getIgnoredContextDecls()); name = declNameResolver.getName(nestedNameSpecifier->getAsRecordDecl()); } break; } return name; }