clang  12.0.0git
FileIndexRecord.cpp
Go to the documentation of this file.
1 //===--- FileIndexRecord.cpp - Index data per file --------------*- C++ -*-===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "FileIndexRecord.h"
11 #include "clang/AST/ASTContext.h"
12 #include "clang/AST/DeclTemplate.h"
14 #include "llvm/ADT/SmallString.h"
15 #include "llvm/Support/Path.h"
16 
17 using namespace clang;
18 using namespace clang::index;
19 
21  const Decl *D,
22  ArrayRef<SymbolRelation> Relations) {
23  assert(D->isCanonicalDecl() &&
24  "Occurrences should be associated with their canonical decl");
25 
26  auto IsNextOccurence = [&]() -> bool {
27  if (Decls.empty())
28  return true;
29  auto &Last = Decls.back();
30  return Last.Offset < Offset;
31  };
32 
33  if (IsNextOccurence()) {
34  Decls.emplace_back(Roles, Offset, D, Relations);
35  return;
36  }
37 
38  DeclOccurrence NewInfo(Roles, Offset, D, Relations);
39  // We keep Decls in order as we need to access them in this order in all cases.
40  auto It = llvm::upper_bound(Decls, NewInfo);
41  Decls.insert(It, std::move(NewInfo));
42 }
43 
44 void FileIndexRecord::print(llvm::raw_ostream &OS) const {
45  OS << "DECLS BEGIN ---\n";
46  for (auto &DclInfo : Decls) {
47  const Decl *D = DclInfo.Dcl;
49  SourceLocation Loc = SM.getFileLoc(D->getLocation());
50  PresumedLoc PLoc = SM.getPresumedLoc(Loc);
51  OS << llvm::sys::path::filename(PLoc.getFilename()) << ':' << PLoc.getLine()
52  << ':' << PLoc.getColumn();
53 
54  if (auto ND = dyn_cast<NamedDecl>(D)) {
55  OS << ' ' << ND->getNameAsString();
56  }
57 
58  OS << '\n';
59  }
60  OS << "DECLS END ---\n";
61 }
Defines the clang::ASTContext interface.
Defines the SourceManager interface.
Decl - This represents one declaration (or definition), e.g.
Definition: DeclBase.h:89
Defines the C++ template declaration subclasses.
void print(llvm::raw_ostream &OS) const
unsigned SymbolRoleSet
Definition: IndexSymbol.h:130
unsigned Offset
Definition: Format.cpp:2020
bool isCanonicalDecl() const
Whether this particular Decl is a canonical one.
Definition: DeclBase.h:907
unsigned getLine() const
Return the presumed line number of this location.
Represents an unpacked "presumed" location which can be presented to the user.
#define SM(sm)
Definition: Cuda.cpp:62
const char * getFilename() const
Return the presumed filename of this location.
unsigned getColumn() const
Return the presumed column number of this location.
Encodes a location in the source.
ASTContext & getASTContext() const LLVM_READONLY
Definition: DeclBase.cpp:414
SourceLocation getFileLoc(SourceLocation Loc) const
Given Loc, if it is a macro location return the expansion location or the spelling location...
void addDeclOccurence(SymbolRoleSet Roles, unsigned Offset, const Decl *D, ArrayRef< SymbolRelation > Relations)
Adds an occurrence of the canonical declaration D at the supplied Offset.
Dataflow Directional Tag Classes.
PresumedLoc getPresumedLoc(SourceLocation Loc, bool UseLineDirectives=true) const
Returns the "presumed" location of a SourceLocation specifies.
SourceManager & getSourceManager()
Definition: ASTContext.h:619
This class handles loading and caching of source files into memory.
SourceLocation getLocation() const
Definition: DeclBase.h:430