//===-- 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"
#include "lldb/Utility/StringPool.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 StringPool::GetSystemPool().InternNonEmpty(
        lang_plugin->GetThrowKeyword());
  return nullptr;
}

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