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(Range&: Decls, |
23 | C: [](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(args&: Roles, args&: Offset, args&: D, args&: 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(args&: Roles, args&: Offset, args&: Name, args&: MI); |
45 | } |
46 | |
47 | void FileIndexRecord::() { |
48 | llvm::erase_if(C&: Decls, P: [](const DeclOccurrence &D) { |
49 | if (const auto *MI = D.DeclOrMacro.dyn_cast<const MacroInfo *>()) |
50 | return MI->isUsedForHeaderGuard(); |
51 | return false; |
52 | }); |
53 | } |
54 | |
55 | void FileIndexRecord::print(llvm::raw_ostream &OS, SourceManager &SM) const { |
56 | OS << "DECLS BEGIN ---\n" ; |
57 | for (auto &DclInfo : Decls) { |
58 | if (const auto *D = DclInfo.DeclOrMacro.dyn_cast<const Decl *>()) { |
59 | SourceLocation Loc = SM.getFileLoc(Loc: D->getLocation()); |
60 | PresumedLoc PLoc = SM.getPresumedLoc(Loc); |
61 | OS << llvm::sys::path::filename(path: PLoc.getFilename()) << ':' |
62 | << PLoc.getLine() << ':' << PLoc.getColumn(); |
63 | |
64 | if (const auto *ND = dyn_cast<NamedDecl>(Val: D)) { |
65 | OS << ' ' << ND->getDeclName(); |
66 | } |
67 | } else { |
68 | const auto *MI = DclInfo.DeclOrMacro.get<const MacroInfo *>(); |
69 | SourceLocation Loc = SM.getFileLoc(Loc: MI->getDefinitionLoc()); |
70 | PresumedLoc PLoc = SM.getPresumedLoc(Loc); |
71 | OS << llvm::sys::path::filename(path: PLoc.getFilename()) << ':' |
72 | << PLoc.getLine() << ':' << PLoc.getColumn(); |
73 | OS << ' ' << DclInfo.MacroName->getName(); |
74 | } |
75 | |
76 | OS << '\n'; |
77 | } |
78 | OS << "DECLS END ---\n" ; |
79 | } |
80 | |