@@ -12,14 +12,14 @@ function! lsp#internal#linked_editing_range#_enable() abort
1212 if ! s: TextEdit .is_text_mark_preserved ()
1313 return
1414 endif
15-
1615 if ! g: lsp_linked_editing_range_enabled | return | endif
16+
1717 let s: Dispose = lsp#callbag#merge (
1818 \ lsp#callbag#pipe (
1919 \ lsp#callbag#fromEvent ([' InsertEnter' ]),
20- \ lsp#callbag#flatMap ({ - > s: request ( v: false ) }),
20+ \ lsp#callbag#flatMap ({ - > s: request_sync ( ) }),
2121 \ lsp#callbag#subscribe ({
22- \ ' next' : { x - > s: prepare( x ) }
22+ \ ' next' : { x - > call ( ' s:prepare' , x ) }
2323 \ })
2424 \ ),
2525 \ lsp#callbag#pipe (
@@ -42,43 +42,52 @@ function! lsp#internal#linked_editing_range#_disable() abort
4242 endif
4343endfunction
4444
45- function ! s: request (sync ) abort
45+ function ! lsp#internal#linked_editing_range#prepare () abort
46+ if ! s: TextEdit .is_text_mark_preserved ()
47+ return ' '
48+ endif
49+ if ! g: lsp_linked_editing_range_enabled
50+ return ' '
51+ endif
52+
53+ call lsp#callbag#pipe (
54+ \ s: request_sync (),
55+ \ lsp#callbag#subscribe ({
56+ \ ' next' : { x - > call (' s:prepare' , x ) },
57+ \ ' error' : { - > {} },
58+ \ })
59+ \ )
60+ return ' '
61+ endfunction
62+
63+ function ! s: request_sync () abort
4664 let l: server = lsp#get_allowed_servers (&filetype )
4765 let l: server = filter (l: server , ' lsp#capabilities#has_linked_editing_range_provider(v:val)' )
4866 let l: server = get (l: server , 0 , v: null )
4967 if empty (l: server )
50- return lsp#callbag#empty ( )
68+ return lsp#callbag#of ([ v: null ] )
5169 endif
5270
53- let l: X = lsp#callbag#pipe (
54- \ lsp#request (l: server , {
55- \ ' method' : ' textDocument/linkedEditingRange' ,
56- \ ' params' : {
57- \ ' textDocument' : lsp#get_text_document_identifier (),
58- \ ' position' : lsp#get_position (),
59- \ }
60- \ }),
71+ return lsp#callbag#of (
72+ \ lsp#callbag#pipe (
73+ \ lsp#request (l: server , {
74+ \ ' method' : ' textDocument/linkedEditingRange' ,
75+ \ ' params' : {
76+ \ ' textDocument' : lsp#get_text_document_identifier (),
77+ \ ' position' : lsp#get_position (),
78+ \ }
79+ \ }),
80+ \ lsp#callbag#toList ()
81+ \ ).wait ({ ' sleep' : 1 , ' timeout' : 200 })
6182 \ )
62- if a: sync
63- return lsp#callbag#of (
64- \ get (
65- \ lsp#callbag#pipe (
66- \ l: X ,
67- \ lsp#callbag#toList ()
68- \ ).wait ({ ' sleep' : 1 , ' timeout' : 200 }),
69- \ 0 ,
70- \ v: null
71- \ )
72- \ )
73- endif
74- return l: X
7583endfunction
7684
7785function ! s: prepare (x ) abort
78- if empty (get (a: x [' response' ][ ' result' ], ' ranges' , {} ))
79- return
86+ if empty (a: x ) || empty ( get (a: x, ' response ' )) || empty ( get ( a: x [' response' ], ' result ' )) || empty ( get ( a: x [ ' response ' ][ ' result' ], ' ranges' ))
87+ return
8088 endif
8189
90+ call s: clear ()
8291 call s: TextMark .set (bufnr (' %' ), s: TEXT_MARK_NAMESPACE , map (a: x [' response' ][' result' ][' ranges' ], { _, range - > {
8392 \ ' range' : range ,
8493 \ ' highlight' : ' Underlined' ,
@@ -100,7 +109,7 @@ function! s:sync() abort
100109 if s: state [' changedtick' ] == b: changedtick
101110 return
102111 endif
103- if s: state [' changenr' ] > changenr ()
112+ if s: state [' changenr' ] > changenr ()
104113 return
105114 endif
106115
0 commit comments