79 lines
2.7 KiB
C++
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_
|