1 //===--- FileIndexRecord.cpp - Index data per file --------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "FileIndexRecord.h" 10 #include "clang/AST/ASTContext.h" 11 #include "clang/AST/DeclTemplate.h" 12 #include "clang/Basic/SourceManager.h" 13 #include "llvm/ADT/SmallString.h" 14 #include "llvm/Support/Path.h" 15 16 using namespace clang; 17 using namespace clang::index; 18 19 ArrayRef<DeclOccurrence> 20 FileIndexRecord::getDeclOccurrencesSortedByOffset() const { 21 if (!IsSorted) { 22 llvm::stable_sort(Decls, 23 [](const DeclOccurrence &A, const DeclOccurrence &B) { 24 return A.Offset < B.Offset; 25 }); 26 IsSorted = true; 27 } 28 return Decls; 29 } 30 31 void FileIndexRecord::addDeclOccurence(SymbolRoleSet Roles, unsigned Offset, 32 const Decl *D, 33 ArrayRef<SymbolRelation> Relations) { 34 assert(D->isCanonicalDecl() && 35 "Occurrences should be associated with their canonical decl"); 36 IsSorted = false; 37 Decls.emplace_back(Roles, Offset, D, Relations); 38 } 39 40 void FileIndexRecord::addMacroOccurence(SymbolRoleSet Roles, unsigned Offset, 41 const IdentifierInfo *Name, 42 const MacroInfo *MI) { 43 IsSorted = false; 44 Decls.emplace_back(Roles, Offset, Name, MI); 45 } 46 47 void FileIndexRecord::removeHeaderGuardMacros() { 48 auto It = 49 std::remove_if(Decls.begin(), Decls.end(), [](const DeclOccurrence &D) { 50 if (const auto *MI = D.DeclOrMacro.dyn_cast<const MacroInfo *>()) 51 return MI->isUsedForHeaderGuard(); 52 return false; 53 }); 54 Decls.erase(It, Decls.end()); 55 } 56 57 void FileIndexRecord::print(llvm::raw_ostream &OS, SourceManager &SM) const { 58 OS << "DECLS BEGIN ---\n"; 59 for (auto &DclInfo : Decls) { 60 if (const auto *D = DclInfo.DeclOrMacro.dyn_cast<const Decl *>()) { 61 SourceLocation Loc = SM.getFileLoc(D->getLocation()); 62 PresumedLoc PLoc = SM.getPresumedLoc(Loc); 63 OS << llvm::sys::path::filename(PLoc.getFilename()) << ':' 64 << PLoc.getLine() << ':' << PLoc.getColumn(); 65 66 if (const auto *ND = dyn_cast<NamedDecl>(D)) { 67 OS << ' ' << ND->getDeclName(); 68 } 69 } else { 70 const auto *MI = DclInfo.DeclOrMacro.get<const MacroInfo *>(); 71 SourceLocation Loc = SM.getFileLoc(MI->getDefinitionLoc()); 72 PresumedLoc PLoc = SM.getPresumedLoc(Loc); 73 OS << llvm::sys::path::filename(PLoc.getFilename()) << ':' 74 << PLoc.getLine() << ':' << PLoc.getColumn(); 75 OS << ' ' << DclInfo.MacroName->getName(); 76 } 77 78 OS << '\n'; 79 } 80 OS << "DECLS END ---\n"; 81 } 82