blob: 7a9fc276fcaa7a169ccb2c43c8edfe20bdd147e8 [file] [log] [blame]
//===- ModuleDepCollector.h - Callbacks to collect deps ---------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_CLANG_TOOLING_DEPENDENCY_SCANNING_MODULE_DEP_COLLECTOR_H
#define LLVM_CLANG_TOOLING_DEPENDENCY_SCANNING_MODULE_DEP_COLLECTOR_H
#include "clang/Basic/LLVM.h"
#include "clang/Basic/SourceManager.h"
#include "clang/Frontend/Utils.h"
#include "clang/Lex/HeaderSearch.h"
#include "clang/Lex/PPCallbacks.h"
#include "clang/Serialization/ASTReader.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/StringSet.h"
#include "llvm/Support/raw_ostream.h"
#include <string>
namespace clang {
namespace tooling {
namespace dependencies {
class DependencyConsumer;
struct ModuleDeps {
std::string ModuleName;
std::string ClangModuleMapFile;
std::string ModulePCMPath;
std::string ContextHash;
llvm::StringSet<> FileDeps;
llvm::StringSet<> ClangModuleDeps;
bool ImportedByMainFile = false;
};
class ModuleDepCollector;
class ModuleDepCollectorPP final : public PPCallbacks {
public:
ModuleDepCollectorPP(CompilerInstance &I, ModuleDepCollector &MDC)
: Instance(I), MDC(MDC) {}
void FileChanged(SourceLocation Loc, FileChangeReason Reason,
SrcMgr::CharacteristicKind FileType,
FileID PrevFID) override;
void InclusionDirective(SourceLocation HashLoc, const Token &IncludeTok,
StringRef FileName, bool IsAngled,
CharSourceRange FilenameRange, const FileEntry *File,
StringRef SearchPath, StringRef RelativePath,
const Module *Imported,
SrcMgr::CharacteristicKind FileType) override;
void EndOfMainFile() override;
private:
CompilerInstance &Instance;
ModuleDepCollector &MDC;
llvm::DenseSet<const Module *> DirectDeps;
void handleTopLevelModule(const Module *M);
void addAllSubmoduleDeps(const Module *M, ModuleDeps &MD);
void addModuleDep(const Module *M, ModuleDeps &MD);
void addDirectDependencies(const Module *Mod);
};
class ModuleDepCollector final : public DependencyCollector {
public:
ModuleDepCollector(CompilerInstance &I, DependencyConsumer &C);
void attachToPreprocessor(Preprocessor &PP) override;
void attachToASTReader(ASTReader &R) override;
private:
friend ModuleDepCollectorPP;
CompilerInstance &Instance;
DependencyConsumer &Consumer;
std::string MainFile;
std::string ContextHash;
std::vector<std::string> MainDeps;
std::unordered_map<std::string, ModuleDeps> Deps;
};
} // end namespace dependencies
} // end namespace tooling
} // end namespace clang
#endif // LLVM_CLANG_TOOLING_DEPENDENCY_SCANNING_MODULE_DEP_COLLECTOR_H