fortrangoingonforty/facsimile / 21eb341

Browse files

Fix LSP compilation: use indices not pointers for server refs

Co-Authored-By: mfwolffe <wolffemf@dukes.jmu.edu>
Authored by espadonne
SHA
21eb3412a4c0d4d09e83c4e64446db49458d83d4
Parents
6b71159
Tree
3271a54

2 changed files

StatusFile+-
M src/lsp/lsp_client_module.f90 70 70
M src/lsp/lsp_process_wrapper.c 5 5
src/lsp/lsp_client_module.f90modified
@@ -25,9 +25,31 @@ module lsp_client_module
2525
         character(len=:), allocatable :: file_path
2626
         character(len=:), allocatable :: language_id
2727
         integer :: version = 0
28
-        type(lsp_server_t), pointer :: server => null()
28
+        integer :: server_index = 0  ! 0 means no server assigned
2929
     end type document_info_t
3030
 
31
+    ! Type stubs for return types
32
+    type :: lsp_completion_t
33
+        character(len=:), allocatable :: label
34
+        character(len=:), allocatable :: detail
35
+    end type lsp_completion_t
36
+
37
+    type :: lsp_location_t
38
+        character(len=:), allocatable :: uri
39
+        integer :: line
40
+        integer :: column
41
+    end type lsp_location_t
42
+
43
+    type :: lsp_document_symbol_t
44
+        character(len=:), allocatable :: name
45
+        integer :: kind
46
+    end type lsp_document_symbol_t
47
+
48
+    type :: lsp_code_action_t
49
+        character(len=:), allocatable :: title
50
+        character(len=:), allocatable :: command
51
+    end type lsp_code_action_t
52
+
3153
     ! Main LSP client
3254
     type :: lsp_client_t
3355
         type(lsp_manager_t) :: manager
@@ -77,7 +99,7 @@ contains
7799
         type(lsp_server_t), pointer :: server
78100
         type(lsp_message_t) :: msg
79101
         character(len=:), allocatable :: lang_id, uri
80
-        integer :: i
102
+        integer :: i, server_index
81103
 
82104
         ! Check if already open
83105
         do i = 1, client%num_documents
@@ -96,8 +118,8 @@ contains
96118
         end if
97119
 
98120
         ! Get or start server for this language
99
-        server => get_or_start_server(client%manager, lang_id, client%workspace_root)
100
-        if (.not. associated(server)) return
121
+        server_index = get_or_start_server(client%manager, lang_id, client%workspace_root)
122
+        if (server_index <= 0) return
101123
 
102124
         ! Build URI
103125
         uri = file_path_to_uri(file_path)
@@ -112,16 +134,16 @@ contains
112134
         new_documents(client%num_documents + 1)%file_path = file_path
113135
         new_documents(client%num_documents + 1)%language_id = lang_id
114136
         new_documents(client%num_documents + 1)%version = 1
115
-        new_documents(client%num_documents + 1)%server => server
137
+        new_documents(client%num_documents + 1)%server_index = server_index
116138
 
117139
         deallocate(client%documents)
118140
         client%documents = new_documents
119141
         client%num_documents = client%num_documents + 1
120142
 
121143
         ! Send didOpen notification
122
-        if (server%initialized) then
144
+        if (client%manager%servers(server_index)%initialized) then
123145
             msg = create_did_open_notification(uri, lang_id, 1, content)
124
-            call send_notification(server, msg)
146
+            call send_notification(client%manager%servers(server_index), msg)
125147
         end if
126148
     end subroutine open_document
127149
 
@@ -134,10 +156,10 @@ contains
134156
         do i = 1, client%num_documents
135157
             if (client%documents(i)%file_path == file_path) then
136158
                 ! Send didClose notification
137
-                if (associated(client%documents(i)%server)) then
138
-                    if (client%documents(i)%server%initialized) then
159
+                if (client%documents(i)%server_index > 0) then
160
+                    if (client%manager%servers(client%documents(i)%server_index)%initialized) then
139161
                         msg = create_did_close_notification(client%documents(i)%uri)
