diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp --- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp @@ -70,7 +70,9 @@ // Static Functions Language *CPlusPlusLanguage::CreateInstance(lldb::LanguageType language) { - if (Language::LanguageIsCPlusPlus(language)) + // Use plugin for C++ but not for Objective-C++ (which has its own plugin). + if (Language::LanguageIsCPlusPlus(language) && + language != eLanguageTypeObjC_plus_plus) return new CPlusPlusLanguage(); return nullptr; } diff --git a/lldb/unittests/Language/CLanguages/CLanguagesTest.cpp b/lldb/unittests/Language/CLanguages/CLanguagesTest.cpp new file mode 100644 --- /dev/null +++ b/lldb/unittests/Language/CLanguages/CLanguagesTest.cpp @@ -0,0 +1,46 @@ +//===-- CLanguagesTest.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 "Plugins/Language/CPlusPlus/CPlusPlusLanguage.h" +#include "Plugins/Language/ObjC/ObjCLanguage.h" +#include "Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.h" +#include "TestingSupport/SubsystemRAII.h" +#include "lldb/lldb-enumerations.h" + +#include "gmock/gmock.h" +#include "gtest/gtest.h" + +using namespace lldb_private; + +/// Returns the name of the LLDB plugin for the given language or a null +/// ConstString if there is no fitting plugin. +static ConstString GetPluginName(lldb::LanguageType language) { + Language *language_plugin = Language::FindPlugin(language); + if (language_plugin) + return language_plugin->GetPluginName(); + return ConstString(); +} + +TEST(CLanguages, LookupCLanguagesByLanguageType) { + SubsystemRAII langs; + + // There is no plugin to find for C. + EXPECT_EQ(Language::FindPlugin(lldb::eLanguageTypeC), nullptr); + EXPECT_EQ(Language::FindPlugin(lldb::eLanguageTypeC89), nullptr); + EXPECT_EQ(Language::FindPlugin(lldb::eLanguageTypeC99), nullptr); + EXPECT_EQ(Language::FindPlugin(lldb::eLanguageTypeC11), nullptr); + + EXPECT_EQ(GetPluginName(lldb::eLanguageTypeC_plus_plus), "cplusplus"); + EXPECT_EQ(GetPluginName(lldb::eLanguageTypeC_plus_plus_03), "cplusplus"); + EXPECT_EQ(GetPluginName(lldb::eLanguageTypeC_plus_plus_11), "cplusplus"); + EXPECT_EQ(GetPluginName(lldb::eLanguageTypeC_plus_plus_14), "cplusplus"); + + EXPECT_EQ(GetPluginName(lldb::eLanguageTypeObjC), "objc"); + + EXPECT_EQ(GetPluginName(lldb::eLanguageTypeObjC_plus_plus), "objcplusplus"); +} diff --git a/lldb/unittests/Language/CLanguages/CMakeLists.txt b/lldb/unittests/Language/CLanguages/CMakeLists.txt new file mode 100644 --- /dev/null +++ b/lldb/unittests/Language/CLanguages/CMakeLists.txt @@ -0,0 +1,8 @@ +add_lldb_unittest(LanguageCLanguagesTests + CLanguagesTest.cpp + + LINK_LIBS + lldbPluginCPlusPlusLanguage + lldbPluginObjCLanguage + lldbPluginObjCPlusPlusLanguage +) diff --git a/lldb/unittests/Language/CMakeLists.txt b/lldb/unittests/Language/CMakeLists.txt --- a/lldb/unittests/Language/CMakeLists.txt +++ b/lldb/unittests/Language/CMakeLists.txt @@ -1,2 +1,3 @@ add_subdirectory(CPlusPlus) +add_subdirectory(CLanguages) add_subdirectory(Highlighting) diff --git a/lldb/unittests/Language/Highlighting/HighlighterTest.cpp b/lldb/unittests/Language/Highlighting/HighlighterTest.cpp --- a/lldb/unittests/Language/Highlighting/HighlighterTest.cpp +++ b/lldb/unittests/Language/Highlighting/HighlighterTest.cpp @@ -58,6 +58,8 @@ EXPECT_EQ(getName("a/dir.CC"), "clang"); EXPECT_EQ(getName("/a/dir.hpp"), "clang"); EXPECT_EQ(getName("header.h"), "clang"); + EXPECT_EQ(getName("foo.m"), "clang"); + EXPECT_EQ(getName("foo.mm"), "clang"); EXPECT_EQ(getName(""), "none"); EXPECT_EQ(getName("/dev/null"), "none");