diff options
Diffstat (limited to 'tools/libclang/CIndexUSRs.cpp')
-rw-r--r-- | tools/libclang/CIndexUSRs.cpp | 174 |
1 files changed, 89 insertions, 85 deletions
diff --git a/tools/libclang/CIndexUSRs.cpp b/tools/libclang/CIndexUSRs.cpp index 6140032..a911ce5 100644 --- a/tools/libclang/CIndexUSRs.cpp +++ b/tools/libclang/CIndexUSRs.cpp @@ -22,14 +22,13 @@ #include "llvm/Support/raw_ostream.h" using namespace clang; -using namespace clang::cxstring; //===----------------------------------------------------------------------===// // USR generation. //===----------------------------------------------------------------------===// namespace { -class USRGenerator : public DeclVisitor<USRGenerator> { +class USRGenerator : public ConstDeclVisitor<USRGenerator> { OwningPtr<SmallString<128> > OwnedBuf; SmallVectorImpl<char> &Buf; llvm::raw_svector_ostream Out; @@ -67,37 +66,37 @@ public: bool ignoreResults() const { return IgnoreResults; } // Visitation methods from generating USRs from AST elements. - void VisitDeclContext(DeclContext *D); - void VisitFieldDecl(FieldDecl *D); - void VisitFunctionDecl(FunctionDecl *D); - void VisitNamedDecl(NamedDecl *D); - void VisitNamespaceDecl(NamespaceDecl *D); - void VisitNamespaceAliasDecl(NamespaceAliasDecl *D); - void VisitFunctionTemplateDecl(FunctionTemplateDecl *D); - void VisitClassTemplateDecl(ClassTemplateDecl *D); - void VisitObjCContainerDecl(ObjCContainerDecl *CD); - void VisitObjCMethodDecl(ObjCMethodDecl *MD); - void VisitObjCPropertyDecl(ObjCPropertyDecl *D); - void VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D); - void VisitTagDecl(TagDecl *D); - void VisitTypedefDecl(TypedefDecl *D); - void VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D); - void VisitVarDecl(VarDecl *D); - void VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D); - void VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D); - void VisitLinkageSpecDecl(LinkageSpecDecl *D) { + void VisitDeclContext(const DeclContext *D); + void VisitFieldDecl(const FieldDecl *D); + void VisitFunctionDecl(const FunctionDecl *D); + void VisitNamedDecl(const NamedDecl *D); + void VisitNamespaceDecl(const NamespaceDecl *D); + void VisitNamespaceAliasDecl(const NamespaceAliasDecl *D); + void VisitFunctionTemplateDecl(const FunctionTemplateDecl *D); + void VisitClassTemplateDecl(const ClassTemplateDecl *D); + void VisitObjCContainerDecl(const ObjCContainerDecl *CD); + void VisitObjCMethodDecl(const ObjCMethodDecl *MD); + void VisitObjCPropertyDecl(const ObjCPropertyDecl *D); + void VisitObjCPropertyImplDecl(const ObjCPropertyImplDecl *D); + void VisitTagDecl(const TagDecl *D); + void VisitTypedefDecl(const TypedefDecl *D); + void VisitTemplateTypeParmDecl(const TemplateTypeParmDecl *D); + void VisitVarDecl(const VarDecl *D); + void VisitNonTypeTemplateParmDecl(const NonTypeTemplateParmDecl *D); + void VisitTemplateTemplateParmDecl(const TemplateTemplateParmDecl *D); + void VisitLinkageSpecDecl(const LinkageSpecDecl *D) { IgnoreResults = true; } - void VisitUsingDirectiveDecl(UsingDirectiveDecl *D) { + void VisitUsingDirectiveDecl(const UsingDirectiveDecl *D) { IgnoreResults = true; } - void VisitUsingDecl(UsingDecl *D) { + void VisitUsingDecl(const UsingDecl *D) { IgnoreResults = true; } - void VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) { + void VisitUnresolvedUsingValueDecl(const UnresolvedUsingValueDecl *D) { IgnoreResults = true; } - void VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D) { + void VisitUnresolvedUsingTypenameDecl(const UnresolvedUsingTypenameDecl *D) { IgnoreResults = true; } @@ -151,25 +150,19 @@ bool USRGenerator::EmitDeclName(const NamedDecl *D) { return startSize == endSize; } -static bool InAnonymousNamespace(const Decl *D) { - if (const NamespaceDecl *ND = dyn_cast<NamespaceDecl>(D->getDeclContext())) - return ND->isAnonymousNamespace(); - return false; -} - static inline bool ShouldGenerateLocation(const NamedDecl *D) { - return D->getLinkage() != ExternalLinkage && !InAnonymousNamespace(D); + return D->getLinkage() != ExternalLinkage; } -void USRGenerator::VisitDeclContext(DeclContext *DC) { - if (NamedDecl *D = dyn_cast<NamedDecl>(DC)) +void USRGenerator::VisitDeclContext(const DeclContext *DC) { + if (const NamedDecl *D = dyn_cast<NamedDecl>(DC)) Visit(D); } -void USRGenerator::VisitFieldDecl(FieldDecl *D) { +void USRGenerator::VisitFieldDecl(const FieldDecl *D) { // The USR for an ivar declared in a class extension is based on the // ObjCInterfaceDecl, not the ObjCCategoryDecl. - if (ObjCInterfaceDecl *ID = Context->getObjContainingInterface(D)) + if (const ObjCInterfaceDecl *ID = Context->getObjContainingInterface(D)) Visit(ID); else VisitDeclContext(D->getDeclContext()); @@ -181,7 +174,7 @@ void USRGenerator::VisitFieldDecl(FieldDecl *D) { } } -void USRGenerator::VisitFunctionDecl(FunctionDecl *D) { +void USRGenerator::VisitFunctionDecl(const FunctionDecl *D) { if (ShouldGenerateLocation(D) && GenLoc(D)) return; @@ -208,7 +201,8 @@ void USRGenerator::VisitFunctionDecl(FunctionDecl *D) { } // Mangle in type information for the arguments. - for (FunctionDecl::param_iterator I = D->param_begin(), E = D->param_end(); + for (FunctionDecl::param_const_iterator I = D->param_begin(), + E = D->param_end(); I != E; ++I) { Out << '#'; if (ParmVarDecl *PD = *I) @@ -217,7 +211,7 @@ void USRGenerator::VisitFunctionDecl(FunctionDecl *D) { if (D->isVariadic()) Out << '.'; Out << '#'; - if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(D)) { + if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(D)) { if (MD->isStatic()) Out << 'S'; if (unsigned quals = MD->getTypeQualifiers()) @@ -225,7 +219,7 @@ void USRGenerator::VisitFunctionDecl(FunctionDecl *D) { } } -void USRGenerator::VisitNamedDecl(NamedDecl *D) { +void USRGenerator::VisitNamedDecl(const NamedDecl *D) { VisitDeclContext(D->getDeclContext()); Out << "@"; @@ -238,7 +232,7 @@ void USRGenerator::VisitNamedDecl(NamedDecl *D) { } } -void USRGenerator::VisitVarDecl(VarDecl *D) { +void USRGenerator::VisitVarDecl(const VarDecl *D) { // VarDecls can be declared 'extern' within a function or method body, // but their enclosing DeclContext is the function, not the TU. We need // to check the storage class to correctly generate the USR. @@ -260,17 +254,19 @@ void USRGenerator::VisitVarDecl(VarDecl *D) { Out << '@' << s; } -void USRGenerator::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) { +void USRGenerator::VisitNonTypeTemplateParmDecl( + const NonTypeTemplateParmDecl *D) { GenLoc(D); return; } -void USRGenerator::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) { +void USRGenerator::VisitTemplateTemplateParmDecl( + const TemplateTemplateParmDecl *D) { GenLoc(D); return; } -void USRGenerator::VisitNamespaceDecl(NamespaceDecl *D) { +void USRGenerator::VisitNamespaceDecl(const NamespaceDecl *D) { if (D->isAnonymousNamespace()) { Out << "@aN"; return; @@ -281,29 +277,29 @@ void USRGenerator::VisitNamespaceDecl(NamespaceDecl *D) { Out << "@N@" << D->getName(); } -void USRGenerator::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) { +void USRGenerator::VisitFunctionTemplateDecl(const FunctionTemplateDecl *D) { VisitFunctionDecl(D->getTemplatedDecl()); } -void USRGenerator::VisitClassTemplateDecl(ClassTemplateDecl *D) { +void USRGenerator::VisitClassTemplateDecl(const ClassTemplateDecl *D) { VisitTagDecl(D->getTemplatedDecl()); } -void USRGenerator::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) { +void USRGenerator::VisitNamespaceAliasDecl(const NamespaceAliasDecl *D) { VisitDeclContext(D->getDeclContext()); if (!IgnoreResults) Out << "@NA@" << D->getName(); } -void USRGenerator::VisitObjCMethodDecl(ObjCMethodDecl *D) { - DeclContext *container = D->getDeclContext(); - if (ObjCProtocolDecl *pd = dyn_cast<ObjCProtocolDecl>(container)) { +void USRGenerator::VisitObjCMethodDecl(const ObjCMethodDecl *D) { + const DeclContext *container = D->getDeclContext(); + if (const ObjCProtocolDecl *pd = dyn_cast<ObjCProtocolDecl>(container)) { Visit(pd); } else { // The USR for a method declared in a class extension or category is based on // the ObjCInterfaceDecl, not the ObjCCategoryDecl. - ObjCInterfaceDecl *ID = D->getClassInterface(); + const ObjCInterfaceDecl *ID = D->getClassInterface(); if (!ID) { IgnoreResults = true; return; @@ -318,7 +314,7 @@ void USRGenerator::VisitObjCMethodDecl(ObjCMethodDecl *D) { N.printName(Out); } -void USRGenerator::VisitObjCContainerDecl(ObjCContainerDecl *D) { +void USRGenerator::VisitObjCContainerDecl(const ObjCContainerDecl *D) { switch (D->getKind()) { default: llvm_unreachable("Invalid ObjC container."); @@ -327,8 +323,8 @@ void USRGenerator::VisitObjCContainerDecl(ObjCContainerDecl *D) { GenObjCClass(D->getName()); break; case Decl::ObjCCategory: { - ObjCCategoryDecl *CD = cast<ObjCCategoryDecl>(D); - ObjCInterfaceDecl *ID = CD->getClassInterface(); + const ObjCCategoryDecl *CD = cast<ObjCCategoryDecl>(D); + const ObjCInterfaceDecl *ID = CD->getClassInterface(); if (!ID) { // Handle invalid code where the @interface might not // have been specified. @@ -349,8 +345,8 @@ void USRGenerator::VisitObjCContainerDecl(ObjCContainerDecl *D) { break; } case Decl::ObjCCategoryImpl: { - ObjCCategoryImplDecl *CD = cast<ObjCCategoryImplDecl>(D); - ObjCInterfaceDecl *ID = CD->getClassInterface(); + const ObjCCategoryImplDecl *CD = cast<ObjCCategoryImplDecl>(D); + const ObjCInterfaceDecl *ID = CD->getClassInterface(); if (!ID) { // Handle invalid code where the @interface might not // have been specified. @@ -368,17 +364,17 @@ void USRGenerator::VisitObjCContainerDecl(ObjCContainerDecl *D) { } } -void USRGenerator::VisitObjCPropertyDecl(ObjCPropertyDecl *D) { +void USRGenerator::VisitObjCPropertyDecl(const ObjCPropertyDecl *D) { // The USR for a property declared in a class extension or category is based // on the ObjCInterfaceDecl, not the ObjCCategoryDecl. - if (ObjCInterfaceDecl *ID = Context->getObjContainingInterface(D)) + if (const ObjCInterfaceDecl *ID = Context->getObjContainingInterface(D)) Visit(ID); else Visit(cast<Decl>(D->getDeclContext())); GenObjCProperty(D->getName()); } -void USRGenerator::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) { +void USRGenerator::VisitObjCPropertyImplDecl(const ObjCPropertyImplDecl *D) { if (ObjCPropertyDecl *PD = D->getPropertyDecl()) { VisitObjCPropertyDecl(PD); return; @@ -387,7 +383,7 @@ void USRGenerator::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) { IgnoreResults = true; } -void USRGenerator::VisitTagDecl(TagDecl *D) { +void USRGenerator::VisitTagDecl(const TagDecl *D) { // Add the location of the tag decl to handle resolution across // translation units. if (ShouldGenerateLocation(D) && GenLoc(D)) @@ -397,7 +393,7 @@ void USRGenerator::VisitTagDecl(TagDecl *D) { VisitDeclContext(D->getDeclContext()); bool AlreadyStarted = false; - if (CXXRecordDecl *CXXRecord = dyn_cast<CXXRecordDecl>(D)) { + if (const CXXRecordDecl *CXXRecord = dyn_cast<CXXRecordDecl>(D)) { if (ClassTemplateDecl *ClassTmpl = CXXRecord->getDescribedClassTemplate()) { AlreadyStarted = true; @@ -409,7 +405,7 @@ void USRGenerator::VisitTagDecl(TagDecl *D) { case TTK_Enum: llvm_unreachable("enum template"); } VisitTemplateParameterList(ClassTmpl->getTemplateParameters()); - } else if (ClassTemplatePartialSpecializationDecl *PartialSpec + } else if (const ClassTemplatePartialSpecializationDecl *PartialSpec = dyn_cast<ClassTemplatePartialSpecializationDecl>(CXXRecord)) { AlreadyStarted = true; @@ -449,7 +445,7 @@ void USRGenerator::VisitTagDecl(TagDecl *D) { } // For a class template specialization, mangle the template arguments. - if (ClassTemplateSpecializationDecl *Spec + if (const ClassTemplateSpecializationDecl *Spec = dyn_cast<ClassTemplateSpecializationDecl>(D)) { const TemplateArgumentList &Args = Spec->getTemplateInstantiationArgs(); Out << '>'; @@ -460,17 +456,17 @@ void USRGenerator::VisitTagDecl(TagDecl *D) { } } -void USRGenerator::VisitTypedefDecl(TypedefDecl *D) { +void USRGenerator::VisitTypedefDecl(const TypedefDecl *D) { if (ShouldGenerateLocation(D) && GenLoc(D)) return; - DeclContext *DC = D->getDeclContext(); - if (NamedDecl *DCN = dyn_cast<NamedDecl>(DC)) + const DeclContext *DC = D->getDeclContext(); + if (const NamedDecl *DCN = dyn_cast<NamedDecl>(DC)) Visit(DCN); Out << "@T@"; Out << D->getName(); } -void USRGenerator::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) { +void USRGenerator::VisitTemplateTypeParmDecl(const TemplateTypeParmDecl *D) { GenLoc(D); return; } @@ -593,6 +589,14 @@ void USRGenerator::VisitType(QualType T) { #define PLACEHOLDER_TYPE(Id, SingletonId) case BuiltinType::Id: #include "clang/AST/BuiltinTypes.def" case BuiltinType::Dependent: + case BuiltinType::OCLImage1d: + case BuiltinType::OCLImage1dArray: + case BuiltinType::OCLImage1dBuffer: + case BuiltinType::OCLImage2d: + case BuiltinType::OCLImage2dArray: + case BuiltinType::OCLImage3d: + case BuiltinType::OCLEvent: + case BuiltinType::OCLSampler: IgnoreResults = true; return; case BuiltinType::ObjCId: @@ -806,7 +810,7 @@ bool cxcursor::getDeclCursorUSR(const Decl *D, SmallVectorImpl<char> &Buf) { return true; USRGenerator UG(&D->getASTContext(), &Buf); - UG->Visit(const_cast<Decl*>(D)); + UG->Visit(D); if (UG->ignoreResults()) return true; @@ -820,22 +824,22 @@ CXString clang_getCursorUSR(CXCursor C) { const CXCursorKind &K = clang_getCursorKind(C); if (clang_isDeclaration(K)) { - Decl *D = cxcursor::getCursorDecl(C); + const Decl *D = cxcursor::getCursorDecl(C); if (!D) - return createCXString(""); + return cxstring::createEmpty(); CXTranslationUnit TU = cxcursor::getCursorTU(C); if (!TU) - return createCXString(""); + return cxstring::createEmpty(); - CXStringBuf *buf = cxstring::getCXStringBuf(TU); + cxstring::CXStringBuf *buf = cxstring::getCXStringBuf(TU); if (!buf) - return createCXString(""); + return cxstring::createEmpty(); bool Ignore = cxcursor::getDeclCursorUSR(D, buf->Data); if (Ignore) { - disposeCXStringBuf(buf); - return createCXString(""); + buf->dispose(); + return cxstring::createEmpty(); } // Return the C-string, but don't make a copy since it is already in @@ -847,11 +851,11 @@ CXString clang_getCursorUSR(CXCursor C) { if (K == CXCursor_MacroDefinition) { CXTranslationUnit TU = cxcursor::getCursorTU(C); if (!TU) - return createCXString(""); + return cxstring::createEmpty(); - CXStringBuf *buf = cxstring::getCXStringBuf(TU); + cxstring::CXStringBuf *buf = cxstring::getCXStringBuf(TU); if (!buf) - return createCXString(""); + return cxstring::createEmpty(); { USRGenerator UG(&cxcursor::getCursorASTUnit(C)->getASTContext(), @@ -863,14 +867,14 @@ CXString clang_getCursorUSR(CXCursor C) { return createCXString(buf); } - return createCXString(""); + return cxstring::createEmpty(); } CXString clang_constructUSR_ObjCIvar(const char *name, CXString classUSR) { USRGenerator UG; UG << extractUSRSuffix(clang_getCString(classUSR)); UG->GenObjCIvar(name); - return createCXString(UG.str(), true); + return cxstring::createDup(UG.str()); } CXString clang_constructUSR_ObjCMethod(const char *name, @@ -879,26 +883,26 @@ CXString clang_constructUSR_ObjCMethod(const char *name, USRGenerator UG; UG << extractUSRSuffix(clang_getCString(classUSR)); UG->GenObjCMethod(name, isInstanceMethod); - return createCXString(UG.str(), true); + return cxstring::createDup(UG.str()); } CXString clang_constructUSR_ObjCClass(const char *name) { USRGenerator UG; UG->GenObjCClass(name); - return createCXString(UG.str(), true); + return cxstring::createDup(UG.str()); } CXString clang_constructUSR_ObjCProtocol(const char *name) { USRGenerator UG; UG->GenObjCProtocol(name); - return createCXString(UG.str(), true); + return cxstring::createDup(UG.str()); } CXString clang_constructUSR_ObjCCategory(const char *class_name, const char *category_name) { USRGenerator UG; UG->GenObjCCategory(class_name, category_name); - return createCXString(UG.str(), true); + return cxstring::createDup(UG.str()); } CXString clang_constructUSR_ObjCProperty(const char *property, @@ -906,7 +910,7 @@ CXString clang_constructUSR_ObjCProperty(const char *property, USRGenerator UG; UG << extractUSRSuffix(clang_getCString(classUSR)); UG->GenObjCProperty(property); - return createCXString(UG.str(), true); + return cxstring::createDup(UG.str()); } } // end extern "C" |