190c5fe98SViktoriia Bakalova //===--- IncludeSpeller.cpp------------------------------------------------===// 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 990c5fe98SViktoriia Bakalova #include "clang-include-cleaner/IncludeSpeller.h" 1090c5fe98SViktoriia Bakalova #include "clang-include-cleaner/Types.h" 1190c5fe98SViktoriia Bakalova #include "llvm/ADT/SmallVector.h" 12d5297b72Skadir çetinkaya #include "llvm/ADT/StringRef.h" 1390c5fe98SViktoriia Bakalova #include "llvm/Support/ErrorHandling.h" 1490c5fe98SViktoriia Bakalova #include "llvm/Support/Registry.h" 1590c5fe98SViktoriia Bakalova #include <memory> 1690c5fe98SViktoriia Bakalova #include <string> 1790c5fe98SViktoriia Bakalova 1890c5fe98SViktoriia Bakalova LLVM_INSTANTIATE_REGISTRY(clang::include_cleaner::IncludeSpellingStrategy) 1990c5fe98SViktoriia Bakalova 2090c5fe98SViktoriia Bakalova namespace clang::include_cleaner { 2190c5fe98SViktoriia Bakalova namespace { 2290c5fe98SViktoriia Bakalova 2390c5fe98SViktoriia Bakalova // Fallback strategy to default spelling via header search. 2490c5fe98SViktoriia Bakalova class DefaultIncludeSpeller : public IncludeSpeller { 2590c5fe98SViktoriia Bakalova public: operator ()(const Input & Input) const2690c5fe98SViktoriia Bakalova std::string operator()(const Input &Input) const override { 27ab4e4613SSam McCall switch (Input.H.kind()) { 28ab4e4613SSam McCall case Header::Standard: 29ab4e4613SSam McCall return Input.H.standard().name().str(); 30ab4e4613SSam McCall case Header::Verbatim: 31ab4e4613SSam McCall return Input.H.verbatim().str(); 32ab4e4613SSam McCall case Header::Physical: 339fe632baSDavid Goldman bool IsAngled = false; 34d5297b72Skadir çetinkaya std::string WorkingDir; 35d5297b72Skadir çetinkaya if (auto WD = Input.HS.getFileMgr() 36d5297b72Skadir çetinkaya .getVirtualFileSystem() 37d5297b72Skadir çetinkaya .getCurrentWorkingDirectory()) 38d5297b72Skadir çetinkaya WorkingDir = *WD; 3990c5fe98SViktoriia Bakalova std::string FinalSpelling = Input.HS.suggestPathToFileForDiagnostics( 40*e7b4b437SKadir Cetinkaya Input.H.physical().getName(), WorkingDir, 41*e7b4b437SKadir Cetinkaya Input.Main->tryGetRealPathName(), &IsAngled); 429fe632baSDavid Goldman return IsAngled ? "<" + FinalSpelling + ">" : "\"" + FinalSpelling + "\""; 4390c5fe98SViktoriia Bakalova } 44b0fd2fd8SSimon Pilgrim llvm_unreachable("Unknown clang::include_cleaner::Header::Kind enum"); 45ab4e4613SSam McCall } 4690c5fe98SViktoriia Bakalova }; 4790c5fe98SViktoriia Bakalova 48ab4e4613SSam McCall } // namespace 49ab4e4613SSam McCall spellHeader(const IncludeSpeller::Input & Input)50ab4e4613SSam McCallstd::string spellHeader(const IncludeSpeller::Input &Input) { 51ab4e4613SSam McCall static auto *Spellers = [] { 52ab4e4613SSam McCall auto *Result = 53ab4e4613SSam McCall new llvm::SmallVector<std::unique_ptr<include_cleaner::IncludeSpeller>>; 5490c5fe98SViktoriia Bakalova for (const auto &Strategy : 5590c5fe98SViktoriia Bakalova include_cleaner::IncludeSpellingStrategy::entries()) 56ab4e4613SSam McCall Result->push_back(Strategy.instantiate()); 57ab4e4613SSam McCall Result->push_back(std::make_unique<DefaultIncludeSpeller>()); 5890c5fe98SViktoriia Bakalova return Result; 5990c5fe98SViktoriia Bakalova }(); 6090c5fe98SViktoriia Bakalova 6190c5fe98SViktoriia Bakalova std::string Spelling; 62ab4e4613SSam McCall for (const auto &Speller : *Spellers) { 6390c5fe98SViktoriia Bakalova Spelling = (*Speller)(Input); 6490c5fe98SViktoriia Bakalova if (!Spelling.empty()) 6590c5fe98SViktoriia Bakalova break; 6690c5fe98SViktoriia Bakalova } 6790c5fe98SViktoriia Bakalova return Spelling; 6890c5fe98SViktoriia Bakalova } 6990c5fe98SViktoriia Bakalova 7090c5fe98SViktoriia Bakalova } // namespace clang::include_cleaner 71