//===--- Types.h - Data structures for used-symbol analysis -------- C++-*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // Find referenced files is mostly a matter of translating: // AST Node => declaration => source location => file // // clang has types for these (DynTypedNode, Decl, SourceLocation, FileID), but // there are special cases: macros are not declarations, the concrete file where // a standard library symbol was defined doesn't matter, etc. // // We define some slightly more abstract sum types to handle these cases while // keeping the API clean. For example, Symbol may be a Decl AST node, a macro, // or a recognized standard library symbol. // //===----------------------------------------------------------------------===// #ifndef CLANG_INCLUDE_CLEANER_TYPES_H #define CLANG_INCLUDE_CLEANER_TYPES_H #include "clang/Basic/FileEntry.h" #include "clang/Basic/SourceLocation.h" #include "clang/Tooling/Inclusions/StandardLibrary.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/DenseMapInfoVariant.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringMap.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/StringSet.h" #include <memory> #include <string> #include <utility> #include <variant> #include <vector> namespace llvm { class raw_ostream; } // namespace llvm namespace clang { class Decl; class IdentifierInfo; namespace include_cleaner { /// We consider a macro to be a different symbol each time it is defined. struct Macro { … }; /// An entity that can be referenced in the code. struct Symbol { … }; llvm::raw_ostream &operator<<(llvm::raw_ostream &, const Symbol &); /// Indicates the relation between the reference and the target. enum class RefType { … }; llvm::raw_ostream &operator<<(llvm::raw_ostream &, RefType); /// Indicates that a piece of code refers to a symbol. struct SymbolReference { … }; llvm::raw_ostream &operator<<(llvm::raw_ostream &, const SymbolReference &); /// Represents a file that provides some symbol. Might not be includeable, e.g. /// built-in or main-file itself. struct Header { … }; llvm::raw_ostream &operator<<(llvm::raw_ostream &, const Header &); /// A single #include directive written in the main file. struct Include { … }; llvm::raw_ostream &operator<<(llvm::raw_ostream &, const Include &); /// A container for all includes present in a file. /// Supports efficiently hit-testing Headers against Includes. class Includes { … }; } // namespace include_cleaner } // namespace clang namespace llvm { template <> struct DenseMapInfo<clang::include_cleaner::Symbol> { … }; template <> struct DenseMapInfo<clang::include_cleaner::Macro> { … }; template <> struct DenseMapInfo<clang::include_cleaner::Header> { … }; } // namespace llvm #endif