//===-- SBLanguageRuntime.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/API/SBLanguageRuntime.h"
#include "lldb/Target/Language.h"
#include "lldb/Utility/Instrumentation.h"

using namespace lldb;
using namespace lldb_private;

lldb::LanguageType
SBLanguageRuntime::GetLanguageTypeFromString(const char *string) {
  LLDB_INSTRUMENT_VA(string);

  return Language::GetLanguageTypeFromString(llvm::StringRef(string));
}

const char *
SBLanguageRuntime::GetNameForLanguageType(lldb::LanguageType language) {
  LLDB_INSTRUMENT_VA(language);

  return Language::GetNameForLanguageType(language);
}

bool SBLanguageRuntime::LanguageIsCPlusPlus(lldb::LanguageType language) {
  return Language::LanguageIsCPlusPlus(language);
}

bool SBLanguageRuntime::LanguageIsObjC(lldb::LanguageType language) {
  return Language::LanguageIsObjC(language);
}

bool SBLanguageRuntime::LanguageIsCFamily(lldb::LanguageType language) {
  return Language::LanguageIsCFamily(language);
}

bool SBLanguageRuntime::SupportsExceptionBreakpointsOnThrow(
    lldb::LanguageType language) {
  if (Language *lang_plugin = Language::FindPlugin(language))
    return lang_plugin->SupportsExceptionBreakpointsOnThrow();
  return false;
}

bool SBLanguageRuntime::SupportsExceptionBreakpointsOnCatch(
    lldb::LanguageType language) {
  if (Language *lang_plugin = Language::FindPlugin(language))
    return lang_plugin->SupportsExceptionBreakpointsOnCatch();
  return false;
}

const char *
SBLanguageRuntime::GetThrowKeywordForLanguage(lldb::LanguageType language) {
  if (Language *lang_plugin = Language::FindPlugin(language))
    return ConstString(lang_plugin->GetThrowKeyword()).AsCString(nullptr);
  return nullptr;
}

const char *
SBLanguageRuntime::GetCatchKeywordForLanguage(lldb::LanguageType language) {
  if (Language *lang_plugin = Language::FindPlugin(language))
    return ConstString(lang_plugin->GetCatchKeyword()).AsCString(nullptr);
  return nullptr;
}
