16#include <unordered_map>
18#include <nlohmann/json.hpp>
21#include <frozen/string.h>
22#include <frozen/unordered_map.h>
27#include "static/Message.h"
28#include "generated/ErrorCodes.h"
30#include "generated/CompletionList.h"
31#include "generated/CompletionParams.h"
38using json = nlohmann::json;
45template<
typename... Ts>
46void printValue(std::ostream& os,
const std::variant<Ts...>& v) {
47 std::visit([&os](
auto&& arg) { os << arg; }, v);
81 std::unordered_map<std::string, std::shared_ptr<DebounceState>>
states;
97 std::shared_ptr<DebounceState>
get(
const std::string& uri) {
98 std::lock_guard<std::mutex> lock(
map_mutex);
100 auto it =
states.find(uri);
101 if (it !=
states.end())
return it->second;
102 auto new_state = std::make_shared<DebounceState>();
136 GenericResponseMessage
shutdown(
const GenericRequestMessage& request);
142 GenericResponseMessage
handleInitialize(
const GenericRequestMessage& request);
143 GenericResponseMessage
handleDefinition(
const GenericRequestMessage& request);
144 GenericResponseMessage
handleHover(
const GenericRequestMessage& request);
146 GenericResponseMessage
handleRename(
const GenericRequestMessage& request);
147 GenericResponseMessage
handleReferences(
const GenericRequestMessage& request);
148 GenericResponseMessage
handleCompletion(
const GenericRequestMessage& request);
154 void handleDidOpen(
const GenericNotificationMessage& request);
159 void sendResponse(
const GenericResponseMessage& response);
167 template <
typename... Args>
168 void log(Args&&... args) {
172 std::lock_guard<std::mutex> lock(
log_mutex);
173 auto now = std::chrono::system_clock::now();
174 auto now_time_t = std::chrono::system_clock::to_time_t(now);
176 localtime_r(&now_time_t, &tm_buf);
177 log_file <<
"[" << std::put_time(&tm_buf,
"%Y-%m-%d %H:%M:%S") <<
"] ";
191 static constexpr frozen::unordered_map<frozen::string, RequestHandler, 8>
request_handlers = {
Manages a pool of bpp_program objects for efficient reuse and access.
Definition ProgramPool.h:38
bool has_program(const std::string &file_path)
Check if a program for the given file path exists in the pool.
Definition ProgramPool.cpp:236
A thread pool implementation that manages a pool of worker threads to execute tasks concurrently.
Definition ThreadPool.h:24
Definition BashppServer.h:79
ProgramPool * pool
Definition BashppServer.h:82
void cleanup()
Definition BashppServer.h:85
std::shared_ptr< DebounceState > get(const std::string &uri)
Definition BashppServer.h:97
DebounceStateMap(ProgramPool *program_pool)
Definition BashppServer.h:96
DebounceStateMap()=delete
std::unordered_map< std::string, std::shared_ptr< DebounceState > > states
Definition BashppServer.h:81
std::mutex map_mutex
Definition BashppServer.h:83
The main server class for handling LSP requests and notifications.
Definition BashppServer.h:59
void publishDiagnostics(std::shared_ptr< bpp::bpp_program > program)
Definition BashppServer.cpp:329
GenericResponseMessage handleHover(const GenericRequestMessage &request)
Definition handleHover.cpp:11
void(BashppServer::*)(const GenericNotificationMessage &) NotificationHandler
Definition BashppServer.h:185
void processNotification(const GenericNotificationMessage ¬ification)
Definition BashppServer.cpp:275
static std::string readHeaderLine(std::streambuf *buffer)
Definition BashppServer.cpp:160
void mainLoop()
Definition BashppServer.cpp:175
static std::mutex log_mutex
Definition BashppServer.h:115
DebounceStateMap debounce_states
Definition BashppServer.h:107
GenericResponseMessage handleRename(const GenericRequestMessage &request)
Definition handleRename.cpp:11
pid_t pid
Definition BashppServer.h:61
void sendNotification(const GenericNotificationMessage ¬ification)
Definition BashppServer.cpp:245
void setSocketPath(const std::string &path)
Definition BashppServer.cpp:130
void processRequest(const GenericRequestMessage &request)
Definition BashppServer.cpp:251
GenericResponseMessage handleDocumentSymbol(const GenericRequestMessage &request)
Definition handleDocumentSymbol.cpp:10
static constexpr frozen::unordered_map< frozen::string, RequestHandler, 8 > request_handlers
Maps request types to the functions that handle them.
Definition BashppServer.h:191
ProgramPool program_pool
Definition BashppServer.h:67
void handleDidClose(const GenericNotificationMessage &request)
Definition handledDidClose.cpp:10
GenericResponseMessage(BashppServer::*)(const GenericRequestMessage &) RequestHandler
Definition BashppServer.h:184
std::optional< std::string > socket_path
Definition BashppServer.h:65
void sendResponse(const GenericResponseMessage &response)
Definition BashppServer.cpp:239
std::atomic< bool > processing_didChange
Definition BashppServer.h:108
ThreadPool thread_pool
Definition BashppServer.h:66
static constexpr frozen::unordered_map< frozen::string, NotificationHandler, 4 > notification_handlers
Maps notification types to the functions that handle them.
Definition BashppServer.h:206
void setOutputStream(std::shared_ptr< std::ostream > stream)
Definition BashppServer.cpp:126
GenericResponseMessage shutdown(const GenericRequestMessage &request)
Definition BashppServer.cpp:321
GenericResponseMessage handleReferences(const GenericRequestMessage &request)
Definition handleReference.cpp:12
std::shared_ptr< std::istream > input_stream
Definition BashppServer.h:63
static void invalidNotificationHandler(const GenericNotificationMessage &request)
Definition BashppServer.cpp:229
std::shared_ptr< std::ostream > output_stream
Definition BashppServer.h:64
void handleDidChange(const GenericNotificationMessage &request)
Definition handleDidChange.cpp:10
void processMessage(const std::string &message)
Definition BashppServer.cpp:291
void handleDidOpen(const GenericNotificationMessage &request)
Definition handleDidOpen.cpp:10
void log(Args &&... args)
Definition BashppServer.h:168
BashppServer()
Definition BashppServer.cpp:16
GenericResponseMessage handleInitialize(const GenericRequestMessage &request)
Definition handleInitialize.cpp:12
void setInputStream(std::shared_ptr< std::istream > stream)
Definition BashppServer.cpp:122
std::ofstream log_file
Definition BashppServer.h:68
GenericResponseMessage handleDefinition(const GenericRequestMessage &request)
Definition handleDefinition.cpp:11
CompletionList handleDOTCompletion(const CompletionParams ¶ms)
Definition handleCompletion.cpp:125
void setLogFile(const std::string &path)
Definition BashppServer.cpp:134
CompletionList handleATCompletion(const CompletionParams ¶ms)
Definition handleCompletion.cpp:76
void handleDidChangeWatchedFiles(const GenericNotificationMessage &request)
Definition handleDidChangeWatchedFiles.cpp:10
void add_include_path(const std::string &path)
Definition BashppServer.cpp:375
static const GenericResponseMessage invalidRequestHandler(const GenericRequestMessage &request)
Definition BashppServer.cpp:225
void cleanup()
Definition BashppServer.cpp:145
CompletionList default_completion_list
Definition BashppServer.h:123
static std::mutex output_mutex
Definition BashppServer.h:114
void setTargetBashVersion(const BashVersion &version)
Definition BashppServer.cpp:141
void _sendMessage(const std::string &message)
Definition BashppServer.cpp:233
~BashppServer()
Definition BashppServer.cpp:120
GenericResponseMessage handleCompletion(const GenericRequestMessage &request)
Definition handleCompletion.cpp:11
void set_suppress_warnings(bool suppress)
Definition BashppServer.cpp:379
Definition bash_case.cpp:9
void printValue(std::ostream &os, const T &value)
Definition BashppServer.h:41
nlohmann::json json
Definition BashppServer.h:38
Represents a Bash version to target for code generation.
Definition BashVersion.h:21
Definition BashppServer.h:71
std::atomic< uint32_t > debounce_time_in_milliseconds
Definition BashppServer.h:74
std::atomic< uint64_t > change_generation
Definition BashppServer.h:72
std::atomic< uint64_t > average_reparse_time_in_microseconds
Definition BashppServer.h:73