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