[lldb] Convert highlighters to plugins (#181026)
This PR converts the syntax highlighters to plugins. Previously, the
highlighters were part of the Language plugin, using a library shared by
the C-like languages. The Highlighters already had a plugin-like design,
with a clang and default highlighter. This PR takes them out of the
language plugin and into their own highlighter plugin. They are still
accessed thought he HighlightManager.
This change is motivated by #170250. It will allow us to have both a
clang and tree-sitter based highlighter, as well as make it possible to
have a highlighter for a language that doesn't have an upstream language
plugin, like Swift or Rust.
diff --git a/lldb/include/lldb/Core/Highlighter.h b/lldb/include/lldb/Core/Highlighter.h
index 58ecd37..fd3ac33 100644
--- a/lldb/include/lldb/Core/Highlighter.h
+++ b/lldb/include/lldb/Core/Highlighter.h
@@ -13,6 +13,7 @@
#include <utility>
#include <vector>
+#include "lldb/Core/PluginManager.h"
#include "lldb/Utility/Stream.h"
#include "lldb/lldb-enumerations.h"
#include "llvm/ADT/StringRef.h"
@@ -88,7 +89,7 @@
};
/// Annotates source code with color attributes.
-class Highlighter {
+class Highlighter : public PluginInterface {
public:
Highlighter() = default;
virtual ~Highlighter() = default;
@@ -122,23 +123,11 @@
llvm::StringRef previous_lines = "") const;
};
-/// A default highlighter that only highlights the user cursor, but doesn't
-/// do any other highlighting.
-class DefaultHighlighter : public Highlighter {
-public:
- llvm::StringRef GetName() const override { return "none"; }
-
- void Highlight(const HighlightStyle &options, llvm::StringRef line,
- std::optional<size_t> cursor_pos,
- llvm::StringRef previous_lines, Stream &s) const override;
-};
-
/// Manages the available highlighters.
class HighlighterManager {
- DefaultHighlighter m_default;
-
public:
/// Queries all known highlighter for one that can highlight some source code.
+ ///
/// \param language_type
/// The language type that the caller thinks the source code was given in.
/// \param path
@@ -149,9 +138,35 @@
/// empty highlighter that does nothing.
const Highlighter &getHighlighterFor(lldb::LanguageType language_type,
llvm::StringRef path) const;
- const Highlighter &getDefaultHighlighter() const { return m_default; }
+
+private:
+ mutable std::mutex m_mutex;
+ mutable llvm::DenseMap<lldb::LanguageType, std::unique_ptr<Highlighter>>
+ m_highlighters;
};
} // namespace lldb_private
+namespace llvm {
+
+/// DenseMapInfo implementation.
+/// \{
+template <> struct DenseMapInfo<lldb::LanguageType> {
+ static inline lldb::LanguageType getEmptyKey() {
+ return lldb::eNumLanguageTypes;
+ }
+ static inline lldb::LanguageType getTombstoneKey() {
+ return lldb::eNumLanguageTypes;
+ }
+ static unsigned getHashValue(lldb::LanguageType language_type) {
+ return static_cast<unsigned>(language_type);
+ }
+ static bool isEqual(lldb::LanguageType LHS, lldb::LanguageType RHS) {
+ return LHS == RHS;
+ }
+};
+/// \}
+
+} // namespace llvm
+
#endif // LLDB_CORE_HIGHLIGHTER_H
diff --git a/lldb/include/lldb/Core/PluginManager.h b/lldb/include/lldb/Core/PluginManager.h
index ab2ca58..4d116f5 100644
--- a/lldb/include/lldb/Core/PluginManager.h
+++ b/lldb/include/lldb/Core/PluginManager.h
@@ -620,6 +620,15 @@
static LanguageSet GetREPLAllTypeSystemSupportedLanguages();
+ // Higlhighter
+ static bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description,
+ HighlighterCreateInstance create_callback);
+
+ static bool UnregisterPlugin(HighlighterCreateInstance create_callback);
+
+ static HighlighterCreateInstance
+ GetHighlighterCreateCallbackAtIndex(uint32_t idx);
+
// Some plug-ins might register a DebuggerInitializeCallback callback when
// registering the plug-in. After a new Debugger instance is created, this
// DebuggerInitialize function will get called. This allows plug-ins to
diff --git a/lldb/include/lldb/Target/Language.h b/lldb/include/lldb/Target/Language.h
index d59ea9f..4b8d4ea 100644
--- a/lldb/include/lldb/Target/Language.h
+++ b/lldb/include/lldb/Target/Language.h
@@ -180,8 +180,6 @@
virtual bool IsSourceFile(llvm::StringRef file_path) const = 0;
- virtual const Highlighter *GetHighlighter() const { return nullptr; }
-
virtual lldb::TypeCategoryImplSP GetFormatters();
virtual HardcodedFormatters::HardcodedFormatFinder GetHardcodedFormats();
diff --git a/lldb/include/lldb/lldb-private-interfaces.h b/lldb/include/lldb/lldb-private-interfaces.h
index dbd81b0..a87e017 100644
--- a/lldb/include/lldb/lldb-private-interfaces.h
+++ b/lldb/include/lldb/lldb-private-interfaces.h
@@ -27,6 +27,7 @@
namespace lldb_private {
class ScriptedInterfaceUsages;
struct ScriptedFrameProviderDescriptor;
+class Highlighter;
typedef lldb::ABISP (*ABICreateInstance)(lldb::ProcessSP process_sp,
const ArchSpec &arch);
typedef std::unique_ptr<Architecture> (*ArchitectureCreateInstance)(
@@ -136,6 +137,8 @@
const char *repl_options);
typedef bool (*ScriptedInterfaceCreateInstance)(lldb::ScriptLanguage language,
ScriptedInterfaceUsages usages);
+
+typedef Highlighter *(*HighlighterCreateInstance)(lldb::LanguageType language);
typedef int (*ComparisonFunction)(const void *, const void *);
typedef void (*DebuggerInitializeCallback)(Debugger &debugger);
/// Trace
diff --git a/lldb/source/Core/Highlighter.cpp b/lldb/source/Core/Highlighter.cpp
index f49b778..abb6d3f 100644
--- a/lldb/source/Core/Highlighter.cpp
+++ b/lldb/source/Core/Highlighter.cpp
@@ -26,30 +26,6 @@
m_suffix = FormatAnsiTerminalCodes(suffix);
}
-void DefaultHighlighter::Highlight(const HighlightStyle &options,
- llvm::StringRef line,
- std::optional<size_t> cursor_pos,
- llvm::StringRef previous_lines,
- Stream &s) const {
- // If we don't have a valid cursor, then we just print the line as-is.
- if (!cursor_pos || *cursor_pos >= line.size()) {
- s << line;
- return;
- }
-
- // If we have a valid cursor, we have to apply the 'selected' style around
- // the character below the cursor.
-
- // Split the line around the character which is below the cursor.
- size_t column = *cursor_pos;
- // Print the characters before the cursor.
- s << line.substr(0, column);
- // Print the selected character with the defined color codes.
- options.selected.Apply(s, line.substr(column, 1));
- // Print the rest of the line.
- s << line.substr(column + 1U);
-}
-
static HighlightStyle::ColorStyle GetColor(const char *c) {
return HighlightStyle::ColorStyle(c, "${ansi.normal}");
}
@@ -65,10 +41,27 @@
const Highlighter &
HighlighterManager::getHighlighterFor(lldb::LanguageType language_type,
llvm::StringRef path) const {
- Language *language = lldb_private::Language::FindPlugin(language_type, path);
- if (language && language->GetHighlighter())
- return *language->GetHighlighter();
- return m_default;
+ // The language may be able to provide a language type based on the path.
+ if (Language *language =
+ lldb_private::Language::FindPlugin(language_type, path))
+ language_type = language->GetLanguageType();
+
+ std::lock_guard<std::mutex> guard(m_mutex);
+ auto it = m_highlighters.find(language_type);
+ if (it != m_highlighters.end())
+ return *it->second;
+
+ uint32_t idx = 0;
+ while (HighlighterCreateInstance create_instance =
+ PluginManager::GetHighlighterCreateCallbackAtIndex(idx++)) {
+ if (Highlighter *highlighter = create_instance(language_type))
+ m_highlighters.try_emplace(language_type,
+ std::unique_ptr<Highlighter>(highlighter));
+ }
+
+ assert(m_highlighters.contains(language_type) &&
+ "we should always find the default highlighter");
+ return *m_highlighters[language_type];
}
std::string Highlighter::Highlight(const HighlightStyle &options,
diff --git a/lldb/source/Core/PluginManager.cpp b/lldb/source/Core/PluginManager.cpp
index 835837e..64130d7 100644
--- a/lldb/source/Core/PluginManager.cpp
+++ b/lldb/source/Core/PluginManager.cpp
@@ -1985,6 +1985,39 @@
return all;
}
+#pragma mark Highlighter
+
+struct HighlighterInstance : public PluginInstance<HighlighterCreateInstance> {
+ HighlighterInstance(llvm::StringRef name, llvm::StringRef description,
+ CallbackType create_callback)
+ : PluginInstance<HighlighterCreateInstance>(name, description,
+ create_callback) {}
+};
+
+typedef PluginInstances<HighlighterInstance> HighlighterInstances;
+
+static HighlighterInstances &GetHighlighterInstances() {
+ static HighlighterInstances g_instances;
+ return g_instances;
+}
+
+bool PluginManager::RegisterPlugin(llvm::StringRef name,
+ llvm::StringRef description,
+ HighlighterCreateInstance create_callback) {
+ return GetHighlighterInstances().RegisterPlugin(name, description,
+ create_callback);
+}
+
+bool PluginManager::UnregisterPlugin(
+ HighlighterCreateInstance create_callback) {
+ return GetHighlighterInstances().UnregisterPlugin(create_callback);
+}
+
+HighlighterCreateInstance
+PluginManager::GetHighlighterCreateCallbackAtIndex(uint32_t idx) {
+ return GetHighlighterInstances().GetCallbackAtIndex(idx);
+}
+
#pragma mark PluginManager
void PluginManager::DebuggerInitialize(Debugger &debugger) {
diff --git a/lldb/source/Plugins/CMakeLists.txt b/lldb/source/Plugins/CMakeLists.txt
index b6878b2..bfc3d5e 100644
--- a/lldb/source/Plugins/CMakeLists.txt
+++ b/lldb/source/Plugins/CMakeLists.txt
@@ -3,6 +3,7 @@
add_subdirectory(Disassembler)
add_subdirectory(DynamicLoader)
add_subdirectory(ExpressionParser)
+add_subdirectory(Highlighter)
add_subdirectory(Instruction)
add_subdirectory(InstrumentationRuntime)
add_subdirectory(JITLoader)
diff --git a/lldb/source/Plugins/Highlighter/CMakeLists.txt b/lldb/source/Plugins/Highlighter/CMakeLists.txt
new file mode 100644
index 0000000..8803386
--- /dev/null
+++ b/lldb/source/Plugins/Highlighter/CMakeLists.txt
@@ -0,0 +1,2 @@
+add_subdirectory(Clang)
+add_subdirectory(Default)
diff --git a/lldb/source/Plugins/Language/ClangCommon/CMakeLists.txt b/lldb/source/Plugins/Highlighter/Clang/CMakeLists.txt
similarity index 65%
rename from lldb/source/Plugins/Language/ClangCommon/CMakeLists.txt
rename to lldb/source/Plugins/Highlighter/Clang/CMakeLists.txt
index 470dbc2..b723844 100644
--- a/lldb/source/Plugins/Language/ClangCommon/CMakeLists.txt
+++ b/lldb/source/Plugins/Highlighter/Clang/CMakeLists.txt
@@ -1,4 +1,4 @@
-add_lldb_library(lldbPluginClangCommon
+add_lldb_library(lldbPluginHighlighterClang PLUGIN
ClangHighlighter.cpp
LINK_COMPONENTS
diff --git a/lldb/source/Plugins/Language/ClangCommon/ClangHighlighter.cpp b/lldb/source/Plugins/Highlighter/Clang/ClangHighlighter.cpp
similarity index 93%
rename from lldb/source/Plugins/Language/ClangCommon/ClangHighlighter.cpp
rename to lldb/source/Plugins/Highlighter/Clang/ClangHighlighter.cpp
index 9cb5ea3..7480d9d 100644
--- a/lldb/source/Plugins/Language/ClangCommon/ClangHighlighter.cpp
+++ b/lldb/source/Plugins/Highlighter/Clang/ClangHighlighter.cpp
@@ -8,6 +8,7 @@
#include "ClangHighlighter.h"
+#include "lldb/Core/PluginManager.h"
#include "lldb/Host/FileSystem.h"
#include "lldb/Target/Language.h"
#include "lldb/Utility/AnsiTerminal.h"
@@ -20,6 +21,8 @@
#include "llvm/Support/MemoryBuffer.h"
#include <optional>
+LLDB_PLUGIN_DEFINE_ADV(ClangHighlighter, HighlighterClang)
+
using namespace lldb_private;
bool ClangHighlighter::isKeyword(llvm::StringRef token) const {
@@ -255,3 +258,18 @@
assert(false && "We couldn't find the user line in the input file?");
}
}
+
+Highlighter *ClangHighlighter::CreateInstance(lldb::LanguageType language) {
+ if (Language::LanguageIsCFamily(language))
+ return new ClangHighlighter();
+ return nullptr;
+}
+
+void ClangHighlighter::Initialize() {
+ PluginManager::RegisterPlugin(GetPluginNameStatic(), GetPluginNameStatic(),
+ CreateInstance);
+}
+
+void ClangHighlighter::Terminate() {
+ PluginManager::UnregisterPlugin(CreateInstance);
+}
diff --git a/lldb/source/Plugins/Language/ClangCommon/ClangHighlighter.h b/lldb/source/Plugins/Highlighter/Clang/ClangHighlighter.h
similarity index 72%
rename from lldb/source/Plugins/Language/ClangCommon/ClangHighlighter.h
rename to lldb/source/Plugins/Highlighter/Clang/ClangHighlighter.h
index 20bb095..51a0461 100644
--- a/lldb/source/Plugins/Language/ClangCommon/ClangHighlighter.h
+++ b/lldb/source/Plugins/Highlighter/Clang/ClangHighlighter.h
@@ -6,8 +6,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLDB_SOURCE_PLUGINS_LANGUAGE_CLANGCOMMON_CLANGHIGHLIGHTER_H
-#define LLDB_SOURCE_PLUGINS_LANGUAGE_CLANGCOMMON_CLANGHIGHLIGHTER_H
+#ifndef LLDB_SOURCE_PLUGINS_HIGHLIGHTER_CLANGHIGHLIGHTER_H
+#define LLDB_SOURCE_PLUGINS_HIGHLIGHTER_CLANGHIGHLIGHTER_H
#include "lldb/Utility/Stream.h"
#include "llvm/ADT/StringSet.h"
@@ -31,8 +31,16 @@
/// Returns true if the given string represents a keywords in any Clang
/// supported language.
bool isKeyword(llvm::StringRef token) const;
+
+ static Highlighter *CreateInstance(lldb::LanguageType language);
+
+ static void Terminate();
+ static void Initialize();
+
+ static llvm::StringRef GetPluginNameStatic() { return "Clang Highlighter"; }
+ llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }
};
} // namespace lldb_private
-#endif // LLDB_SOURCE_PLUGINS_LANGUAGE_CLANGCOMMON_CLANGHIGHLIGHTER_H
+#endif
diff --git a/lldb/source/Plugins/Highlighter/Default/CMakeLists.txt b/lldb/source/Plugins/Highlighter/Default/CMakeLists.txt
new file mode 100644
index 0000000..31bbfdc
--- /dev/null
+++ b/lldb/source/Plugins/Highlighter/Default/CMakeLists.txt
@@ -0,0 +1,9 @@
+add_lldb_library(lldbPluginHighlighterDefault PLUGIN
+ DefaultHighlighter.cpp
+
+ LINK_COMPONENTS
+ Support
+ LINK_LIBS
+ lldbCore
+ lldbUtility
+)
diff --git a/lldb/source/Plugins/Highlighter/Default/DefaultHighlighter.cpp b/lldb/source/Plugins/Highlighter/Default/DefaultHighlighter.cpp
new file mode 100644
index 0000000..baef8f6
--- /dev/null
+++ b/lldb/source/Plugins/Highlighter/Default/DefaultHighlighter.cpp
@@ -0,0 +1,50 @@
+//===----------------------------------------------------------------------===//
+//
+// 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 "DefaultHighlighter.h"
+
+LLDB_PLUGIN_DEFINE_ADV(DefaultHighlighter, HighlighterDefault)
+
+using namespace lldb_private;
+
+void DefaultHighlighter::Highlight(const HighlightStyle &options,
+ llvm::StringRef line,
+ std::optional<size_t> cursor_pos,
+ llvm::StringRef previous_lines,
+ Stream &s) const {
+ // If we don't have a valid cursor, then we just print the line as-is.
+ if (!cursor_pos || *cursor_pos >= line.size()) {
+ s << line;
+ return;
+ }
+
+ // If we have a valid cursor, we have to apply the 'selected' style around
+ // the character below the cursor.
+
+ // Split the line around the character which is below the cursor.
+ size_t column = *cursor_pos;
+ // Print the characters before the cursor.
+ s << line.substr(0, column);
+ // Print the selected character with the defined color codes.
+ options.selected.Apply(s, line.substr(column, 1));
+ // Print the rest of the line.
+ s << line.substr(column + 1U);
+}
+
+Highlighter *DefaultHighlighter::CreateInstance(lldb::LanguageType language) {
+ return new DefaultHighlighter();
+}
+
+void DefaultHighlighter::Initialize() {
+ PluginManager::RegisterPlugin(GetPluginNameStatic(), GetPluginNameStatic(),
+ CreateInstance);
+}
+
+void DefaultHighlighter::Terminate() {
+ PluginManager::UnregisterPlugin(CreateInstance);
+}
diff --git a/lldb/source/Plugins/Highlighter/Default/DefaultHighlighter.h b/lldb/source/Plugins/Highlighter/Default/DefaultHighlighter.h
new file mode 100644
index 0000000..ad8776a
--- /dev/null
+++ b/lldb/source/Plugins/Highlighter/Default/DefaultHighlighter.h
@@ -0,0 +1,37 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLDB_SOURCE_PLUGINS_HIGHLIGHTER_DEFAULTHIGHLIGHTER_H
+#define LLDB_SOURCE_PLUGINS_HIGHLIGHTER_DEFAULTHIGHLIGHTER_H
+
+#include "lldb/Core/Highlighter.h"
+
+namespace lldb_private {
+
+/// A default highlighter that only highlights the user cursor, but doesn't
+/// do any other highlighting.
+class DefaultHighlighter : public Highlighter {
+public:
+ llvm::StringRef GetName() const override { return "none"; }
+
+ void Highlight(const HighlightStyle &options, llvm::StringRef line,
+ std::optional<size_t> cursor_pos,
+ llvm::StringRef previous_lines, Stream &s) const override;
+
+ static Highlighter *CreateInstance(lldb::LanguageType language);
+
+ static void Terminate();
+ static void Initialize();
+
+ static llvm::StringRef GetPluginNameStatic() { return "Default Highlighter"; }
+ llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }
+};
+
+} // namespace lldb_private
+
+#endif
diff --git a/lldb/source/Plugins/Language/CMakeLists.txt b/lldb/source/Plugins/Language/CMakeLists.txt
index b432dd3..6367ab9 100644
--- a/lldb/source/Plugins/Language/CMakeLists.txt
+++ b/lldb/source/Plugins/Language/CMakeLists.txt
@@ -4,7 +4,6 @@
TypeSystem
)
-add_subdirectory(ClangCommon)
add_subdirectory(CPlusPlus)
add_subdirectory(ObjC)
add_subdirectory(ObjCPlusPlus)
diff --git a/lldb/source/Plugins/Language/CPlusPlus/CMakeLists.txt b/lldb/source/Plugins/Language/CPlusPlus/CMakeLists.txt
index 79c0cc1..08b3490 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/CMakeLists.txt
+++ b/lldb/source/Plugins/Language/CPlusPlus/CMakeLists.txt
@@ -56,7 +56,6 @@
lldbTarget
lldbUtility
lldbValueObject
- lldbPluginClangCommon
lldbPluginCPPRuntime
lldbPluginTypeSystemClang
)
diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h
index b547234..53fae3f 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h
+++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h
@@ -14,7 +14,6 @@
#include "llvm/ADT/StringRef.h"
-#include "Plugins/Language/ClangCommon/ClangHighlighter.h"
#include "lldb/Target/Language.h"
#include "lldb/Utility/ConstString.h"
#include "lldb/lldb-private.h"
@@ -22,8 +21,6 @@
namespace lldb_private {
class CPlusPlusLanguage : public Language {
- ClangHighlighter m_highlighter;
-
public:
class CxxMethodName : public Language::MethodName {
public:
@@ -81,8 +78,6 @@
bool IsSourceFile(llvm::StringRef file_path) const override;
- const Highlighter *GetHighlighter() const override { return &m_highlighter; }
-
// Static Functions
static void Initialize();
diff --git a/lldb/source/Plugins/Language/ObjC/CMakeLists.txt b/lldb/source/Plugins/Language/ObjC/CMakeLists.txt
index b9fc5ce..5e554b2 100644
--- a/lldb/source/Plugins/Language/ObjC/CMakeLists.txt
+++ b/lldb/source/Plugins/Language/ObjC/CMakeLists.txt
@@ -22,7 +22,6 @@
lldbUtility
lldbValueObject
lldbPluginAppleObjCRuntime
- lldbPluginClangCommon
lldbPluginTypeSystemClang
CLANG_LIBS
clangAST
diff --git a/lldb/source/Plugins/Language/ObjC/ObjCLanguage.h b/lldb/source/Plugins/Language/ObjC/ObjCLanguage.h
index ced6bd3..cee80ed 100644
--- a/lldb/source/Plugins/Language/ObjC/ObjCLanguage.h
+++ b/lldb/source/Plugins/Language/ObjC/ObjCLanguage.h
@@ -12,7 +12,6 @@
#include <cstring>
#include <vector>
-#include "Plugins/Language/ClangCommon/ClangHighlighter.h"
#include "lldb/Target/Language.h"
#include "lldb/Utility/ConstString.h"
#include "lldb/lldb-private.h"
@@ -20,8 +19,6 @@
namespace lldb_private {
class ObjCLanguage : public Language {
- ClangHighlighter m_highlighter;
-
public:
class ObjCMethodName {
public:
@@ -164,8 +161,6 @@
bool IsSourceFile(llvm::StringRef file_path) const override;
- const Highlighter *GetHighlighter() const override { return &m_highlighter; }
-
// Static Functions
static void Initialize();
diff --git a/lldb/source/Plugins/Language/ObjCPlusPlus/CMakeLists.txt b/lldb/source/Plugins/Language/ObjCPlusPlus/CMakeLists.txt
index 1aa5cc1..3f7249e 100644
--- a/lldb/source/Plugins/Language/ObjCPlusPlus/CMakeLists.txt
+++ b/lldb/source/Plugins/Language/ObjCPlusPlus/CMakeLists.txt
@@ -4,5 +4,4 @@
LINK_LIBS
lldbCore
lldbTarget
- lldbPluginClangCommon
)
diff --git a/lldb/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.h b/lldb/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.h
index 229dffe..ab45acd 100644
--- a/lldb/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.h
+++ b/lldb/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.h
@@ -9,15 +9,12 @@
#ifndef LLDB_SOURCE_PLUGINS_LANGUAGE_OBJCPLUSPLUS_OBJCPLUSPLUSLANGUAGE_H
#define LLDB_SOURCE_PLUGINS_LANGUAGE_OBJCPLUSPLUS_OBJCPLUSPLUSLANGUAGE_H
-#include "Plugins/Language/ClangCommon/ClangHighlighter.h"
#include "lldb/Target/Language.h"
#include "lldb/lldb-private.h"
namespace lldb_private {
class ObjCPlusPlusLanguage : public Language {
- ClangHighlighter m_highlighter;
-
public:
ObjCPlusPlusLanguage() = default;
@@ -33,8 +30,6 @@
bool IsSourceFile(llvm::StringRef file_path) const override;
- const Highlighter *GetHighlighter() const override { return &m_highlighter; }
-
// Static Functions
static void Initialize();
diff --git a/lldb/source/Plugins/REPL/Clang/CMakeLists.txt b/lldb/source/Plugins/REPL/Clang/CMakeLists.txt
index 3a7e188..c020ab8 100644
--- a/lldb/source/Plugins/REPL/Clang/CMakeLists.txt
+++ b/lldb/source/Plugins/REPL/Clang/CMakeLists.txt
@@ -10,7 +10,6 @@
lldbSymbol
lldbTarget
lldbUtility
- lldbPluginClangCommon
lldbPluginCPPRuntime
lldbPluginTypeSystemClang
)
diff --git a/lldb/unittests/CMakeLists.txt b/lldb/unittests/CMakeLists.txt
index 194dd42..76d8b73 100644
--- a/lldb/unittests/CMakeLists.txt
+++ b/lldb/unittests/CMakeLists.txt
@@ -64,6 +64,7 @@
add_subdirectory(Disassembler)
add_subdirectory(Editline)
add_subdirectory(Expression)
+add_subdirectory(Highlighter)
add_subdirectory(Host)
add_subdirectory(Instruction)
add_subdirectory(Interpreter)
diff --git a/lldb/unittests/Language/Highlighting/CMakeLists.txt b/lldb/unittests/Highlighter/CMakeLists.txt
similarity index 71%
rename from lldb/unittests/Language/Highlighting/CMakeLists.txt
rename to lldb/unittests/Highlighter/CMakeLists.txt
index 576f8df..255f7bc 100644
--- a/lldb/unittests/Language/Highlighting/CMakeLists.txt
+++ b/lldb/unittests/Highlighter/CMakeLists.txt
@@ -2,7 +2,9 @@
HighlighterTest.cpp
LINK_LIBS
+ lldbPluginHighlighterDefault
+ lldbPluginHighlighterClang
lldbPluginCPlusPlusLanguage
lldbPluginObjCLanguage
lldbPluginObjCPlusPlusLanguage
- )
+)
diff --git a/lldb/unittests/Language/Highlighting/HighlighterTest.cpp b/lldb/unittests/Highlighter/HighlighterTest.cpp
similarity index 95%
rename from lldb/unittests/Language/Highlighting/HighlighterTest.cpp
rename to lldb/unittests/Highlighter/HighlighterTest.cpp
index 150b356..6c0c569 100644
--- a/lldb/unittests/Language/Highlighting/HighlighterTest.cpp
+++ b/lldb/unittests/Highlighter/HighlighterTest.cpp
@@ -8,12 +8,14 @@
#include "gtest/gtest.h"
-#include "lldb/Core/Highlighter.h"
-#include "lldb/Host/FileSystem.h"
-
+#include "Plugins/Highlighter/Clang/ClangHighlighter.h"
+#include "Plugins/Highlighter/Default/DefaultHighlighter.h"
#include "Plugins/Language/CPlusPlus/CPlusPlusLanguage.h"
#include "Plugins/Language/ObjC/ObjCLanguage.h"
#include "Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.h"
+#include "lldb/Core/Highlighter.h"
+#include "lldb/Host/FileSystem.h"
+
#include "TestingSupport/SubsystemRAII.h"
#include <optional>
@@ -21,8 +23,10 @@
namespace {
class HighlighterTest : public testing::Test {
- SubsystemRAII<FileSystem, CPlusPlusLanguage, ObjCLanguage,
- ObjCPlusPlusLanguage>
+ // We need the language plugins for detecting the language based on the
+ // filename.
+ SubsystemRAII<FileSystem, ClangHighlighter, DefaultHighlighter,
+ CPlusPlusLanguage, ObjCLanguage, ObjCPlusPlusLanguage>
subsystems;
};
} // namespace
@@ -88,7 +92,8 @@
highlightDefault(llvm::StringRef code, HighlightStyle style,
std::optional<size_t> cursor = std::optional<size_t>()) {
HighlighterManager mgr;
- return mgr.getDefaultHighlighter().Highlight(style, code, cursor);
+ return mgr.getHighlighterFor(lldb::LanguageType::eLanguageTypeUnknown, "")
+ .Highlight(style, code, cursor);
}
TEST_F(HighlighterTest, DefaultHighlighter) {
diff --git a/lldb/unittests/Language/CMakeLists.txt b/lldb/unittests/Language/CMakeLists.txt
index 6f17356..a0bdc62 100644
--- a/lldb/unittests/Language/CMakeLists.txt
+++ b/lldb/unittests/Language/CMakeLists.txt
@@ -1,4 +1,3 @@
add_subdirectory(CPlusPlus)
add_subdirectory(CLanguages)
-add_subdirectory(Highlighting)
add_subdirectory(ObjC)