Skip to content

Commit 0bd8242

Browse files
16bit-ykikoclaude
andcommitted
refactor: use path and offset instead of URI and line/character in worker protocol
Replace URI strings with file paths and line/character pairs with byte offsets in the worker IPC protocol. Use PositionMapper for LSP position conversion in master_server, and adopt LOG_* macros in clice.cc. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 2d0eec9 commit 0bd8242

File tree

9 files changed

+164
-209
lines changed

9 files changed

+164
-209
lines changed

src/clice.cc

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "server/stateful_worker.h"
1313
#include "server/stateless_worker.h"
1414
#include "support/filesystem.h"
15+
#include "support/logging.h"
1516

1617
namespace clice {
1718

@@ -53,7 +54,7 @@ int main(int argc, const char** argv) {
5354
auto result = deco::cli::parse<clice::Options>(args);
5455

5556
if(!result.has_value()) {
56-
std::println(stderr, "error: {}", result.error().message);
57+
LOG_ERROR("{}", result.error().message);
5758
return 1;
5859
}
5960

@@ -73,7 +74,7 @@ int main(int argc, const char** argv) {
7374
}
7475

7576
if(!opts.mode.has_value()) {
76-
std::println(stderr, "error: --mode is required");
77+
LOG_ERROR("--mode is required");
7778
return 1;
7879
}
7980

@@ -94,7 +95,7 @@ int main(int argc, const char** argv) {
9495

9596
auto transport = et::ipc::StreamTransport::open_stdio(loop);
9697
if(!transport) {
97-
std::println(stderr, "error: failed to open stdio transport");
98+
LOG_ERROR("failed to open stdio transport");
9899
return 1;
99100
}
100101

@@ -117,23 +118,23 @@ int main(int argc, const char** argv) {
117118

118119
auto acceptor = et::tcp::listen(host, port, {}, loop);
119120
if(!acceptor) {
120-
std::println(stderr, "error: failed to listen on {}:{}", host, port);
121+
LOG_ERROR("failed to listen on {}:{}", host, port);
121122
return 1;
122123
}
123124

124-
std::println(stderr, "Listening on {}:{} ...", host, port);
125+
LOG_INFO("Listening on {}:{} ...", host, port);
125126

126127
std::string self_path = llvm::sys::fs::getMainExecutable(argv[0], (void*)main);
127128

128-
loop.schedule([&]() -> et::task<> {
129+
auto task = [&]() -> et::task<> {
129130
auto client = co_await acceptor->accept();
130131
if(!client.has_value()) {
131-
std::println(stderr, "error: failed to accept connection");
132+
LOG_ERROR("failed to accept connection");
132133
loop.stop();
133134
co_return;
134135
}
135136

136-
std::println(stderr, "Client connected");
137+
LOG_INFO("Client connected");
137138

138139
auto transport = std::make_unique<et::ipc::StreamTransport>(std::move(client.value()));
139140
et::ipc::JsonPeer peer(loop, std::move(transport));
@@ -142,11 +143,12 @@ int main(int argc, const char** argv) {
142143

143144
co_await peer.run();
144145
loop.stop();
145-
}());
146+
};
146147

148+
loop.schedule(task());
147149
return loop.run();
148150
}
149151

150-
std::println(stderr, "error: unknown mode '{}'", mode);
152+
LOG_ERROR("unknown mode '{}'", mode);
151153
return 1;
152154
}

src/server/master_server.cpp

Lines changed: 46 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <variant>
77
#include <vector>
88

9+
#include "eventide/ipc/lsp/position.h"
910
#include "eventide/ipc/lsp/uri.h"
1011
#include "eventide/serde/json/json.h"
1112
#include "eventide/serde/serde/raw_value.h"
@@ -120,7 +121,7 @@ et::task<> MasterServer::run_build_drain(std::uint32_t path_id, std::string uri)
120121

121122
// Send compile request to stateful worker
122123
worker::CompileParams params;
123-
params.uri = uri;
124+
params.path = std::string(path_pool.resolve(path_id));
124125
params.version = doc_it->second.version;
125126
params.text = doc_it->second.text;
126127
fill_compile_args(path_pool.resolve(path_id), params.directory, params.arguments);
@@ -544,22 +545,11 @@ void MasterServer::register_handlers() {
544545
// Incremental change: replace range
545546
auto& range = c.range;
546547

547-
// Convert Position (line/character) to byte offset
548-
auto pos_to_offset = [&](protocol::Position pos) -> std::size_t {
549-
std::size_t offset = 0;
550-
int line = 0;
551-
for(std::size_t i = 0; i < doc.text.size(); i++) {
552-
if(line == static_cast<int>(pos.line)) {
553-
return i + pos.character;
554-
}
555-
if(doc.text[i] == '\n')
556-
line++;
557-
}
558-
return doc.text.size();
559-
};
560-
561-
auto start = pos_to_offset(range.start);
562-
auto end = pos_to_offset(range.end);
548+
using eventide::ipc::lsp::PositionMapper;
549+
using eventide::ipc::lsp::PositionEncoding;
550+
PositionMapper mapper(doc.text, PositionEncoding::UTF16);
551+
auto start = mapper.to_offset(range.start);
552+
auto end = mapper.to_offset(range.end);
563553
if(start <= doc.text.size() && end <= doc.text.size() && start <= end) {
564554
doc.text.replace(start, end - start, c.text);
565555
}
@@ -572,7 +562,7 @@ void MasterServer::register_handlers() {
572562

573563
// Notify the owning stateful worker so it marks the document dirty
574564
worker::DocumentUpdateParams update;
575-
update.uri = params.text_document.uri;
565+
update.path = path;
576566
update.version = doc.version;
577567
update.text = doc.text;
578568
pool.notify_stateful(path_id, update);
@@ -639,9 +629,15 @@ void MasterServer::register_handlers() {
639629
params.text_document_position_params.text_document.uri);
640630

641631
worker::HoverParams wp;
642-
wp.uri = params.text_document_position_params.text_document.uri;
643-
wp.line = params.text_document_position_params.position.line;
644-
wp.character = params.text_document_position_params.position.character;
632+
wp.path = path;
633+
634+
auto doc_it = documents.find(path_id);
635+
if(doc_it != documents.end()) {
636+
using eventide::ipc::lsp::PositionMapper;
637+
using eventide::ipc::lsp::PositionEncoding;
638+
PositionMapper mapper(doc_it->second.text, PositionEncoding::UTF16);
639+
wp.offset = mapper.to_offset(params.text_document_position_params.position);
640+
}
645641

646642
auto result = co_await pool.send_stateful<worker::HoverParams>(path_id, wp);
647643
if(!result.has_value())
@@ -662,7 +658,7 @@ void MasterServer::register_handlers() {
662658
co_await ensure_compiled(path_id, params.text_document.uri);
663659

664660
worker::SemanticTokensParams wp;
665-
wp.uri = params.text_document.uri;
661+
wp.path = path;
666662

667663
auto result = co_await pool.send_stateful<worker::SemanticTokensParams>(path_id, wp);
668664
if(!result.has_value())
@@ -683,8 +679,7 @@ void MasterServer::register_handlers() {
683679
co_await ensure_compiled(path_id, params.text_document.uri);
684680

685681
worker::InlayHintsParams wp;
686-
wp.uri = params.text_document.uri;
687-
wp.range = params.range;
682+
wp.path = path;
688683

689684
auto result = co_await pool.send_stateful<worker::InlayHintsParams>(path_id, wp);
690685
if(!result.has_value())
@@ -705,7 +700,7 @@ void MasterServer::register_handlers() {
705700
co_await ensure_compiled(path_id, params.text_document.uri);
706701

707702
worker::FoldingRangeParams wp;
708-
wp.uri = params.text_document.uri;
703+
wp.path = path;
709704

710705
auto result = co_await pool.send_stateful<worker::FoldingRangeParams>(path_id, wp);
711706
if(!result.has_value())
@@ -726,7 +721,7 @@ void MasterServer::register_handlers() {
726721
co_await ensure_compiled(path_id, params.text_document.uri);
727722

728723
worker::DocumentSymbolParams wp;
729-
wp.uri = params.text_document.uri;
724+
wp.path = path;
730725

731726
auto result = co_await pool.send_stateful<worker::DocumentSymbolParams>(path_id, wp);
732727
if(!result.has_value())
@@ -747,7 +742,7 @@ void MasterServer::register_handlers() {
747742
co_await ensure_compiled(path_id, params.text_document.uri);
748743

749744
worker::DocumentLinkParams wp;
750-
wp.uri = params.text_document.uri;
745+
wp.path = path;
751746

752747
auto result = co_await pool.send_stateful<worker::DocumentLinkParams>(path_id, wp);
753748
if(!result.has_value())
@@ -768,8 +763,7 @@ void MasterServer::register_handlers() {
768763
co_await ensure_compiled(path_id, params.text_document.uri);
769764

770765
worker::CodeActionParams wp;
771-
wp.uri = params.text_document.uri;
772-
wp.range = params.range;
766+
wp.path = path;
773767

774768
auto result = co_await pool.send_stateful<worker::CodeActionParams>(path_id, wp);
775769
if(!result.has_value())
@@ -791,9 +785,15 @@ void MasterServer::register_handlers() {
791785
params.text_document_position_params.text_document.uri);
792786

793787
worker::GoToDefinitionParams wp;
794-
wp.uri = params.text_document_position_params.text_document.uri;
795-
wp.line = params.text_document_position_params.position.line;
796-
wp.character = params.text_document_position_params.position.character;
788+
wp.path = path;
789+
790+
auto doc_it = documents.find(path_id);
791+
if(doc_it != documents.end()) {
792+
using eventide::ipc::lsp::PositionMapper;
793+
using eventide::ipc::lsp::PositionEncoding;
794+
PositionMapper mapper(doc_it->second.text, PositionEncoding::UTF16);
795+
wp.offset = mapper.to_offset(params.text_document_position_params.position);
796+
}
797797

798798
auto result = co_await pool.send_stateful<worker::GoToDefinitionParams>(path_id, wp);
799799
if(!result.has_value())
@@ -812,8 +812,7 @@ void MasterServer::register_handlers() {
812812
if(lifecycle != ServerLifecycle::Ready)
813813
co_return et::outcome_error(et::ipc::Error{"Server not ready"});
814814

815-
auto& uri = params.text_document_position_params.text_document.uri;
816-
auto path = uri_to_path(uri);
815+
auto path = uri_to_path(params.text_document_position_params.text_document.uri);
817816
auto path_id = path_pool.intern(path);
818817

819818
auto doc_it = documents.find(path_id);
@@ -822,13 +821,16 @@ void MasterServer::register_handlers() {
822821

823822
auto& doc = doc_it->second;
824823

824+
using eventide::ipc::lsp::PositionMapper;
825+
using eventide::ipc::lsp::PositionEncoding;
826+
PositionMapper mapper(doc.text, PositionEncoding::UTF16);
827+
825828
worker::CompletionParams wp;
826-
wp.uri = uri;
829+
wp.path = path;
827830
wp.version = doc.version;
828831
wp.text = doc.text;
829832
fill_compile_args(path, wp.directory, wp.arguments);
830-
wp.line = params.text_document_position_params.position.line;
831-
wp.character = params.text_document_position_params.position.character;
833+
wp.offset = mapper.to_offset(params.text_document_position_params.position);
832834

833835
auto result = co_await pool.send_stateless<worker::CompletionParams>(wp);
834836
if(!result.has_value())
@@ -843,8 +845,7 @@ void MasterServer::register_handlers() {
843845
if(lifecycle != ServerLifecycle::Ready)
844846
co_return et::outcome_error(et::ipc::Error{"Server not ready"});
845847

846-
auto& uri = params.text_document_position_params.text_document.uri;
847-
auto path = uri_to_path(uri);
848+
auto path = uri_to_path(params.text_document_position_params.text_document.uri);
848849
auto path_id = path_pool.intern(path);
849850

850851
auto doc_it = documents.find(path_id);
@@ -853,13 +854,16 @@ void MasterServer::register_handlers() {
853854

854855
auto& doc = doc_it->second;
855856

857+
using eventide::ipc::lsp::PositionMapper;
858+
using eventide::ipc::lsp::PositionEncoding;
859+
PositionMapper mapper(doc.text, PositionEncoding::UTF16);
860+
856861
worker::SignatureHelpParams wp;
857-
wp.uri = uri;
862+
wp.path = path;
858863
wp.version = doc.version;
859864
wp.text = doc.text;
860865
fill_compile_args(path, wp.directory, wp.arguments);
861-
wp.line = params.text_document_position_params.position.line;
862-
wp.character = params.text_document_position_params.position.character;
866+
wp.offset = mapper.to_offset(params.text_document_position_params.position);
863867

864868
auto result = co_await pool.send_stateless<worker::SignatureHelpParams>(wp);
865869
if(!result.has_value())

0 commit comments

Comments
 (0)