forked from OSchip/llvm-project
[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
This commit is contained in:
parent
f33b1f49b7
commit
edbbe470f6
clang
|
@ -0,0 +1,42 @@
|
|||
//===--- DeclOccurrence.h - An occurrence of a decl within a file ---------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_CLANG_INDEX_DECLOCCURRENCE_H
|
||||
#define LLVM_CLANG_INDEX_DECLOCCURRENCE_H
|
||||
|
||||
#include "clang/Basic/LLVM.h"
|
||||
#include "clang/Index/IndexSymbol.h"
|
||||
#include "llvm/ADT/ArrayRef.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
|
||||
namespace clang {
|
||||
class Decl;
|
||||
|
||||
namespace index {
|
||||
|
||||
struct DeclOccurrence {
|
||||
SymbolRoleSet Roles;
|
||||
unsigned Offset;
|
||||
const Decl *Dcl;
|
||||
SmallVector<SymbolRelation, 3> Relations;
|
||||
|
||||
DeclOccurrence(SymbolRoleSet R, unsigned Offset, const Decl *D,
|
||||
ArrayRef<SymbolRelation> Relations)
|
||||
: Roles(R), Offset(Offset), Dcl(D),
|
||||
Relations(Relations.begin(), Relations.end()) {}
|
||||
|
||||
friend bool operator<(const DeclOccurrence &LHS, const DeclOccurrence &RHS) {
|
||||
return LHS.Offset < RHS.Offset;
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace index
|
||||
} // namespace clang
|
||||
|
||||
#endif
|
|
@ -6,6 +6,7 @@ set(LLVM_LINK_COMPONENTS
|
|||
add_clang_library(clangIndex
|
||||
CodegenNameGenerator.cpp
|
||||
CommentToXML.cpp
|
||||
FileIndexRecord.cpp
|
||||
IndexBody.cpp
|
||||
IndexDecl.cpp
|
||||
IndexingAction.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";
|
||||
}
|
|
@ -0,0 +1,58 @@
|
|||
//===--- FileIndexRecord.h - 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.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_CLANG_LIB_INDEX_FILEINDEXRECORD_H
|
||||
#define LLVM_CLANG_LIB_INDEX_FILEINDEXRECORD_H
|
||||
|
||||
#include "clang/Basic/SourceLocation.h"
|
||||
#include "clang/Index/DeclOccurrence.h"
|
||||
#include "clang/Index/IndexSymbol.h"
|
||||
#include "llvm/ADT/ArrayRef.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include <vector>
|
||||
|
||||
namespace clang {
|
||||
class IdentifierInfo;
|
||||
|
||||
namespace index {
|
||||
|
||||
/// Stores the declaration occurrences seen in a particular source or header
|
||||
/// file of a translation unit
|
||||
class FileIndexRecord {
|
||||
private:
|
||||
FileID FID;
|
||||
bool IsSystem;
|
||||
std::vector<DeclOccurrence> Decls;
|
||||
|
||||
public:
|
||||
FileIndexRecord(FileID FID, bool IsSystem) : FID(FID), IsSystem(IsSystem) {}
|
||||
|
||||
ArrayRef<DeclOccurrence> getDeclOccurrencesSortedByOffset() const {
|
||||
return Decls;
|
||||
}
|
||||
|
||||
FileID getFileID() const { return FID; }
|
||||
bool isSystem() const { return IsSystem; }
|
||||
|
||||
/// Adds an occurrence of the canonical declaration \c D at the supplied
|
||||
/// \c Offset
|
||||
///
|
||||
/// \param Roles the roles the occurrence fulfills in this position.
|
||||
/// \param Offset the offset in the file of this occurrence.
|
||||
/// \param D the canonical declaration this is an occurrence of.
|
||||
/// \param Relations the set of symbols related to this occurrence.
|
||||
void addDeclOccurence(SymbolRoleSet Roles, unsigned Offset, const Decl *D,
|
||||
ArrayRef<SymbolRelation> Relations);
|
||||
void print(llvm::raw_ostream &OS) const;
|
||||
};
|
||||
|
||||
} // end namespace index
|
||||
} // end namespace clang
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue