clang 20.0.0 (based on r547379) from build 12806354. Bug: http://b/379133546 Test: N/A Change-Id: I2eb8938af55d809de674be63cb30cf27e801862b Upstream-Commit: ad834e67b1105d15ef907f6255d4c96e8e733f57
158 lines
5.5 KiB
C++
158 lines
5.5 KiB
C++
//===-- Highlighter.h -------------------------------------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLDB_CORE_HIGHLIGHTER_H
|
|
#define LLDB_CORE_HIGHLIGHTER_H
|
|
|
|
#include <optional>
|
|
#include <utility>
|
|
#include <vector>
|
|
|
|
#include "lldb/Utility/Stream.h"
|
|
#include "lldb/lldb-enumerations.h"
|
|
#include "llvm/ADT/StringRef.h"
|
|
|
|
namespace lldb_private {
|
|
|
|
/// Represents style that the highlighter should apply to the given source code.
|
|
/// Stores information about how every kind of token should be annotated.
|
|
struct HighlightStyle {
|
|
|
|
/// A pair of strings that should be placed around a certain token. Usually
|
|
/// stores color codes in these strings (the suffix string is often used for
|
|
/// resetting the terminal attributes back to normal).
|
|
class ColorStyle {
|
|
std::string m_prefix;
|
|
std::string m_suffix;
|
|
|
|
public:
|
|
ColorStyle() = default;
|
|
ColorStyle(llvm::StringRef prefix, llvm::StringRef suffix) {
|
|
Set(prefix, suffix);
|
|
}
|
|
|
|
/// Applies this style to the given value.
|
|
/// \param s
|
|
/// The stream to which the result should be appended.
|
|
/// \param value
|
|
/// The value that we should place our strings around.
|
|
void Apply(Stream &s, llvm::StringRef value) const;
|
|
|
|
/// Sets the prefix and suffix strings.
|
|
void Set(llvm::StringRef prefix, llvm::StringRef suffix);
|
|
};
|
|
|
|
/// The style for the token which is below the cursor of the user. Note that
|
|
/// this style is overwritten by the SourceManager with the values of
|
|
/// stop-show-column-ansi-prefix/stop-show-column-ansi-suffix.
|
|
ColorStyle selected;
|
|
|
|
/// Matches identifiers to variable or functions.
|
|
ColorStyle identifier;
|
|
/// Matches any string or character literals in the language: "foo" or 'f'
|
|
ColorStyle string_literal;
|
|
/// Matches scalar value literals like '42' or '0.1'.
|
|
ColorStyle scalar_literal;
|
|
/// Matches all reserved keywords in the language.
|
|
ColorStyle keyword;
|
|
/// Matches any comments in the language.
|
|
ColorStyle comment;
|
|
/// Matches commas: ','
|
|
ColorStyle comma;
|
|
/// Matches one colon: ':'
|
|
ColorStyle colon;
|
|
/// Matches any semicolon: ';'
|
|
ColorStyle semicolons;
|
|
/// Matches operators like '+', '-', '%', '&', '='
|
|
ColorStyle operators;
|
|
|
|
/// Matches '{' or '}'
|
|
ColorStyle braces;
|
|
/// Matches '[' or ']'
|
|
ColorStyle square_brackets;
|
|
/// Matches '(' or ')'
|
|
ColorStyle parentheses;
|
|
|
|
// C language specific options
|
|
|
|
/// Matches directives to a preprocessor (if the language has any).
|
|
ColorStyle pp_directive;
|
|
|
|
/// Returns a HighlightStyle that is based on vim's default highlight style.
|
|
static HighlightStyle MakeVimStyle();
|
|
};
|
|
|
|
/// Annotates source code with color attributes.
|
|
class Highlighter {
|
|
public:
|
|
Highlighter() = default;
|
|
virtual ~Highlighter() = default;
|
|
Highlighter(const Highlighter &) = delete;
|
|
const Highlighter &operator=(const Highlighter &) = delete;
|
|
|
|
/// Returns a human readable name for the selected highlighter.
|
|
virtual llvm::StringRef GetName() const = 0;
|
|
|
|
/// Highlights the given line
|
|
/// \param options
|
|
/// The highlight options.
|
|
/// \param line
|
|
/// The user supplied line that needs to be highlighted.
|
|
/// \param cursor_pos
|
|
/// The cursor position of the user in this line, starting at 0 (which
|
|
/// means the cursor is on the first character in 'line').
|
|
/// \param previous_lines
|
|
/// Any previous lines the user has written which we should only use
|
|
/// for getting the context of the Highlighting right.
|
|
/// \param s
|
|
/// The stream to which the highlighted version of the user string should
|
|
/// be written.
|
|
virtual void Highlight(const HighlightStyle &options, llvm::StringRef line,
|
|
std::optional<size_t> cursor_pos,
|
|
llvm::StringRef previous_lines, Stream &s) const = 0;
|
|
|
|
/// Utility method for calling Highlight without a stream.
|
|
std::string Highlight(const HighlightStyle &options, llvm::StringRef line,
|
|
std::optional<size_t> cursor_pos,
|
|
llvm::StringRef previous_lines = "") const;
|
|
};
|
|
|
|
/// A default highlighter that only highlights the user cursor, but doesn't
|
|
/// do any other highlighting.
|
|
class DefaultHighlighter : public Highlighter {
|
|
public:
|
|
llvm::StringRef GetName() const override { return "none"; }
|
|
|
|
void Highlight(const HighlightStyle &options, llvm::StringRef line,
|
|
std::optional<size_t> cursor_pos,
|
|
llvm::StringRef previous_lines, Stream &s) const override;
|
|
};
|
|
|
|
/// Manages the available highlighters.
|
|
class HighlighterManager {
|
|
DefaultHighlighter m_default;
|
|
|
|
public:
|
|
/// Queries all known highlighter for one that can highlight some source code.
|
|
/// \param language_type
|
|
/// The language type that the caller thinks the source code was given in.
|
|
/// \param path
|
|
/// The path to the file the source code is from. Used as a fallback when
|
|
/// the user can't provide a language.
|
|
/// \return
|
|
/// The highlighter that wants to highlight the source code. Could be an
|
|
/// empty highlighter that does nothing.
|
|
const Highlighter &getHighlighterFor(lldb::LanguageType language_type,
|
|
llvm::StringRef path) const;
|
|
const Highlighter &getDefaultHighlighter() const { return m_default; }
|
|
};
|
|
|
|
} // namespace lldb_private
|
|
|
|
#endif // LLDB_CORE_HIGHLIGHTER_H
|