//===-- ScriptInterpreterNone.cpp -------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "ScriptInterpreterNone.h"
#include "lldb/Core/Debugger.h"
#include "lldb/Core/PluginManager.h"
#include "lldb/Core/Stream.h"
#include "lldb/Core/StreamFile.h"
#include "lldb/Core/StringList.h"
#include "lldb/Interpreter/CommandInterpreter.h"

#include <mutex>

using namespace lldb;
using namespace lldb_private;

ScriptInterpreterNone::ScriptInterpreterNone(CommandInterpreter &interpreter)
    : ScriptInterpreter(interpreter, eScriptLanguageNone)
{
}

ScriptInterpreterNone::~ScriptInterpreterNone()
{
}

bool
ScriptInterpreterNone::ExecuteOneLine(const char *command, CommandReturnObject *, const ExecuteScriptOptions &)
{
    m_interpreter.GetDebugger().GetErrorFile()->PutCString(
        "error: there is no embedded script interpreter in this mode.\n");
    return false;
}

void
ScriptInterpreterNone::ExecuteInterpreterLoop()
{
    m_interpreter.GetDebugger().GetErrorFile()->PutCString(
        "error: there is no embedded script interpreter in this mode.\n");
}

void
ScriptInterpreterNone::Initialize()
{
    static std::once_flag g_once_flag;

    std::call_once(g_once_flag, []()
                   {
                       PluginManager::RegisterPlugin(GetPluginNameStatic(), GetPluginDescriptionStatic(),
                                                     lldb::eScriptLanguageNone, CreateInstance);
                   });
}

void
ScriptInterpreterNone::Terminate()
{
}

lldb::ScriptInterpreterSP
ScriptInterpreterNone::CreateInstance(CommandInterpreter &interpreter)
{
    return std::make_shared<ScriptInterpreterNone>(interpreter);
}

lldb_private::ConstString
ScriptInterpreterNone::GetPluginNameStatic()
{
    static ConstString g_name("script-none");
    return g_name;
}

const char *
ScriptInterpreterNone::GetPluginDescriptionStatic()
{
    return "Null script interpreter";
}

lldb_private::ConstString
ScriptInterpreterNone::GetPluginName()
{
    return GetPluginNameStatic();
}

uint32_t
ScriptInterpreterNone::GetPluginVersion()
{
    return 1;
}
