xref: /llvm-project/clang/lib/Index/FileIndexRecord.cpp (revision 186d6546d9c5898a0a32f4616558021d9a908786)
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