xref: /llvm-project/clang-tools-extra/include-cleaner/include/clang-include-cleaner/IncludeSpeller.h (revision b735c66da9c9ae752b88941d466895a0b696c75e)
190c5fe98SViktoriia Bakalova //===--- IncludeSpeller.h - Spelling strategies for headers.-------- C++-*-===//
290c5fe98SViktoriia Bakalova //
390c5fe98SViktoriia Bakalova // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
490c5fe98SViktoriia Bakalova // See https://llvm.org/LICENSE.txt for license information.
590c5fe98SViktoriia Bakalova // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
690c5fe98SViktoriia Bakalova //
790c5fe98SViktoriia Bakalova //===----------------------------------------------------------------------===//
890c5fe98SViktoriia Bakalova // An extension point to let applications introduce custom spelling
990c5fe98SViktoriia Bakalova // strategies for physical headers.
1090c5fe98SViktoriia Bakalova //===----------------------------------------------------------------------===//
1190c5fe98SViktoriia Bakalova 
1290c5fe98SViktoriia Bakalova #ifndef CLANG_INCLUDE_CLEANER_INCLUDESPELLER_H
1390c5fe98SViktoriia Bakalova #define CLANG_INCLUDE_CLEANER_INCLUDESPELLER_H
1490c5fe98SViktoriia Bakalova 
1590c5fe98SViktoriia Bakalova #include "clang-include-cleaner/Types.h"
1690c5fe98SViktoriia Bakalova #include "clang/Lex/HeaderSearch.h"
1790c5fe98SViktoriia Bakalova #include "llvm/Support/Registry.h"
1890c5fe98SViktoriia Bakalova #include <string>
1990c5fe98SViktoriia Bakalova 
2090c5fe98SViktoriia Bakalova namespace clang::include_cleaner {
2190c5fe98SViktoriia Bakalova 
2290c5fe98SViktoriia Bakalova /// IncludeSpeller provides an extension point to allow clients implement
2390c5fe98SViktoriia Bakalova /// custom include spelling strategies for physical headers.
2490c5fe98SViktoriia Bakalova class IncludeSpeller {
2590c5fe98SViktoriia Bakalova public:
2690c5fe98SViktoriia Bakalova   /// Provides the necessary information for custom spelling computations.
2790c5fe98SViktoriia Bakalova   struct Input {
2890c5fe98SViktoriia Bakalova     const Header &H;
2990c5fe98SViktoriia Bakalova     const HeaderSearch &HS;
3090c5fe98SViktoriia Bakalova     const FileEntry *Main;
3190c5fe98SViktoriia Bakalova   };
3290c5fe98SViktoriia Bakalova   virtual ~IncludeSpeller() = default;
3390c5fe98SViktoriia Bakalova 
3490c5fe98SViktoriia Bakalova   /// Takes in an `Input` struct with necessary infos about a header and
3590c5fe98SViktoriia Bakalova   /// returns a verbatim include spelling (with angles/quotes) or an empty
3690c5fe98SViktoriia Bakalova   /// string to indicate no customizations are needed.
3790c5fe98SViktoriia Bakalova   virtual std::string operator()(const Input &Input) const = 0;
3890c5fe98SViktoriia Bakalova };
3990c5fe98SViktoriia Bakalova 
4090c5fe98SViktoriia Bakalova using IncludeSpellingStrategy = llvm::Registry<IncludeSpeller>;
4190c5fe98SViktoriia Bakalova 
4290c5fe98SViktoriia Bakalova /// Generates a spelling for the header in the `Input` that can be directly
4390c5fe98SViktoriia Bakalova /// included in the main file. When the `Input` specifies a physical header,
4490c5fe98SViktoriia Bakalova /// prefers the spelling provided by custom llvm strategies, if any.
4590c5fe98SViktoriia Bakalova /// Otherwise, uses header search info to generate shortest spelling.
4690c5fe98SViktoriia Bakalova std::string spellHeader(const IncludeSpeller::Input &Input);
4790c5fe98SViktoriia Bakalova } // namespace clang::include_cleaner
4890c5fe98SViktoriia Bakalova 
49*b735c66dSThomas Fransham namespace llvm {
50*b735c66dSThomas Fransham extern template class Registry<clang::include_cleaner::IncludeSpeller>;
51*b735c66dSThomas Fransham } // namespace llvm
52*b735c66dSThomas Fransham 
5390c5fe98SViktoriia Bakalova #endif
54