FileIndexRecord.cpp revision 1.1.1.1
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" 13#include "llvm/ADT/SmallString.h" 14#include "llvm/Support/Path.h" 15 16using namespace clang; 17using namespace clang::index; 18 19void FileIndexRecord::addDeclOccurence(SymbolRoleSet Roles, unsigned Offset, 20 const Decl *D, 21 ArrayRef<SymbolRelation> Relations) { 22 assert(D->isCanonicalDecl() && 23 "Occurrences should be associated with their canonical decl"); 24 25 auto IsNextOccurence = [&]() -> bool { 26 if (Decls.empty()) 27 return true; 28 auto &Last = Decls.back(); 29 return Last.Offset < Offset; 30 }; 31 32 if (IsNextOccurence()) { 33 Decls.emplace_back(Roles, Offset, D, Relations); 34 return; 35 } 36 37 DeclOccurrence NewInfo(Roles, Offset, D, Relations); 38 // We keep Decls in order as we need to access them in this order in all cases. 39 auto It = llvm::upper_bound(Decls, NewInfo); 40 Decls.insert(It, std::move(NewInfo)); 41} 42 43void FileIndexRecord::print(llvm::raw_ostream &OS) const { 44 OS << "DECLS BEGIN ---\n"; 45 for (auto &DclInfo : Decls) { 46 const Decl *D = DclInfo.Dcl; 47 SourceManager &SM = D->getASTContext().getSourceManager(); 48 SourceLocation Loc = SM.getFileLoc(D->getLocation()); 49 PresumedLoc PLoc = SM.getPresumedLoc(Loc); 50 OS << llvm::sys::path::filename(PLoc.getFilename()) << ':' << PLoc.getLine() 51 << ':' << PLoc.getColumn(); 52 53 if (auto ND = dyn_cast<NamedDecl>(D)) { 54 OS << ' ' << ND->getNameAsString(); 55 } 56 57 OS << '\n'; 58 } 59 OS << "DECLS END ---\n"; 60} 61