xref: /openbsd-src/gnu/llvm/lldb/source/Plugins/REPL/Clang/ClangREPL.cpp (revision f6aab3d83b51b91c24247ad2c2573574de475a82)
1*f6aab3d8Srobert //===-- ClangREPL.cpp -----------------------------------------------------===//
2*f6aab3d8Srobert //
3*f6aab3d8Srobert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*f6aab3d8Srobert // See https://llvm.org/LICENSE.txt for license information.
5*f6aab3d8Srobert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*f6aab3d8Srobert //
7*f6aab3d8Srobert //===----------------------------------------------------------------------===//
8*f6aab3d8Srobert 
9*f6aab3d8Srobert #include "ClangREPL.h"
10*f6aab3d8Srobert #include "lldb/Core/Debugger.h"
11*f6aab3d8Srobert #include "lldb/Core/PluginManager.h"
12*f6aab3d8Srobert #include "lldb/Expression/ExpressionVariable.h"
13*f6aab3d8Srobert 
14*f6aab3d8Srobert using namespace lldb_private;
15*f6aab3d8Srobert 
LLDB_PLUGIN_DEFINE(ClangREPL)16*f6aab3d8Srobert LLDB_PLUGIN_DEFINE(ClangREPL)
17*f6aab3d8Srobert 
18*f6aab3d8Srobert ClangREPL::ClangREPL(lldb::LanguageType language, Target &target)
19*f6aab3d8Srobert     : REPL(eKindClang, target), m_language(language),
20*f6aab3d8Srobert       m_implicit_expr_result_regex("\\$[0-9]+") {}
21*f6aab3d8Srobert 
22*f6aab3d8Srobert ClangREPL::~ClangREPL() = default;
23*f6aab3d8Srobert 
Initialize()24*f6aab3d8Srobert void ClangREPL::Initialize() {
25*f6aab3d8Srobert   LanguageSet languages;
26*f6aab3d8Srobert   // FIXME: There isn't a way to ask CPlusPlusLanguage and ObjCLanguage for
27*f6aab3d8Srobert   // a list of languages they support.
28*f6aab3d8Srobert   languages.Insert(lldb::LanguageType::eLanguageTypeC);
29*f6aab3d8Srobert   languages.Insert(lldb::LanguageType::eLanguageTypeC89);
30*f6aab3d8Srobert   languages.Insert(lldb::LanguageType::eLanguageTypeC99);
31*f6aab3d8Srobert   languages.Insert(lldb::LanguageType::eLanguageTypeC11);
32*f6aab3d8Srobert   languages.Insert(lldb::LanguageType::eLanguageTypeC_plus_plus);
33*f6aab3d8Srobert   languages.Insert(lldb::LanguageType::eLanguageTypeC_plus_plus_03);
34*f6aab3d8Srobert   languages.Insert(lldb::LanguageType::eLanguageTypeC_plus_plus_11);
35*f6aab3d8Srobert   languages.Insert(lldb::LanguageType::eLanguageTypeC_plus_plus_14);
36*f6aab3d8Srobert   languages.Insert(lldb::LanguageType::eLanguageTypeObjC);
37*f6aab3d8Srobert   languages.Insert(lldb::LanguageType::eLanguageTypeObjC_plus_plus);
38*f6aab3d8Srobert   PluginManager::RegisterPlugin(GetPluginNameStatic(), "C language REPL",
39*f6aab3d8Srobert                                 &CreateInstance, languages);
40*f6aab3d8Srobert }
41*f6aab3d8Srobert 
Terminate()42*f6aab3d8Srobert void ClangREPL::Terminate() {
43*f6aab3d8Srobert   PluginManager::UnregisterPlugin(&CreateInstance);
44*f6aab3d8Srobert }
45*f6aab3d8Srobert 
CreateInstance(Status & error,lldb::LanguageType language,Debugger * debugger,Target * target,const char * repl_options)46*f6aab3d8Srobert lldb::REPLSP ClangREPL::CreateInstance(Status &error,
47*f6aab3d8Srobert                                        lldb::LanguageType language,
48*f6aab3d8Srobert                                        Debugger *debugger, Target *target,
49*f6aab3d8Srobert                                        const char *repl_options) {
50*f6aab3d8Srobert   // Creating a dummy target if only a debugger is given isn't implemented yet.
51*f6aab3d8Srobert   if (!target) {
52*f6aab3d8Srobert     error.SetErrorString("must have a target to create a REPL");
53*f6aab3d8Srobert     return nullptr;
54*f6aab3d8Srobert   }
55*f6aab3d8Srobert   lldb::REPLSP result = std::make_shared<ClangREPL>(language, *target);
56*f6aab3d8Srobert   target->SetREPL(language, result);
57*f6aab3d8Srobert   error = Status();
58*f6aab3d8Srobert   return result;
59*f6aab3d8Srobert }
60*f6aab3d8Srobert 
DoInitialization()61*f6aab3d8Srobert Status ClangREPL::DoInitialization() { return Status(); }
62*f6aab3d8Srobert 
GetSourceFileBasename()63*f6aab3d8Srobert ConstString ClangREPL::GetSourceFileBasename() {
64*f6aab3d8Srobert   return ConstString("repl.c");
65*f6aab3d8Srobert }
66*f6aab3d8Srobert 
GetAutoIndentCharacters()67*f6aab3d8Srobert const char *ClangREPL::GetAutoIndentCharacters() { return "  "; }
68*f6aab3d8Srobert 
SourceIsComplete(const std::string & source)69*f6aab3d8Srobert bool ClangREPL::SourceIsComplete(const std::string &source) {
70*f6aab3d8Srobert   // FIXME: There isn't a good way to know if the input source is complete or
71*f6aab3d8Srobert   // not, so just say that every single REPL line is ready to be parsed.
72*f6aab3d8Srobert   return !source.empty();
73*f6aab3d8Srobert }
74*f6aab3d8Srobert 
GetDesiredIndentation(const StringList & lines,int cursor_position,int tab_size)75*f6aab3d8Srobert lldb::offset_t ClangREPL::GetDesiredIndentation(const StringList &lines,
76*f6aab3d8Srobert                                                 int cursor_position,
77*f6aab3d8Srobert                                                 int tab_size) {
78*f6aab3d8Srobert   // FIXME: Not implemented.
79*f6aab3d8Srobert   return LLDB_INVALID_OFFSET;
80*f6aab3d8Srobert }
81*f6aab3d8Srobert 
GetLanguage()82*f6aab3d8Srobert lldb::LanguageType ClangREPL::GetLanguage() { return m_language; }
83*f6aab3d8Srobert 
PrintOneVariable(Debugger & debugger,lldb::StreamFileSP & output_sp,lldb::ValueObjectSP & valobj_sp,ExpressionVariable * var)84*f6aab3d8Srobert bool ClangREPL::PrintOneVariable(Debugger &debugger,
85*f6aab3d8Srobert                                  lldb::StreamFileSP &output_sp,
86*f6aab3d8Srobert                                  lldb::ValueObjectSP &valobj_sp,
87*f6aab3d8Srobert                                  ExpressionVariable *var) {
88*f6aab3d8Srobert   // If a ExpressionVariable was passed, check first if that variable is just
89*f6aab3d8Srobert   // an automatically created expression result. These variables are already
90*f6aab3d8Srobert   // printed by the REPL so this is done to prevent printing the variable twice.
91*f6aab3d8Srobert   if (var) {
92*f6aab3d8Srobert     if (m_implicit_expr_result_regex.Execute(var->GetName().GetStringRef()))
93*f6aab3d8Srobert       return true;
94*f6aab3d8Srobert   }
95*f6aab3d8Srobert   valobj_sp->Dump(*output_sp);
96*f6aab3d8Srobert   return true;
97*f6aab3d8Srobert }
98*f6aab3d8Srobert 
CompleteCode(const std::string & current_code,CompletionRequest & request)99*f6aab3d8Srobert void ClangREPL::CompleteCode(const std::string &current_code,
100*f6aab3d8Srobert                              CompletionRequest &request) {
101*f6aab3d8Srobert   // Not implemented.
102*f6aab3d8Srobert }
103