Path: blob/main/contrib/llvm-project/lldb/source/Plugins/REPL/Clang/ClangREPL.cpp
39654 views
//===-- ClangREPL.cpp -----------------------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "ClangREPL.h"9#include "lldb/Core/Debugger.h"10#include "lldb/Core/PluginManager.h"11#include "lldb/Expression/ExpressionVariable.h"1213using namespace lldb_private;1415LLDB_PLUGIN_DEFINE(ClangREPL)1617char ClangREPL::ID;1819ClangREPL::ClangREPL(lldb::LanguageType language, Target &target)20: llvm::RTTIExtends<ClangREPL, REPL>(target), m_language(language),21m_implicit_expr_result_regex("\\$[0-9]+") {}2223ClangREPL::~ClangREPL() = default;2425void ClangREPL::Initialize() {26LanguageSet languages;27// FIXME: There isn't a way to ask CPlusPlusLanguage and ObjCLanguage for28// a list of languages they support.29languages.Insert(lldb::LanguageType::eLanguageTypeC);30languages.Insert(lldb::LanguageType::eLanguageTypeC89);31languages.Insert(lldb::LanguageType::eLanguageTypeC99);32languages.Insert(lldb::LanguageType::eLanguageTypeC11);33languages.Insert(lldb::LanguageType::eLanguageTypeC_plus_plus);34languages.Insert(lldb::LanguageType::eLanguageTypeC_plus_plus_03);35languages.Insert(lldb::LanguageType::eLanguageTypeC_plus_plus_11);36languages.Insert(lldb::LanguageType::eLanguageTypeC_plus_plus_14);37languages.Insert(lldb::LanguageType::eLanguageTypeObjC);38languages.Insert(lldb::LanguageType::eLanguageTypeObjC_plus_plus);39PluginManager::RegisterPlugin(GetPluginNameStatic(), "C language REPL",40&CreateInstance, languages);41}4243void ClangREPL::Terminate() {44PluginManager::UnregisterPlugin(&CreateInstance);45}4647lldb::REPLSP ClangREPL::CreateInstance(Status &error,48lldb::LanguageType language,49Debugger *debugger, Target *target,50const char *repl_options) {51// Creating a dummy target if only a debugger is given isn't implemented yet.52if (!target) {53error.SetErrorString("must have a target to create a REPL");54return nullptr;55}56lldb::REPLSP result = std::make_shared<ClangREPL>(language, *target);57target->SetREPL(language, result);58error = Status();59return result;60}6162Status ClangREPL::DoInitialization() { return Status(); }6364llvm::StringRef ClangREPL::GetSourceFileBasename() {65static constexpr llvm::StringLiteral g_repl("repl.c");66return g_repl;67}6869const char *ClangREPL::GetAutoIndentCharacters() { return " "; }7071bool ClangREPL::SourceIsComplete(const std::string &source) {72// FIXME: There isn't a good way to know if the input source is complete or73// not, so just say that every single REPL line is ready to be parsed.74return !source.empty();75}7677lldb::offset_t ClangREPL::GetDesiredIndentation(const StringList &lines,78int cursor_position,79int tab_size) {80// FIXME: Not implemented.81return LLDB_INVALID_OFFSET;82}8384lldb::LanguageType ClangREPL::GetLanguage() { return m_language; }8586bool ClangREPL::PrintOneVariable(Debugger &debugger,87lldb::StreamFileSP &output_sp,88lldb::ValueObjectSP &valobj_sp,89ExpressionVariable *var) {90// If a ExpressionVariable was passed, check first if that variable is just91// an automatically created expression result. These variables are already92// printed by the REPL so this is done to prevent printing the variable twice.93if (var) {94if (m_implicit_expr_result_regex.Execute(var->GetName().GetStringRef()))95return true;96}97if (llvm::Error error = valobj_sp->Dump(*output_sp))98*output_sp << "error: " << toString(std::move(error));99100return true;101}102103void ClangREPL::CompleteCode(const std::string ¤t_code,104CompletionRequest &request) {105// Not implemented.106}107108109