//===-- Highlighter.cpp ---------------------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//

#include "lldb/Core/Highlighter.h"

#include "lldb/Target/Language.h"
#include "lldb/Utility/AnsiTerminal.h"
#include "lldb/Utility/StreamString.h"
#include <optional>

using namespace lldb_private;
using namespace lldb_private::ansi;

void HighlightStyle::ColorStyle::Apply(Stream &s, llvm::StringRef value) const {
  s << m_prefix << value << m_suffix;
}

void HighlightStyle::ColorStyle::Set(llvm::StringRef prefix,
                                     llvm::StringRef suffix) {
  m_prefix = FormatAnsiTerminalCodes(prefix);
  m_suffix = FormatAnsiTerminalCodes(suffix);
}

static HighlightStyle::ColorStyle GetColor(const char *c) {
  return HighlightStyle::ColorStyle(c, "${ansi.normal}");
}

HighlightStyle HighlightStyle::MakeVimStyle() {
  HighlightStyle result;
  result.comment = GetColor("${ansi.fg.purple}");
  result.scalar_literal = GetColor("${ansi.fg.red}");
  result.keyword = GetColor("${ansi.fg.green}");
  return result;
}

const Highlighter &
HighlighterManager::getHighlighterFor(lldb::LanguageType language_type,
                                      llvm::StringRef path) const {
  // The language may be able to provide a language type based on the path.
  if (Language *language =
          lldb_private::Language::FindPlugin(language_type, path))
    language_type = language->GetLanguageType();

  std::lock_guard<std::mutex> guard(m_mutex);
  auto it = m_highlighters.find(language_type);
  if (it != m_highlighters.end())
    return *it->second;

  for (auto create_instance : PluginManager::GetHighlighterCreateCallbacks()) {
    if (Highlighter *highlighter = create_instance(language_type))
      m_highlighters.try_emplace(language_type,
                                 std::unique_ptr<Highlighter>(highlighter));
  }

  assert(m_highlighters.contains(language_type) &&
         "we should always find the default highlighter");
  return *m_highlighters[language_type];
}

std::string Highlighter::Highlight(const HighlightStyle &options,
                                   llvm::StringRef line,
                                   std::optional<size_t> cursor_pos,
                                   llvm::StringRef previous_lines) const {
  StreamString s;
  Highlight(options, line, cursor_pos, previous_lines, s);
  s.Flush();
  return s.GetString().str();
}
