include-what-you-use/iwyu_lexer_utils.h

79 lines
2.7 KiB
C++

//===--- 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 <string> // 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 <stdio.h>
// #include INC
// If include_loc points to the second INC, we'll return '<stdio.h>'.
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_