@@ -12,14 +12,14 @@ function! lsp#internal#linked_editing_range#_enable() abort
12
12
if ! s: TextEdit .is_text_mark_preserved ()
13
13
return
14
14
endif
15
-
16
15
if ! g: lsp_linked_editing_range_enabled | return | endif
16
+
17
17
let s: Dispose = lsp#callbag#merge (
18
18
\ lsp#callbag#pipe (
19
19
\ lsp#callbag#fromEvent ([' InsertEnter' ]),
20
- \ lsp#callbag#flatMap ({ - > s: request ( v: false ) }),
20
+ \ lsp#callbag#flatMap ({ - > s: request_sync ( ) }),
21
21
\ lsp#callbag#subscribe ({
22
- \ ' next' : { x - > s: prepare( x ) }
22
+ \ ' next' : { x - > call ( ' s:prepare' , x ) }
23
23
\ })
24
24
\ ),
25
25
\ lsp#callbag#pipe (
@@ -42,43 +42,52 @@ function! lsp#internal#linked_editing_range#_disable() abort
42
42
endif
43
43
endfunction
44
44
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
46
64
let l: server = lsp#get_allowed_servers (&filetype )
47
65
let l: server = filter (l: server , ' lsp#capabilities#has_linked_editing_range_provider(v:val)' )
48
66
let l: server = get (l: server , 0 , v: null )
49
67
if empty (l: server )
50
- return lsp#callbag#empty ( )
68
+ return lsp#callbag#of ([ v: null ] )
51
69
endif
52
70
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 })
61
82
\ )
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
75
83
endfunction
76
84
77
85
function ! 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
80
88
endif
81
89
90
+ call s: clear ()
82
91
call s: TextMark .set (bufnr (' %' ), s: TEXT_MARK_NAMESPACE , map (a: x [' response' ][' result' ][' ranges' ], { _, range - > {
83
92
\ ' range' : range ,
84
93
\ ' highlight' : ' Underlined' ,
@@ -100,7 +109,7 @@ function! s:sync() abort
100
109
if s: state [' changedtick' ] == b: changedtick
101
110
return
102
111
endif
103
- if s: state [' changenr' ] > changenr ()
112
+ if s: state [' changenr' ] > changenr ()
104
113
return
105
114
endif
106
115
0 commit comments