#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_INCLUDECLEANER_H
#define LLVM_CLANG_TOOLS_EXTRA_CLANGD_INCLUDECLEANER_H
#include "Diagnostics.h"
#include "Headers.h"
#include "ParsedAST.h"
#include "Protocol.h"
#include "clang-include-cleaner/Types.h"
#include "clang/Basic/SourceManager.h"
#include "clang/Tooling/Syntax/Tokens.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/StringRef.h"
#include <functional>
#include <optional>
#include <string>
#include <tuple>
#include <vector>
namespace clang {
namespace clangd {
struct MissingIncludeDiagInfo {
include_cleaner::Symbol Symbol;
syntax::FileRange SymRefRange;
std::vector<include_cleaner::Header> Providers;
bool operator==(const MissingIncludeDiagInfo &Other) const {
return std::tie(SymRefRange, Providers, Symbol) ==
std::tie(Other.SymRefRange, Other.Providers, Other.Symbol);
}
};
struct IncludeCleanerFindings {
std::vector<const Inclusion *> UnusedIncludes;
std::vector<MissingIncludeDiagInfo> MissingIncludes;
};
IncludeCleanerFindings
computeIncludeCleanerFindings(ParsedAST &AST,
bool AnalyzeAngledIncludes = false);
using HeaderFilter = llvm::ArrayRef<std::function<bool(llvm::StringRef)>>;
std::vector<Diag>
issueIncludeCleanerDiagnostics(ParsedAST &AST, llvm::StringRef Code,
const IncludeCleanerFindings &Findings,
const ThreadsafeFS &TFS,
HeaderFilter IgnoreHeader = {});
include_cleaner::Includes convertIncludes(const ParsedAST &);
std::vector<include_cleaner::SymbolReference>
collectMacroReferences(ParsedAST &AST);
bool isPreferredProvider(const Inclusion &, const include_cleaner::Includes &,
llvm::ArrayRef<include_cleaner::Header> Providers);
}
}
#endif