167a1deaaSJan Korous //===--- FileIndexRecord.cpp - Index data per file --------------*- C++ -*-===// 2edbbe470SJan Korous // 3c874dd53SChristopher Di Bella // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4c874dd53SChristopher Di Bella // See https://llvm.org/LICENSE.txt for license information. 5c874dd53SChristopher Di Bella // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6edbbe470SJan Korous // 7edbbe470SJan Korous //===----------------------------------------------------------------------===// 8edbbe470SJan Korous 9edbbe470SJan Korous #include "FileIndexRecord.h" 10edbbe470SJan Korous #include "clang/AST/ASTContext.h" 11edbbe470SJan Korous #include "clang/AST/DeclTemplate.h" 1286565c13SReid Kleckner #include "clang/Basic/SourceManager.h" 13edbbe470SJan Korous #include "llvm/ADT/SmallString.h" 14edbbe470SJan Korous #include "llvm/Support/Path.h" 15edbbe470SJan Korous 16edbbe470SJan Korous using namespace clang; 17edbbe470SJan Korous using namespace clang::index; 18edbbe470SJan Korous 19773ad55aSBen Langmuir ArrayRef<DeclOccurrence> 20773ad55aSBen Langmuir FileIndexRecord::getDeclOccurrencesSortedByOffset() const { 21773ad55aSBen Langmuir if (!IsSorted) { 22773ad55aSBen Langmuir llvm::stable_sort(Decls, 23773ad55aSBen Langmuir [](const DeclOccurrence &A, const DeclOccurrence &B) { 24773ad55aSBen Langmuir return A.Offset < B.Offset; 25773ad55aSBen Langmuir }); 26773ad55aSBen Langmuir IsSorted = true; 2793c87fc0SBen Langmuir } 28773ad55aSBen Langmuir return Decls; 2993c87fc0SBen Langmuir } 3093c87fc0SBen Langmuir 31edbbe470SJan Korous void FileIndexRecord::addDeclOccurence(SymbolRoleSet Roles, unsigned Offset, 32edbbe470SJan Korous const Decl *D, 33edbbe470SJan Korous ArrayRef<SymbolRelation> Relations) { 34edbbe470SJan Korous assert(D->isCanonicalDecl() && 35edbbe470SJan Korous "Occurrences should be associated with their canonical decl"); 36773ad55aSBen Langmuir IsSorted = false; 37773ad55aSBen Langmuir Decls.emplace_back(Roles, Offset, D, Relations); 38edbbe470SJan Korous } 39edbbe470SJan Korous 4093c87fc0SBen Langmuir void FileIndexRecord::addMacroOccurence(SymbolRoleSet Roles, unsigned Offset, 4193c87fc0SBen Langmuir const IdentifierInfo *Name, 4293c87fc0SBen Langmuir const MacroInfo *MI) { 43773ad55aSBen Langmuir IsSorted = false; 44773ad55aSBen Langmuir Decls.emplace_back(Roles, Offset, Name, MI); 45edbbe470SJan Korous } 46edbbe470SJan Korous 4793c87fc0SBen Langmuir void FileIndexRecord::removeHeaderGuardMacros() { 482febc32cSKazu Hirata llvm::erase_if(Decls, [](const DeclOccurrence &D) { 4993c87fc0SBen Langmuir if (const auto *MI = D.DeclOrMacro.dyn_cast<const MacroInfo *>()) 5093c87fc0SBen Langmuir return MI->isUsedForHeaderGuard(); 5193c87fc0SBen Langmuir return false; 5293c87fc0SBen Langmuir }); 5393c87fc0SBen Langmuir } 5493c87fc0SBen Langmuir 5593c87fc0SBen Langmuir void FileIndexRecord::print(llvm::raw_ostream &OS, SourceManager &SM) const { 56edbbe470SJan Korous OS << "DECLS BEGIN ---\n"; 57edbbe470SJan Korous for (auto &DclInfo : Decls) { 58*186d6546SKazu Hirata if (const auto *D = dyn_cast<const Decl *>(DclInfo.DeclOrMacro)) { 59edbbe470SJan Korous SourceLocation Loc = SM.getFileLoc(D->getLocation()); 60edbbe470SJan Korous PresumedLoc PLoc = SM.getPresumedLoc(Loc); 6193c87fc0SBen Langmuir OS << llvm::sys::path::filename(PLoc.getFilename()) << ':' 6293c87fc0SBen Langmuir << PLoc.getLine() << ':' << PLoc.getColumn(); 63edbbe470SJan Korous 6493c87fc0SBen Langmuir if (const auto *ND = dyn_cast<NamedDecl>(D)) { 6519701458SBruno Ricci OS << ' ' << ND->getDeclName(); 66edbbe470SJan Korous } 6793c87fc0SBen Langmuir } else { 6802dd73a5SKazu Hirata const auto *MI = cast<const MacroInfo *>(DclInfo.DeclOrMacro); 6993c87fc0SBen Langmuir SourceLocation Loc = SM.getFileLoc(MI->getDefinitionLoc()); 7093c87fc0SBen Langmuir PresumedLoc PLoc = SM.getPresumedLoc(Loc); 7193c87fc0SBen Langmuir OS << llvm::sys::path::filename(PLoc.getFilename()) << ':' 7293c87fc0SBen Langmuir << PLoc.getLine() << ':' << PLoc.getColumn(); 7393c87fc0SBen Langmuir OS << ' ' << DclInfo.MacroName->getName(); 7493c87fc0SBen Langmuir } 75edbbe470SJan Korous 76edbbe470SJan Korous OS << '\n'; 77edbbe470SJan Korous } 78edbbe470SJan Korous OS << "DECLS END ---\n"; 79edbbe470SJan Korous } 80