9#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_SUPPORT_LOGGER_H
10#define LLVM_CLANG_TOOLS_EXTRA_CLANGD_SUPPORT_LOGGER_H
12#include "llvm/Support/Debug.h"
13#include "llvm/Support/Error.h"
14#include "llvm/Support/FormatAdapters.h"
15#include "llvm/Support/FormatVariadic.h"
33 const llvm::formatv_object_base &Message) = 0;
42template <
typename T> T &&
wrap(T &&V) {
return std::forward<T>(V); }
43inline decltype(fmt_consume(llvm::Error::success()))
wrap(llvm::Error &&V) {
44 return fmt_consume(std::move(V));
46template <
typename... Ts>
49 llvm::formatv(Fmt,
detail::wrap(std::forward<Ts>(Vals))...));
52llvm::Error
error(std::error_code, std::string &&);
61template <
typename... Ts>
void elog(
const char *Fmt, Ts &&... Vals) {
67template <
typename... Ts>
void log(
const char *Fmt, Ts &&... Vals) {
72template <
typename... Ts>
void vlog(
const char *Fmt, Ts &&... Vals) {
78template <
typename... Ts>
79llvm::Error
error(std::error_code EC,
const char *Fmt, Ts &&... Vals) {
82 EC, llvm::formatv(Fmt,
detail::wrap(std::forward<Ts>(Vals))...).str());
85template <
typename... Ts> llvm::Error
error(
const char *Fmt, Ts &&... Vals) {
87 llvm::inconvertibleErrorCode(),
88 llvm::formatv(Fmt,
detail::wrap(std::forward<Ts>(Vals))...).str());
91inline llvm::Error
error(std::error_code EC, std::string Msg) {
95inline llvm::Error
error(std::string Msg) {
96 return detail::error(llvm::inconvertibleErrorCode(), std::move(Msg));
102 DEBUG_WITH_TYPE(::clang::clangd::detail::debugType(__FILE__), \
103 ::clang::clangd::detail::log(Logger::Debug, __VA_ARGS__))
122 : MinLevel(MinLevel), Logs(Logs) {}
126 const llvm::formatv_object_base &Message)
override;
130 llvm::raw_ostream &Logs;
132 std::mutex StreamMutex;
std::string Filename
Filename as a string.
Interface to allow custom logging in clangd.
virtual void log(Level, const char *Fmt, const llvm::formatv_object_base &Message)=0
Implementations of this method must be thread-safe.
virtual ~Logger()=default
Level
The significance or severity of this message.
static char indicator(Level L)
Only one LoggingSession can be active at a time.
LoggingSession & operator=(LoggingSession const &)=delete
LoggingSession(LoggingSession const &)=delete
LoggingSession & operator=(LoggingSession &&)=delete
LoggingSession(LoggingSession &&)=delete
StreamLogger(llvm::raw_ostream &Logs, Logger::Level MinLevel)
void log(Level, const char *Fmt, const llvm::formatv_object_base &Message) override
Write a line to the logging stream.
const char * debugType(const char *Filename)
void logImpl(Logger::Level, const char *Fmt, const llvm::formatv_object_base &)
llvm::Error error(std::error_code, std::string &&)
void log(Logger::Level L, const char *Fmt, Ts &&... Vals)
void vlog(const char *Fmt, Ts &&... Vals)
llvm::Error error(std::error_code EC, const char *Fmt, Ts &&... Vals)
void log(const char *Fmt, Ts &&... Vals)
void elog(const char *Fmt, Ts &&... Vals)
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//