//===----------------------------------------------------------------------===//
//
// 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 "RustLanguage.h"

#include "lldb/Core/Mangled.h"
#include "lldb/Core/PluginManager.h"
#include "lldb/Utility/LLDBLog.h"
#include "lldb/Utility/Log.h"

#include "llvm/Demangle/Demangle.h"

#include <cassert>
#include <cstdlib>

using namespace lldb;
using namespace lldb_private;

LLDB_PLUGIN_DEFINE(RustLanguage)

/// The mangling scheme that this plugin registered.
static Mangled::ManglingScheme g_rust_v0_scheme = Mangled::eManglingSchemeNone;

void RustLanguage::Initialize() {
  PluginManager::RegisterPlugin(GetPluginNameStatic(), "Rust Language",
                                CreateInstance);
  g_rust_v0_scheme = Mangled::RegisterManglingScheme({"_R"}, eLanguageTypeRust);
}

void RustLanguage::Terminate() {
  Mangled::UnregisterManglingScheme(g_rust_v0_scheme);
  PluginManager::UnregisterPlugin(CreateInstance);
}

// Static Functions
Language *RustLanguage::CreateInstance(lldb::LanguageType language) {
  if (language == eLanguageTypeRust)
    return new RustLanguage();
  return nullptr;
}

bool RustLanguage::IsSourceFile(llvm::StringRef file_path) const {
  return file_path.ends_with_insensitive(".rs");
}

Language::DemangledName
RustLanguage::DemangleSymbol(ConstString mangled,
                             Mangled::ManglingScheme scheme,
                             const DemangleOptions &options) const {
  assert(scheme == g_rust_v0_scheme);
  llvm::StringRef mangled_str = mangled.GetStringRef();
  char *demangled_cstr = llvm::rustDemangle(mangled_str);

  if (Log *log = GetLog(LLDBLog::Demangle)) {
    if (demangled_cstr && demangled_cstr[0])
      LLDB_LOG(log, "demangled rustv0: {0} -> \"{1}\"", mangled_str,
               demangled_cstr);
    else
      LLDB_LOG(log, "demangled rustv0: {0} -> error: failed to demangle",
               mangled_str);
  }

  DemangledName demangled;
  if (demangled_cstr) {
    demangled.name = demangled_cstr;
    std::free(demangled_cstr);
  }
  return demangled;
}
