diff options
Diffstat (limited to 'lib/AST/DeclarationName.cpp')
| -rw-r--r-- | lib/AST/DeclarationName.cpp | 116 | 
1 files changed, 96 insertions, 20 deletions
diff --git a/lib/AST/DeclarationName.cpp b/lib/AST/DeclarationName.cpp index 343d403e76ad..860a0b276a79 100644 --- a/lib/AST/DeclarationName.cpp +++ b/lib/AST/DeclarationName.cpp @@ -15,6 +15,7 @@  #include "clang/AST/Decl.h"  #include "clang/AST/DeclarationName.h"  #include "clang/AST/Type.h" +#include "clang/AST/TypeLoc.h"  #include "clang/AST/TypeOrdering.h"  #include "clang/Basic/IdentifierTable.h"  #include "llvm/ADT/DenseMap.h" @@ -404,26 +405,6 @@ DeclarationNameTable::~DeclarationNameTable() {      = static_cast<llvm::FoldingSet<CXXLiteralOperatorIdName>*>          (CXXLiteralOperatorNames); -  if (Ctx.FreeMemory) { -    llvm::FoldingSetIterator<CXXSpecialName> -      SI = SpecialNames->begin(), SE = SpecialNames->end(); - -    while (SI != SE) { -      CXXSpecialName *n = &*SI++; -      Ctx.Deallocate(n); -    } - -    llvm::FoldingSetIterator<CXXLiteralOperatorIdName> -      LI = LiteralNames->begin(), LE = LiteralNames->end(); - -    while (LI != LE) { -      CXXLiteralOperatorIdName *n = &*LI++; -      Ctx.Deallocate(n); -    } - -    Ctx.Deallocate(CXXOperatorNames); -  } -    delete SpecialNames;    delete LiteralNames;  } @@ -505,3 +486,98 @@ getHashValue(clang::DeclarationName N) {    return DenseMapInfo<void*>::getHashValue(N.getAsOpaquePtr());  } +DeclarationNameLoc::DeclarationNameLoc(DeclarationName Name) { +  switch (Name.getNameKind()) { +  case DeclarationName::Identifier: +    break; +  case DeclarationName::CXXConstructorName: +  case DeclarationName::CXXDestructorName: +  case DeclarationName::CXXConversionFunctionName: +    NamedType.TInfo = 0; +    break; +  case DeclarationName::CXXOperatorName: +    CXXOperatorName.BeginOpNameLoc = SourceLocation().getRawEncoding(); +    CXXOperatorName.EndOpNameLoc = SourceLocation().getRawEncoding(); +    break; +  case DeclarationName::CXXLiteralOperatorName: +    CXXLiteralOperatorName.OpNameLoc = SourceLocation().getRawEncoding(); +    break; +  case DeclarationName::ObjCZeroArgSelector: +  case DeclarationName::ObjCOneArgSelector: +  case DeclarationName::ObjCMultiArgSelector: +    // FIXME: ? +    break; +  case DeclarationName::CXXUsingDirective: +    break; +  } +} + +std::string DeclarationNameInfo::getAsString() const { +  std::string Result; +  llvm::raw_string_ostream OS(Result); +  printName(OS); +  return OS.str(); +} + +void DeclarationNameInfo::printName(llvm::raw_ostream &OS) const { +  switch (Name.getNameKind()) { +  case DeclarationName::Identifier: +  case DeclarationName::ObjCZeroArgSelector: +  case DeclarationName::ObjCOneArgSelector: +  case DeclarationName::ObjCMultiArgSelector: +  case DeclarationName::CXXOperatorName: +  case DeclarationName::CXXLiteralOperatorName: +  case DeclarationName::CXXUsingDirective: +    Name.printName(OS); +    return; + +  case DeclarationName::CXXConstructorName: +  case DeclarationName::CXXDestructorName: +  case DeclarationName::CXXConversionFunctionName: +    if (TypeSourceInfo *TInfo = LocInfo.NamedType.TInfo) { +      if (Name.getNameKind() == DeclarationName::CXXDestructorName) +        OS << '~'; +      else if (Name.getNameKind() == DeclarationName::CXXConversionFunctionName) +        OS << "operator "; +      OS << TInfo->getType().getAsString(); +    } +    else +      Name.printName(OS); +    return; +  } +  assert(false && "Unexpected declaration name kind"); +} + +SourceLocation DeclarationNameInfo::getEndLoc() const { +  switch (Name.getNameKind()) { +  case DeclarationName::Identifier: +    return NameLoc; + +  case DeclarationName::CXXOperatorName: { +    unsigned raw = LocInfo.CXXOperatorName.EndOpNameLoc; +    return SourceLocation::getFromRawEncoding(raw); +  } + +  case DeclarationName::CXXLiteralOperatorName: { +    unsigned raw = LocInfo.CXXLiteralOperatorName.OpNameLoc; +    return SourceLocation::getFromRawEncoding(raw); +  } + +  case DeclarationName::CXXConstructorName: +  case DeclarationName::CXXDestructorName: +  case DeclarationName::CXXConversionFunctionName: +    if (TypeSourceInfo *TInfo = LocInfo.NamedType.TInfo) +      return TInfo->getTypeLoc().getEndLoc(); +    else +      return NameLoc; + +    // DNInfo work in progress: FIXME. +  case DeclarationName::ObjCZeroArgSelector: +  case DeclarationName::ObjCOneArgSelector: +  case DeclarationName::ObjCMultiArgSelector: +  case DeclarationName::CXXUsingDirective: +    return NameLoc; +  } +  assert(false && "Unexpected declaration name kind"); +  return SourceLocation(); +}  | 
