diff options
author | Jan Korous <jkorous@apple.com> | 2019-02-27 21:47:40 +0000 |
---|---|---|
committer | Jan Korous <jkorous@apple.com> | 2019-02-27 21:47:40 +0000 |
commit | edbbe470f66dec90e336e7c2f2f34ddca070ac22 (patch) | |
tree | 74d25101dfb0a8f9ba0da92f6590848835513795 /clang/lib/Index/FileIndexRecord.cpp | |
parent | f33b1f49b76adb79b3483a13cff69f18a6c4f28e (diff) | |
download | bcm5719-llvm-edbbe470f66dec90e336e7c2f2f34ddca070ac22.tar.gz bcm5719-llvm-edbbe470f66dec90e336e7c2f2f34ddca070ac22.zip |
[clang][index-while-building] FileIndexRecord
Basic data structures for index
Tests are missing from this patch - will be covered properly by tests for the whole feature.
I'm just trying to split into smaller patches to make it easier for reviewers.
Differential Revision: https://reviews.llvm.org/D58478
llvm-svn: 355035
Diffstat (limited to 'clang/lib/Index/FileIndexRecord.cpp')
-rw-r--r-- | clang/lib/Index/FileIndexRecord.cpp | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/clang/lib/Index/FileIndexRecord.cpp b/clang/lib/Index/FileIndexRecord.cpp new file mode 100644 index 00000000000..05dd2cd262a --- /dev/null +++ b/clang/lib/Index/FileIndexRecord.cpp @@ -0,0 +1,59 @@ +//===--- FileIndexRecord.cpp - Index data per file ------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "FileIndexRecord.h" +#include "clang/AST/ASTContext.h" +#include "clang/AST/DeclTemplate.h" +#include "llvm/ADT/SmallString.h" +#include "llvm/Support/Path.h" + +using namespace clang; +using namespace clang::index; + +void FileIndexRecord::addDeclOccurence(SymbolRoleSet Roles, unsigned Offset, + const Decl *D, + ArrayRef<SymbolRelation> Relations) { + assert(D->isCanonicalDecl() && + "Occurrences should be associated with their canonical decl"); + + auto IsNextOccurence = [&]() -> bool { + if (Decls.empty()) + return true; + auto &Last = Decls.back(); + return Last.Offset < Offset; + }; + + if (IsNextOccurence()) { + Decls.emplace_back(Roles, Offset, D, Relations); + return; + } + + DeclOccurrence NewInfo(Roles, Offset, D, Relations); + auto It = std::upper_bound(Decls.begin(), Decls.end(), NewInfo); + Decls.insert(It, std::move(NewInfo)); +} + +void FileIndexRecord::print(llvm::raw_ostream &OS) const { + OS << "DECLS BEGIN ---\n"; + for (auto &DclInfo : Decls) { + auto D = DclInfo.Dcl; + SourceManager &SM = D->getASTContext().getSourceManager(); + SourceLocation Loc = SM.getFileLoc(D->getLocation()); + PresumedLoc PLoc = SM.getPresumedLoc(Loc); + OS << llvm::sys::path::filename(PLoc.getFilename()) << ':' << PLoc.getLine() + << ':' << PLoc.getColumn(); + + if (auto ND = dyn_cast<NamedDecl>(D)) { + OS << ' ' << ND->getNameAsString(); + } + + OS << '\n'; + } + OS << "DECLS END ---\n"; +} |