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

#include "lldb/Core/Mangled.h"
#include "lldb/Interpreter/CommandReturnObject.h"

using namespace lldb;
using namespace lldb_private;

CommandObjectCPlusPlusDemangle::CommandObjectCPlusPlusDemangle(
    CommandInterpreter &interpreter)
    : CommandObjectParsed(interpreter, "demangle",
                          "Demangle a C++ mangled name.",
                          "language cplusplus demangle [<mangled-name> ...]") {
  AddSimpleArgumentList(eArgTypeSymbol, eArgRepeatPlus);
}

void CommandObjectCPlusPlusDemangle::DoExecute(Args &command,
                                               CommandReturnObject &result) {
  bool demangled_any = false;
  bool error_any = false;
  for (auto &entry : command.entries()) {
    if (entry.ref().empty())
      continue;

    // the actual Mangled class should be strict about this, but on the
    // command line if you're copying mangled names out of 'nm' on Darwin,
    // they will come out with an extra underscore - be willing to strip this
    // on behalf of the user.   This is the moral equivalent of the -_/-n
    // options to c++filt
    auto name = entry.ref();
    if (name.starts_with("__Z"))
      name = name.drop_front();

    Mangled mangled(name);
    if (mangled.GuessLanguage() == lldb::eLanguageTypeC_plus_plus) {
      ConstString demangled(mangled.GetDisplayDemangledName());
      demangled_any = true;
      result.AppendMessageWithFormatv("{0} ---> {1}", entry.c_str(),
                                      demangled.GetCString());
    } else {
      error_any = true;
      result.AppendErrorWithFormat("%s is not a valid C++ mangled name\n",
                                   entry.ref().str().c_str());
    }
  }

  result.SetStatus(
      error_any ? lldb::eReturnStatusFailed
                : (demangled_any ? lldb::eReturnStatusSuccessFinishResult
                                 : lldb::eReturnStatusSuccessFinishNoResult));
}

CommandObjectCPlusPlus::CommandObjectCPlusPlus(CommandInterpreter &interpreter)
    : CommandObjectMultiword(
          interpreter, "cplusplus",
          "Commands for operating on the C++ language runtime.",
          "cplusplus <subcommand> [<subcommand-options>]") {
  LoadSubCommand("demangle", CommandObjectSP(new CommandObjectCPlusPlusDemangle(
                                 interpreter)));
}
