84 lines · c
1//===--- IncludeCleaner.h - Unused/Missing Headers Analysis -----*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8///9/// \file10/// Include Cleaner is clangd functionality for providing diagnostics for misuse11/// of transitive headers and unused includes. It is inspired by12/// Include-What-You-Use tool (https://include-what-you-use.org/). Our goal is13/// to provide useful warnings in most popular scenarios but not 1:1 exact14/// feature compatibility.15///16//===----------------------------------------------------------------------===//17 18#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_INCLUDECLEANER_H19#define LLVM_CLANG_TOOLS_EXTRA_CLANGD_INCLUDECLEANER_H20 21#include "Diagnostics.h"22#include "Headers.h"23#include "ParsedAST.h"24#include "Protocol.h"25#include "clang-include-cleaner/Types.h"26#include "clang/Basic/SourceManager.h"27#include "clang/Tooling/Syntax/Tokens.h"28#include "llvm/ADT/ArrayRef.h"29#include "llvm/ADT/StringRef.h"30#include <functional>31#include <optional>32#include <string>33#include <tuple>34#include <vector>35 36namespace clang {37namespace clangd {38 39// Data needed for missing include diagnostics.40struct MissingIncludeDiagInfo {41 include_cleaner::Symbol Symbol;42 syntax::FileRange SymRefRange;43 std::vector<include_cleaner::Header> Providers;44 45 bool operator==(const MissingIncludeDiagInfo &Other) const {46 return std::tie(SymRefRange, Providers, Symbol) ==47 std::tie(Other.SymRefRange, Other.Providers, Other.Symbol);48 }49};50 51struct IncludeCleanerFindings {52 std::vector<const Inclusion *> UnusedIncludes;53 std::vector<MissingIncludeDiagInfo> MissingIncludes;54};55 56IncludeCleanerFindings57computeIncludeCleanerFindings(ParsedAST &AST,58 bool AnalyzeAngledIncludes = false);59 60std::vector<Diag> issueIncludeCleanerDiagnostics(61 ParsedAST &AST, llvm::StringRef Code,62 const IncludeCleanerFindings &Findings, const ThreadsafeFS &TFS,63 HeaderFilter IgnoreHeader = {}, HeaderFilter AngledHeaders = {},64 HeaderFilter QuotedHeaders = {});65 66/// Converts the clangd include representation to include-cleaner67/// include representation.68include_cleaner::Includes convertIncludes(const ParsedAST &);69 70std::vector<include_cleaner::SymbolReference>71collectMacroReferences(ParsedAST &AST);72 73/// Whether this #include is considered to provide a particular symbol.74///75/// This means it satisfies the reference, and no other #include does better.76/// `Providers` is the symbol's candidate headers according to walkUsed().77bool isPreferredProvider(const Inclusion &, const include_cleaner::Includes &,78 llvm::ArrayRef<include_cleaner::Header> Providers);79 80} // namespace clangd81} // namespace clang82 83#endif // LLVM_CLANG_TOOLS_EXTRA_CLANGD_INCLUDECLEANER_H84