140
-                        call send_notification(client%documents(i)%server, msg)
162
+                        call send_notification(client%manager%servers(client%documents(i)%server_index), msg)
141163
                     end if
142164
                 end if
143165
 
@@ -160,14 +182,14 @@ contains
160182
 
161183
         do i = 1, client%num_documents
162184
             if (client%documents(i)%file_path == file_path) then
163
-                if (associated(client%documents(i)%server)) then
164
-                    if (client%documents(i)%server%initialized) then
185
+                if (client%documents(i)%server_index > 0) then
186
+                    if (client%manager%servers(client%documents(i)%server_index)%initialized) then
165187
                         if (present(content)) then
166188
                             msg = create_did_save_notification(client%documents(i)%uri, content)
167189
                         else
168190
                             msg = create_did_save_notification(client%documents(i)%uri)
169191
                         end if
170
-                        call send_notification(client%documents(i)%server, msg)
192
+                        call send_notification(client%manager%servers(client%documents(i)%server_index), msg)
171193
                     end if
172194
                 end if
173195
                 exit
@@ -185,11 +207,11 @@ contains
185207
             if (client%documents(i)%file_path == file_path) then
186208
                 client%documents(i)%version = client%documents(i)%version + 1
187209
 
188
-                if (associated(client%documents(i)%server)) then
189
-                    if (client%documents(i)%server%initialized) then
210
+                if (client%documents(i)%server_index > 0) then
211
+                    if (client%manager%servers(client%documents(i)%server_index)%initialized) then
190212
                         msg = create_did_change_notification(client%documents(i)%uri, &
191213
                                                             client%documents(i)%version, content)
192
-                        call send_notification(client%documents(i)%server, msg)
214
+                        call send_notification(client%manager%servers(client%documents(i)%server_index), msg)
193215
                     end if
194216
                 end if
195217
                 exit
@@ -209,12 +231,12 @@ contains
209231
 
210232
         do i = 1, client%num_documents
211233
             if (client%documents(i)%file_path == file_path) then
212
-                if (associated(client%documents(i)%server)) then
213
-                    if (client%documents(i)%server%initialized .and. &
214
-                        client%documents(i)%server%supports_completion) then
234
+                if (client%documents(i)%server_index > 0) then
235
+                    if (client%manager%servers(client%documents(i)%server_index)%initialized .and. &
236
+                        client%manager%servers(client%documents(i)%server_index)%supports_completion) then
215237
                         msg = create_completion_request(client%documents(i)%uri, &
216238
                                                        line - 1, column - 1)  ! LSP is 0-based
217
-                        call send_request(client%documents(i)%server, msg)
239
+                        call send_request(client%manager%servers(client%documents(i)%server_index), msg)
218240
                         ! TODO: Wait for and process response
219241
                     end if
220242
                 end if
@@ -235,12 +257,12 @@ contains
235257
 
236258
         do i = 1, client%num_documents
237259
             if (client%documents(i)%file_path == file_path) then
238
-                if (associated(client%documents(i)%server)) then
239
-                    if (client%documents(i)%server%initialized .and. &
240
-                        client%documents(i)%server%supports_hover) then
260
+                if (client%documents(i)%server_index > 0) then
261
+                    if (client%manager%servers(client%documents(i)%server_index)%initialized .and. &
262
+                        client%manager%servers(client%documents(i)%server_index)%supports_hover) then
241263
                         msg = create_hover_request(client%documents(i)%uri, &
242264
                                                  line - 1, column - 1)  ! LSP is 0-based
243
-                        call send_request(client%documents(i)%server, msg)
265
+                        call send_request(client%manager%servers(client%documents(i)%server_index), msg)
244266
                         ! TODO: Wait for and process response
245267
                     end if
246268
                 end if
@@ -261,12 +283,12 @@ contains
261283
 
262284
         do i = 1, client%num_documents
263285
             if (client%documents(i)%file_path == file_path) then
