* added classes that represent different name kinds * rewrote NameResolvers to return the new name classes instead of NameElement and NameHierarchy * removed DataType classes since their functionality moved to the CxxTypeName class.
77 lines
2.2 KiB
C++
77 lines
2.2 KiB
C++
#include "data/parser/cxx/name_resolver/CxxSpecifierNameResolver.h"
|
|
|
|
#include <clang/AST/PrettyPrinter.h>
|
|
#include <clang/AST/DeclTemplate.h>
|
|
#include <clang/AST/ASTContext.h>
|
|
|
|
#include "data/parser/cxx/name_resolver/CxxTypeNameResolver.h"
|
|
#include "data/parser/cxx/name_resolver/CxxDeclNameResolver.h"
|
|
|
|
CxxSpecifierNameResolver::CxxSpecifierNameResolver()
|
|
: CxxNameResolver(std::vector<const clang::Decl*>())
|
|
{
|
|
}
|
|
|
|
CxxSpecifierNameResolver::CxxSpecifierNameResolver(std::vector<const clang::Decl*> ignoredContextDecls)
|
|
: CxxNameResolver(ignoredContextDecls)
|
|
{
|
|
}
|
|
|
|
CxxSpecifierNameResolver::~CxxSpecifierNameResolver()
|
|
{
|
|
}
|
|
|
|
std::shared_ptr<CxxName> CxxSpecifierNameResolver::getName(const clang::NestedNameSpecifier* nestedNameSpecifier)
|
|
{
|
|
clang::NestedNameSpecifier::SpecifierKind nnsKind = nestedNameSpecifier->getKind();
|
|
std::shared_ptr<CxxName> name;
|
|
switch (nnsKind)
|
|
{
|
|
case clang::NestedNameSpecifier::Identifier:
|
|
{
|
|
name = std::make_shared<CxxDeclName>(
|
|
nestedNameSpecifier->getAsIdentifier()->getName(), std::vector<std::string>()
|
|
);
|
|
|
|
if (const clang::NestedNameSpecifier* prefix = nestedNameSpecifier->getPrefix())
|
|
{
|
|
std::shared_ptr<CxxName> 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;
|
|
}
|