Skip to content

Commit 1ad73d4

Browse files
rschifflinautozimu
authored andcommitted
Use distinct sign ids when placing col signs (autozimu#143)
* Use distinct sign ids when placing col signs * Explicitly use the integer key of the diagnostics as the offset rather than the implicit ordering * Update local DiagnosticsDisplay to match json equivalent * Use sorted list of unique diagnostic names to determine exact sign id
1 parent 1c1e9fc commit 1ad73d4

File tree

2 files changed

+52
-11
lines changed

2 files changed

+52
-11
lines changed

rplugin/python3/LanguageClient/util.py

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from . logger import logger
1313
from . Sign import Sign
1414
from .CompletionItemKind import convert_CompletionItemKind_to_vim_kind
15+
from .DiagnosticsDisplay import DiagnosticsDisplay
1516

1617
project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
1718

@@ -113,6 +114,21 @@ def escape(string: str) -> str:
113114
return string.replace("'", "''")
114115

115116

117+
def convert_Sign_to_vim_sign_id(sign: Sign) -> int:
118+
# Vim sign ids are a global namespace restricted to signed 32-bit integers.
119+
# As a polite attempt to avoid collisions with other plugins, we begin numbering far from 0
120+
base_id = 75000
121+
122+
diagnostic_names = sorted(set(map(lambda diag: diag["name"], DiagnosticsDisplay.values())))
123+
diagnostic_offset = 0
124+
for offset, name in enumerate(diagnostic_names):
125+
if name == sign.signname:
126+
diagnostic_offset = offset
127+
break
128+
line_multi = len(diagnostic_names)
129+
return base_id + ((sign.line - 1) * line_multi) + diagnostic_offset
130+
131+
116132
def retry(span, count, condition):
117133
while count > 0 and condition():
118134
logger.info("retrying...")
@@ -128,13 +144,14 @@ def get_command_goto_file(path, bufnames, l, c) -> str:
128144

129145

130146
def get_command_delete_sign(sign: Sign) -> str:
131-
return " | execute('sign unplace {}')".format(sign.line)
147+
return " | execute('sign unplace {} buffer={}')".format(
148+
convert_Sign_to_vim_sign_id(sign), sign.bufnumber)
132149

133150

134151
def get_command_add_sign(sign: Sign) -> str:
135152
return (" | execute('sign place {} line={} "
136153
"name=LanguageClient{} buffer={}')").format(
137-
sign.line, sign.line, sign.signname, sign.bufnumber)
154+
convert_Sign_to_vim_sign_id(sign), sign.line, sign.signname, sign.bufnumber)
138155

139156

140157
def get_command_update_signs(signs: List[Sign], next_signs: List[Sign]) -> str:

rplugin/python3/LanguageClient/util_test.py

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,38 @@ def test_getGotoFileCommand():
4949

5050
def test_getCommandDeleteSign():
5151
sign = Sign(1, "Error", 1)
52-
assert get_command_delete_sign(sign) == " | execute('sign unplace 1')"
52+
assert get_command_delete_sign(sign) == " | execute('sign unplace 75000 buffer=1')"
53+
54+
sign = Sign(1, "Hint", 2)
55+
assert get_command_delete_sign(sign) == " | execute('sign unplace 75001 buffer=2')"
56+
57+
sign = Sign(1, "Information", 3)
58+
assert get_command_delete_sign(sign) == " | execute('sign unplace 75002 buffer=3')"
59+
60+
sign = Sign(1, "Warning", 4)
61+
assert get_command_delete_sign(sign) == " | execute('sign unplace 75003 buffer=4')"
5362

5463

5564
def test_getCommandAddSign():
56-
sign = Sign(1, "Error", 1)
65+
sign = Sign(7, "Error", 4)
5766
assert (get_command_add_sign(sign) ==
58-
" | execute('sign place 1 line=1"
59-
" name=LanguageClientError buffer=1')")
67+
" | execute('sign place 75024 line=7"
68+
" name=LanguageClientError buffer=4')")
69+
70+
sign = Sign(7, "Hint", 3)
71+
assert (get_command_add_sign(sign) ==
72+
" | execute('sign place 75025 line=7"
73+
" name=LanguageClientHint buffer=3')")
74+
75+
sign = Sign(7, "Information", 2)
76+
assert (get_command_add_sign(sign) ==
77+
" | execute('sign place 75026 line=7"
78+
" name=LanguageClientInformation buffer=2')")
79+
80+
sign = Sign(7, "Warning", 1)
81+
assert (get_command_add_sign(sign) ==
82+
" | execute('sign place 75027 line=7"
83+
" name=LanguageClientWarning buffer=1')")
6084

6185

6286
def test_getCommandUpdateSigns_unique():
@@ -70,7 +94,7 @@ def test_getCommandUpdateSigns_unique():
7094
Sign(3, "Error", 1),
7195
]
7296
assert (get_command_update_signs(signs, nextSigns) ==
73-
"echo | execute('sign place 2 line=2"
97+
"echo | execute('sign place 75004 line=2"
7498
" name=LanguageClientError buffer=1')")
7599

76100

@@ -92,10 +116,10 @@ def test_getCommandUpdateSigns_withDuplicates():
92116
]
93117

94118
cmd = get_command_update_signs(signs, nextSigns)
95-
assert "execute('sign place 1 line=1 name=LanguageClientError buffer=1')" not in cmd
96-
assert "execute('sign place 2 line=2 name=LanguageClientError buffer=1')" in cmd
97-
assert "execute('sign unplace 3')" in cmd
98-
assert "execute('sign unplace 4')" not in cmd
119+
assert "execute('sign place 75000 line=1 name=LanguageClientError buffer=1')" not in cmd
120+
assert "execute('sign place 75004 line=2 name=LanguageClientError buffer=1')" in cmd
121+
assert "execute('sign unplace 75008 buffer=1')" in cmd
122+
assert "execute('sign unplace 75012 buffer=1')" not in cmd
99123

100124

101125
def test_convertVimCommandArgsToKwargs():

0 commit comments

Comments
 (0)