264
-                if (associated(client%documents(i)%server)) then
265
-                    if (client%documents(i)%server%initialized .and. &
266
-                        client%documents(i)%server%supports_definition) then
286
+                if (client%documents(i)%server_index > 0) then
287
+                    if (client%manager%servers(client%documents(i)%server_index)%initialized .and. &
288
+                        client%manager%servers(client%documents(i)%server_index)%supports_definition) then
267289
                         msg = create_definition_request(client%documents(i)%uri, &
268290
                                                        line - 1, column - 1)  ! LSP is 0-based
269
-                        call send_request(client%documents(i)%server, msg)
291
+                        call send_request(client%manager%servers(client%documents(i)%server_index), msg)
270292
                         ! TODO: Wait for and process response
271293
                     end if
272294
                 end if
@@ -291,12 +313,12 @@ contains
291313
 
292314
         do i = 1, client%num_documents
293315
             if (client%documents(i)%file_path == file_path) then
294
-                if (associated(client%documents(i)%server)) then
295
-                    if (client%documents(i)%server%initialized .and. &
296
-                        client%documents(i)%server%supports_references) then
316
+                if (client%documents(i)%server_index > 0) then
317
+                    if (client%manager%servers(client%documents(i)%server_index)%initialized .and. &
318
+                        client%manager%servers(client%documents(i)%server_index)%supports_references) then
297319
                         msg = create_references_request(client%documents(i)%uri, &
298320
                                                        line - 1, column - 1, include_decl)
299
-                        call send_request(client%documents(i)%server, msg)
321
+                        call send_request(client%manager%servers(client%documents(i)%server_index), msg)
300322
                         ! TODO: Wait for and process response
301323
                     end if
302324
                 end if
@@ -316,11 +338,11 @@ contains
316338
 
317339
         do i = 1, client%num_documents
318340
             if (client%documents(i)%file_path == file_path) then
319
-                if (associated(client%documents(i)%server)) then
320
-                    if (client%documents(i)%server%initialized .and. &
321
-                        client%documents(i)%server%supports_document_symbols) then
341
+                if (client%documents(i)%server_index > 0) then
342
+                    if (client%manager%servers(client%documents(i)%server_index)%initialized .and. &
343
+                        client%manager%servers(client%documents(i)%server_index)%supports_document_symbols) then
322344
                         msg = create_document_symbols_request(client%documents(i)%uri)
323
-                        call send_request(client%documents(i)%server, msg)
345
+                        call send_request(client%manager%servers(client%documents(i)%server_index), msg)
324346
                         ! TODO: Wait for and process response
325347
                     end if
326348
                 end if
@@ -346,11 +368,11 @@ contains
346368
 
347369
         do i = 1, client%num_documents
348370
             if (client%documents(i)%file_path == file_path) then
349
-                if (associated(client%documents(i)%server)) then
350
-                    if (client%documents(i)%server%initialized .and. &
351
-                        client%documents(i)%server%supports_formatting) then
371
+                if (client%documents(i)%server_index > 0) then
372
+                    if (client%manager%servers(client%documents(i)%server_index)%initialized .and. &
373
+                        client%manager%servers(client%documents(i)%server_index)%supports_formatting) then
352374
                         msg = create_formatting_request(client%documents(i)%uri, tabs, spaces)
353
-                        call send_request(client%documents(i)%server, msg)
375
+                        call send_request(client%manager%servers(client%documents(i)%server_index), msg)
354376
                         ! TODO: Wait for and process response
355377
                     end if
356378
                 end if
@@ -368,12 +390,12 @@ contains
368390
 
369391
         do i = 1, client%num_documents
370392
             if (client%documents(i)%file_path == file_path) then
371
-                if (associated(client%documents(i)%server)) then
372
-                    if (client%documents(i)%server%initialized .and. &
373
-                        client%documents(i)%server%supports_rename) then
393
+                if (client%documents(i)%server_index > 0) then
394
+                    if (client%manager%servers(client%documents(i)%server_index)%initialized .and. &
395
+                        client%manager%servers(client%documents(i)%server_index)%supports_rename) then
374396
                         msg = create_rename_request(client%documents(i)%uri, &
375397
                                                   line - 1, column - 1, new_name)
376
-                        call send_request(client%documents(i)%server, msg)
398
+                        call send_request(client%manager%servers(client%documents(i)%server_index), msg)
377399
                         ! TODO: Wait for and process response
