//===--- iwyu_lexer_utils.h - clang-lexer utilities for iwyu --------------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef INCLUDE_WHAT_YOU_USE_IWYU_LEXER_UTILS_H_ #define INCLUDE_WHAT_YOU_USE_IWYU_LEXER_UTILS_H_ #include // for string #include "clang/Basic/SourceLocation.h" namespace clang { class SourceManager; class Token; } // namespace clang namespace include_what_you_use { using std::string; // For a particular source line that source_location points to, // returns true if the given text occurs on the line. // (Case sensitive.) bool LineHasText(clang::SourceLocation source_location, llvm::StringRef text); // Interface to get character data from a SourceLocation. This allows // tests to avoid constructing a SourceManager yet still allow iwyu to // get the character data from SourceLocations. class CharacterDataGetterInterface { public: virtual ~CharacterDataGetterInterface() = default; virtual const char* GetCharacterData(clang::SourceLocation loc) const = 0; }; // Implementation of CharacterDataGetterInterface that uses a SourceManager. class SourceManagerCharacterDataGetter : public CharacterDataGetterInterface { public: explicit SourceManagerCharacterDataGetter( const clang::SourceManager& source_manager); const char* GetCharacterData(clang::SourceLocation loc) const override; private: const clang::SourceManager& source_manager_; }; // Returns the source-code line from the current location until \n. llvm::StringRef GetSourceTextUntilEndOfLine( clang::SourceLocation start_loc, const CharacterDataGetterInterface& data_getter); // Returns the location right *after* the first occurrence of needle // after start_loc, if any. (If none, returns an invalid source-loc.) // start_loc must be a valid source location. clang::SourceLocation GetLocationAfter( clang::SourceLocation start_loc, const string& needle, const CharacterDataGetterInterface& data_getter); // Returns the include-name as written, including <>'s and ""'s. // Resolved computed includes first, so given // #define INC // #include INC // If include_loc points to the second INC, we'll return ''. string GetIncludeNameAsWritten( clang::SourceLocation include_loc, const CharacterDataGetterInterface& data_getter); // Get the text of a given token. string GetTokenText(const clang::Token& token, const CharacterDataGetterInterface& data_getter); } // namespace include_what_you_use #endif // INCLUDE_WHAT_YOU_USE_IWYU_LEXER_UTILS_H_