//===----------------------------------------------------------------------===//
//
// 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",
                                   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)));
}