378400
                     end if
379401
                 end if
@@ -395,13 +417,13 @@ contains
395417
 
396418
         do i = 1, client%num_documents
397419
             if (client%documents(i)%file_path == file_path) then
398
-                if (associated(client%documents(i)%server)) then
399
-                    if (client%documents(i)%server%initialized .and. &
400
-                        client%documents(i)%server%supports_code_actions) then
420
+                if (client%documents(i)%server_index > 0) then
421
+                    if (client%manager%servers(client%documents(i)%server_index)%initialized .and. &
422
+                        client%manager%servers(client%documents(i)%server_index)%supports_code_actions) then
401423
                         msg = create_code_action_request(client%documents(i)%uri, &
402424
                                                         start_line - 1, start_col - 1, &
403425
                                                         end_line - 1, end_col - 1)
404
-                        call send_request(client%documents(i)%server, msg)
426
+                        call send_request(client%manager%servers(client%documents(i)%server_index), msg)
405427
                         ! TODO: Wait for and process response
406428
                     end if
407429
                 end if
@@ -474,26 +496,4 @@ contains
474496
         end if
475497
     end function file_path_to_uri
476498
 
477
-    ! Type stubs for return types (should be properly defined)
478
-    type :: lsp_completion_t
479
-        character(len=:), allocatable :: label
480
-        character(len=:), allocatable :: detail
481
-    end type lsp_completion_t
482
-
483
-    type :: lsp_location_t
484
-        character(len=:), allocatable :: uri
485
-        integer :: line
486
-        integer :: column
487
-    end type lsp_location_t
488
-
489
-    type :: lsp_document_symbol_t
490
-        character(len=:), allocatable :: name
491
-        integer :: kind
492
-    end type lsp_document_symbol_t
493
-
494
-    type :: lsp_code_action_t
495
-        character(len=:), allocatable :: title
496
-        character(len=:), allocatable :: command
497
-    end type lsp_code_action_t
498
-
499499
 end module lsp_client_module
src/lsp/lsp_process_wrapper.cmodified
@@ -85,7 +85,7 @@ lsp_process_t* lsp_start_server(const char* command) {
8585
 int lsp_send_message(lsp_process_t* proc, const char* message, int len) {
8686
     if (!proc || proc->stdin_fd < 0) return -1;
8787
 
88
-    int written = write(proc->stdin_fd, message, len);
88
+    ssize_t written = write(proc->stdin_fd, message, (size_t)len);
8989
     if (written < 0) {
9090
         if (errno != EAGAIN && errno != EWOULDBLOCK) {
9191
             return -1;
@@ -93,14 +93,14 @@ int lsp_send_message(lsp_process_t* proc, const char* message, int len) {
9393
         return 0;
9494
     }
9595
 
96
-    return written;
96
+    return (int)written;
9797
 }
9898
 
9999
 // Read data from LSP server (non-blocking)
100100
 int lsp_read_message(lsp_process_t* proc, char* buffer, int max_len) {
101101
     if (!proc || proc->stdout_fd < 0) return -1;
102102
 
103
-    int bytes_read = read(proc->stdout_fd, buffer, max_len - 1);
103
+    ssize_t bytes_read = read(proc->stdout_fd, buffer, (size_t)(max_len - 1));
104104
     if (bytes_read < 0) {
105105
         if (errno == EAGAIN || errno == EWOULDBLOCK) {
106106
             return 0;  // No data available
@@ -112,7 +112,7 @@ int lsp_read_message(lsp_process_t* proc, char* buffer, int max_len) {
112112
         buffer[bytes_read] = '\0';
113113
     }
114114
 
115
-    return bytes_read;
115
+    return (int)bytes_read;
116116
 }
117117
 
118118
 // Check if process is still running
@@ -214,4 +214,4 @@ int lsp_is_running_f(void** handle) {
214214
 int lsp_get_pid_f(void** handle) {
215215
     if (!*handle) return -1;
216216
     return lsp_get_pid((lsp_process_t*)*handle);
217
-}
217
+}