167a1deaaSJan Korous //===--- FileIndexRecord.cpp - Index data per file --------------*- C++ -*-===//
2edbbe470SJan Korous //
3*c874dd53SChristopher Di Bella // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*c874dd53SChristopher Di Bella // See https://llvm.org/LICENSE.txt for license information.
5*c874dd53SChristopher 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>
getDeclOccurrencesSortedByOffset() const20773ad55aSBen 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
addDeclOccurence(SymbolRoleSet Roles,unsigned Offset,const Decl * D,ArrayRef<SymbolRelation> Relations)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
addMacroOccurence(SymbolRoleSet Roles,unsigned Offset,const IdentifierInfo * Name,const MacroInfo * MI)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
removeHeaderGuardMacros()4793c87fc0SBen Langmuir void FileIndexRecord::removeHeaderGuardMacros() {
4893c87fc0SBen Langmuir auto It =
4993c87fc0SBen Langmuir std::remove_if(Decls.begin(), Decls.end(), [](const DeclOccurrence &D) {
5093c87fc0SBen Langmuir if (const auto *MI = D.DeclOrMacro.dyn_cast<const MacroInfo *>())
5193c87fc0SBen Langmuir return MI->isUsedForHeaderGuard();
5293c87fc0SBen Langmuir return false;
5393c87fc0SBen Langmuir });
5493c87fc0SBen Langmuir Decls.erase(It, Decls.end());
5593c87fc0SBen Langmuir }
5693c87fc0SBen Langmuir
print(llvm::raw_ostream & OS,SourceManager & SM) const5793c87fc0SBen Langmuir void FileIndexRecord::print(llvm::raw_ostream &OS, SourceManager &SM) const {
58edbbe470SJan Korous OS << "DECLS BEGIN ---\n";
59edbbe470SJan Korous for (auto &DclInfo : Decls) {
6093c87fc0SBen Langmuir if (const auto *D = DclInfo.DeclOrMacro.dyn_cast<const Decl *>()) {
61edbbe470SJan Korous SourceLocation Loc = SM.getFileLoc(D->getLocation());
62edbbe470SJan Korous PresumedLoc PLoc = SM.getPresumedLoc(Loc);
6393c87fc0SBen Langmuir OS << llvm::sys::path::filename(PLoc.getFilename()) << ':'
6493c87fc0SBen Langmuir << PLoc.getLine() << ':' << PLoc.getColumn();
65edbbe470SJan Korous
6693c87fc0SBen Langmuir if (const auto *ND = dyn_cast<NamedDecl>(D)) {
6719701458SBruno Ricci OS << ' ' << ND->getDeclName();
68edbbe470SJan Korous }
6993c87fc0SBen Langmuir } else {
7093c87fc0SBen Langmuir const auto *MI = DclInfo.DeclOrMacro.get<const MacroInfo *>();
7193c87fc0SBen Langmuir SourceLocation Loc = SM.getFileLoc(MI->getDefinitionLoc());
7293c87fc0SBen Langmuir PresumedLoc PLoc = SM.getPresumedLoc(Loc);
7393c87fc0SBen Langmuir OS << llvm::sys::path::filename(PLoc.getFilename()) << ':'
7493c87fc0SBen Langmuir << PLoc.getLine() << ':' << PLoc.getColumn();
7593c87fc0SBen Langmuir OS << ' ' << DclInfo.MacroName->getName();
7693c87fc0SBen Langmuir }
77edbbe470SJan Korous
78edbbe470SJan Korous OS << '\n';
79edbbe470SJan Korous }
80edbbe470SJan Korous OS << "DECLS END ---\n";
81edbbe470SJan Korous }
82