Mercurial > hg > CbC > CbC_llvm
diff clang-tools-extra/clangd/AST.cpp @ 221:79ff65ed7e25
LLVM12 Original
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 15 Jun 2021 19:15:29 +0900 |
parents | 0572611fdcc8 |
children | c4bab56944e8 |
line wrap: on
line diff
--- a/clang-tools-extra/clangd/AST.cpp Tue Jun 15 19:13:43 2021 +0900 +++ b/clang-tools-extra/clangd/AST.cpp Tue Jun 15 19:15:29 2021 +0900 @@ -116,6 +116,7 @@ if (auto *TD = llvm::dyn_cast<TagDecl>(CurContext)) { // There can't be any more tag parents after hitting a namespace. assert(!ReachedNS); + (void)ReachedNS; NNS = NestedNameSpecifier::Create(Context, nullptr, false, TD->getTypeForDecl()); } else { @@ -258,7 +259,7 @@ // TemplateArgumentTypeLocs, they only have TemplateArgumentTypes. So we // create a new argument location list from TypeSourceInfo. auto STL = TSI->getTypeLoc().getAs<TemplateSpecializationTypeLoc>(); - llvm::SmallVector<TemplateArgumentLoc, 8> ArgLocs; + llvm::SmallVector<TemplateArgumentLoc> ArgLocs; ArgLocs.reserve(STL.getNumArgs()); for (unsigned I = 0; I < STL.getNumArgs(); ++I) ArgLocs.push_back(STL.getArgLoc(I)); @@ -282,37 +283,90 @@ return ""; } -llvm::Optional<SymbolID> getSymbolID(const Decl *D) { +static llvm::StringRef +getNameOrErrForObjCInterface(const ObjCInterfaceDecl *ID) { + return ID ? ID->getName() : "<<error-type>>"; +} + +std::string printObjCMethod(const ObjCMethodDecl &Method) { + std::string Name; + llvm::raw_string_ostream OS(Name); + + OS << (Method.isInstanceMethod() ? '-' : '+') << '['; + + // Should always be true. + if (const ObjCContainerDecl *C = + dyn_cast<ObjCContainerDecl>(Method.getDeclContext())) + OS << printObjCContainer(*C); + + Method.getSelector().print(OS << ' '); + if (Method.isVariadic()) + OS << ", ..."; + + OS << ']'; + OS.flush(); + return Name; +} + +std::string printObjCContainer(const ObjCContainerDecl &C) { + if (const ObjCCategoryDecl *Category = dyn_cast<ObjCCategoryDecl>(&C)) { + std::string Name; + llvm::raw_string_ostream OS(Name); + const ObjCInterfaceDecl *Class = Category->getClassInterface(); + OS << getNameOrErrForObjCInterface(Class) << '(' << Category->getName() + << ')'; + OS.flush(); + return Name; + } + if (const ObjCCategoryImplDecl *CID = dyn_cast<ObjCCategoryImplDecl>(&C)) { + std::string Name; + llvm::raw_string_ostream OS(Name); + const ObjCInterfaceDecl *Class = CID->getClassInterface(); + OS << getNameOrErrForObjCInterface(Class) << '(' << CID->getName() << ')'; + OS.flush(); + return Name; + } + return C.getNameAsString(); +} + +SymbolID getSymbolID(const Decl *D) { llvm::SmallString<128> USR; if (index::generateUSRForDecl(D, USR)) - return None; + return {}; return SymbolID(USR); } -llvm::Optional<SymbolID> getSymbolID(const llvm::StringRef MacroName, - const MacroInfo *MI, - const SourceManager &SM) { +SymbolID getSymbolID(const llvm::StringRef MacroName, const MacroInfo *MI, + const SourceManager &SM) { if (MI == nullptr) - return None; + return {}; llvm::SmallString<128> USR; if (index::generateUSRForMacro(MacroName, MI->getDefinitionLoc(), SM, USR)) - return None; + return {}; return SymbolID(USR); } -// FIXME: This should be handled while printing underlying decls instead. std::string printType(const QualType QT, const DeclContext &CurContext) { std::string Result; llvm::raw_string_ostream OS(Result); - auto Decls = explicitReferenceTargets( - ast_type_traits::DynTypedNode::create(QT), DeclRelation::Alias); - if (!Decls.empty()) - OS << getQualification(CurContext.getParentASTContext(), &CurContext, - Decls.front(), - /*VisibleNamespaces=*/llvm::ArrayRef<std::string>{}); PrintingPolicy PP(CurContext.getParentASTContext().getPrintingPolicy()); - PP.SuppressScope = true; PP.SuppressTagKeyword = true; + PP.SuppressUnwrittenScope = true; + + class PrintCB : public PrintingCallbacks { + public: + PrintCB(const DeclContext *CurContext) : CurContext(CurContext) {} + virtual ~PrintCB() {} + virtual bool isScopeVisible(const DeclContext *DC) const override { + return DC->Encloses(CurContext); + } + + private: + const DeclContext *CurContext; + }; + PrintCB PCB(&CurContext); + PP.Callbacks = &PCB; + QT.print(OS, PP); return OS.str(); } @@ -351,8 +405,7 @@ return true; if (auto *AT = D->getType()->getContainedAutoType()) { - if (!AT->getDeducedType().isNull()) - DeducedType = AT->getDeducedType(); + DeducedType = AT->desugar(); } return true; } @@ -369,7 +422,7 @@ // Loc of auto in return type (c++14). auto CurLoc = D->getReturnTypeSourceRange().getBegin(); // Loc of "auto" in operator auto() - if (CurLoc.isInvalid() && dyn_cast<CXXConversionDecl>(D)) + if (CurLoc.isInvalid() && isa<CXXConversionDecl>(D)) CurLoc = D->getTypeSourceInfo()->getTypeLoc().getBeginLoc(); // Loc of "auto" in function with trailing return type (c++11). if (CurLoc.isInvalid()) @@ -471,5 +524,14 @@ return VD && !VD->getType().isNull() && VD->getType()->isUndeducedType(); } +bool isDeeplyNested(const Decl *D, unsigned MaxDepth) { + size_t ContextDepth = 0; + for (auto *Ctx = D->getDeclContext(); Ctx && !Ctx->isTranslationUnit(); + Ctx = Ctx->getParent()) { + if (++ContextDepth == MaxDepth) + return true; + } + return false; +} } // namespace clangd } // namespace clang