diff options
Diffstat (limited to 'lib/AST/DeclarationName.cpp')
-rw-r--r-- | lib/AST/DeclarationName.cpp | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/lib/AST/DeclarationName.cpp b/lib/AST/DeclarationName.cpp index 4266ef5eaf..d58016a44c 100644 --- a/lib/AST/DeclarationName.cpp +++ b/lib/AST/DeclarationName.cpp @@ -12,6 +12,8 @@ // //===----------------------------------------------------------------------===// #include "clang/AST/DeclarationName.h" +#include "clang/AST/Type.h" +#include "clang/AST/Decl.h" #include "clang/Basic/IdentifierTable.h" #include "llvm/ADT/FoldingSet.h" #include "llvm/Bitcode/Serialize.h" @@ -94,6 +96,50 @@ DeclarationName::NameKind DeclarationName::getNameKind() const { return Identifier; } +std::string DeclarationName::getAsString() const { + switch (getNameKind()) { + case Identifier: + if (const IdentifierInfo *II = getAsIdentifierInfo()) + return II->getName(); + return ""; + + case ObjCZeroArgSelector: + case ObjCOneArgSelector: + case ObjCMultiArgSelector: + return getObjCSelector().getName(); + + case CXXConstructorName: { + QualType ClassType = getCXXNameType(); + if (const RecordType *ClassRec = ClassType->getAsRecordType()) + return ClassRec->getDecl()->getName(); + return ClassType.getAsString(); + } + + case CXXDestructorName: { + std::string Result = "~"; + QualType Type = getCXXNameType(); + if (const RecordType *Rec = Type->getAsRecordType()) + Result += Rec->getDecl()->getName(); + else + Result += Type.getAsString(); + return Result; + } + + case CXXConversionFunctionName: { + std::string Result = "operator "; + QualType Type = getCXXNameType(); + if (const RecordType *Rec = Type->getAsRecordType()) + Result += Rec->getDecl()->getName(); + else + Result += Type.getAsString(); + return Result; + } + } + + assert(false && "Unexpected declaration name kind"); + return ""; +} + QualType DeclarationName::getCXXNameType() const { if (CXXSpecialName *CXXName = getAsCXXSpecialName()) return CXXName->Type; |