mirror of
https://github.com/dense-analysis/ale.git
synced 2025-12-06 12:44:23 +08:00
Implement pull diagnostics in the VimL implementation so ALE is able to track when servers are busy checking files. Only servers that support this feature will return diagnostics these ways.
258 lines
7.1 KiB
Plaintext
258 lines
7.1 KiB
Plaintext
Before:
|
|
function Range(start_line, start_char, end_line, end_char) abort
|
|
return {
|
|
\ 'start': {'line': a:start_line, 'character': a:start_char},
|
|
\ 'end': {'line': a:end_line, 'character': a:end_char},
|
|
\}
|
|
endfunction
|
|
|
|
After:
|
|
delfunction Range
|
|
|
|
Execute(ale#lsp#response#ReadDiagnostics() should handle errors):
|
|
AssertEqual [
|
|
\ {
|
|
\ 'type': 'E',
|
|
\ 'text': 'Something went wrong!',
|
|
\ 'lnum': 3,
|
|
\ 'col': 11,
|
|
\ 'end_lnum': 5,
|
|
\ 'end_col': 15,
|
|
\ 'code': 'some-error',
|
|
\ }
|
|
\ ],
|
|
\ ale#lsp#response#ReadDiagnostics([
|
|
\ {
|
|
\ 'severity': 1,
|
|
\ 'range': Range(2, 10, 4, 15),
|
|
\ 'code': 'some-error',
|
|
\ 'message': 'Something went wrong!',
|
|
\ },
|
|
\ ])
|
|
|
|
Execute(ale#lsp#response#ReadDiagnostics() should handle warnings):
|
|
AssertEqual [
|
|
\ {
|
|
\ 'type': 'W',
|
|
\ 'text': 'Something went wrong!',
|
|
\ 'lnum': 2,
|
|
\ 'col': 4,
|
|
\ 'end_lnum': 2,
|
|
\ 'end_col': 3,
|
|
\ 'code': 'some-warning',
|
|
\ }
|
|
\ ],
|
|
\ ale#lsp#response#ReadDiagnostics([
|
|
\ {
|
|
\ 'severity': 2,
|
|
\ 'range': Range(1, 3, 1, 3),
|
|
\ 'code': 'some-warning',
|
|
\ 'message': 'Something went wrong!',
|
|
\ },
|
|
\ ])
|
|
|
|
Execute(ale#lsp#response#ReadDiagnostics() should treat messages with missing severity as errors):
|
|
AssertEqual [
|
|
\ {
|
|
\ 'type': 'E',
|
|
\ 'text': 'Something went wrong!',
|
|
\ 'lnum': 3,
|
|
\ 'col': 11,
|
|
\ 'end_lnum': 5,
|
|
\ 'end_col': 15,
|
|
\ 'code': 'some-error',
|
|
\ }
|
|
\ ],
|
|
\ ale#lsp#response#ReadDiagnostics([
|
|
\ {
|
|
\ 'range': Range(2, 10, 4, 15),
|
|
\ 'code': 'some-error',
|
|
\ 'message': 'Something went wrong!',
|
|
\ },
|
|
\ ])
|
|
|
|
Execute(ale#lsp#response#ReadDiagnostics() should handle messages without codes):
|
|
AssertEqual [
|
|
\ {
|
|
\ 'type': 'E',
|
|
\ 'text': 'Something went wrong!',
|
|
\ 'lnum': 3,
|
|
\ 'col': 11,
|
|
\ 'end_lnum': 5,
|
|
\ 'end_col': 15,
|
|
\ }
|
|
\ ],
|
|
\ ale#lsp#response#ReadDiagnostics([
|
|
\ {
|
|
\ 'range': Range(2, 10, 4, 15),
|
|
\ 'message': 'Something went wrong!',
|
|
\ },
|
|
\ ])
|
|
|
|
Execute(ale#lsp#response#ReadDiagnostics() should include sources in detail):
|
|
AssertEqual [
|
|
\ {
|
|
\ 'type': 'E',
|
|
\ 'text': 'Something went wrong!',
|
|
\ 'detail': '[tslint] Something went wrong!',
|
|
\ 'lnum': 10,
|
|
\ 'col': 15,
|
|
\ 'end_lnum': 12,
|
|
\ 'end_col': 22,
|
|
\ }
|
|
\ ],
|
|
\ ale#lsp#response#ReadDiagnostics([
|
|
\ {
|
|
\ 'range': Range(9, 14, 11, 22),
|
|
\ 'message': 'Something went wrong!',
|
|
\ 'source': 'tslint',
|
|
\ }
|
|
\ ])
|
|
|
|
Execute(ale#lsp#response#ReadDiagnostics() should keep detail with line breaks but replace with spaces in text):
|
|
AssertEqual [
|
|
\ {
|
|
\ 'type': 'E',
|
|
\ 'text': 'cannot borrow `cap` as mutable more than once at a time mutable borrow starts here in previous iteration of loop',
|
|
\ 'detail': "[rustc] cannot borrow `cap` as mutable\r\nmore than once at a time\n\nmutable borrow starts here\rin previous iteration of loop",
|
|
\ 'lnum': 10,
|
|
\ 'col': 15,
|
|
\ 'end_lnum': 12,
|
|
\ 'end_col': 22,
|
|
\ }
|
|
\ ],
|
|
\ ale#lsp#response#ReadDiagnostics([
|
|
\ {
|
|
\ 'range': Range(9, 14, 11, 22),
|
|
\ 'message': "cannot borrow `cap` as mutable\r\nmore than once at a time\n\nmutable borrow starts here\rin previous iteration of loop",
|
|
\ 'source': 'rustc',
|
|
\ }
|
|
\ ])
|
|
|
|
Execute(ale#lsp#response#ReadDiagnostics() should consider -1 to be a meaningless code):
|
|
AssertEqual [
|
|
\ {
|
|
\ 'type': 'E',
|
|
\ 'text': 'Something went wrong!',
|
|
\ 'lnum': 3,
|
|
\ 'col': 11,
|
|
\ 'end_lnum': 5,
|
|
\ 'end_col': 15,
|
|
\ }
|
|
\ ],
|
|
\ ale#lsp#response#ReadDiagnostics([
|
|
\ {
|
|
\ 'range': Range(2, 10, 4, 15),
|
|
\ 'message': 'Something went wrong!',
|
|
\ 'code': -1,
|
|
\ },
|
|
\ ])
|
|
|
|
Execute(ale#lsp#response#ReadDiagnostics() should handle multiple messages):
|
|
AssertEqual [
|
|
\ {
|
|
\ 'type': 'E',
|
|
\ 'text': 'Something went wrong!',
|
|
\ 'lnum': 1,
|
|
\ 'col': 3,
|
|
\ 'end_lnum': 1,
|
|
\ 'end_col': 2,
|
|
\ },
|
|
\ {
|
|
\ 'type': 'W',
|
|
\ 'text': 'A warning',
|
|
\ 'lnum': 2,
|
|
\ 'col': 5,
|
|
\ 'end_lnum': 2,
|
|
\ 'end_col': 4,
|
|
\ },
|
|
\ ],
|
|
\ ale#lsp#response#ReadDiagnostics([
|
|
\ {
|
|
\ 'range': Range(0, 2, 0, 2),
|
|
\ 'message': 'Something went wrong!',
|
|
\ },
|
|
\ {
|
|
\ 'severity': 2,
|
|
\ 'range': Range(1, 4, 1, 4),
|
|
\ 'message': 'A warning',
|
|
\ },
|
|
\ ])
|
|
|
|
Execute(ale#lsp#response#ReadDiagnostics() should use relatedInformation for detail):
|
|
AssertEqual [
|
|
\ {
|
|
\ 'type': 'E',
|
|
\ 'text': 'Something went wrong!',
|
|
\ 'lnum': 1,
|
|
\ 'col': 3,
|
|
\ 'end_lnum': 1,
|
|
\ 'end_col': 2,
|
|
\ 'detail': "Something went wrong!\n/tmp/someotherfile.txt:43:80:\n\tmight be this"
|
|
\ }
|
|
\ ],
|
|
\ ale#lsp#response#ReadDiagnostics([
|
|
\ {
|
|
\ 'range': Range(0, 2, 0, 2),
|
|
\ 'message': 'Something went wrong!',
|
|
\ 'relatedInformation': [{
|
|
\ 'message': 'might be this',
|
|
\ 'location': {
|
|
\ 'uri': 'file:///tmp/someotherfile.txt',
|
|
\ 'range': {
|
|
\ 'start': { 'line': 42, 'character': 79 },
|
|
\ 'end': { 'line': 142, 'character': 179},
|
|
\ }
|
|
\ }
|
|
\ }]
|
|
\ }
|
|
\ ])
|
|
|
|
Execute(ale#lsp#response#ReadTSServerDiagnostics() should handle tsserver responses):
|
|
AssertEqual
|
|
\ [
|
|
\ {
|
|
\ 'type': 'E',
|
|
\ 'nr': 2365,
|
|
\ 'code': '2365',
|
|
\ 'text': 'Operator ''''+'''' cannot be applied to types ''''3'''' and ''''{}''''.',
|
|
\ 'lnum': 1,
|
|
\ 'col': 11,
|
|
\ 'end_lnum': 1,
|
|
\ 'end_col': 16,
|
|
\ },
|
|
\ ],
|
|
\ ale#lsp#response#ReadTSServerDiagnostics({"seq":0,"type":"event","event":"semanticDiag","body":{"file":"/bar/foo.ts","diagnostics":[{"start":{"line":1,"offset":11},"end":{"line":1,"offset":17},"text":"Operator ''+'' cannot be applied to types ''3'' and ''{}''.","code":2365}]}})
|
|
|
|
Execute(ale#lsp#response#ReadTSServerDiagnostics() should handle warnings from tsserver):
|
|
AssertEqual
|
|
\ [
|
|
\ {
|
|
\ 'lnum': 27,
|
|
\ 'col': 3,
|
|
\ 'nr': 2515,
|
|
\ 'code': '2515',
|
|
\ 'end_lnum': 27,
|
|
\ 'type': 'W',
|
|
\ 'end_col': 13,
|
|
\ 'text': 'Calls to ''console.log'' are not allowed. (no-console)',
|
|
\ }
|
|
\ ],
|
|
\ ale#lsp#response#ReadTSServerDiagnostics({"seq":0,"type":"event","event":"semanticDiag","body":{"file":"<removed>","diagnostics":[{"start":{"line":27,"offset":3},"end":{"line":27,"offset":14},"text":"Calls to 'console.log' are not allowed. (no-console)","code":2515,"category":"warning","source":"tslint"}]}})
|
|
|
|
Execute(ale#lsp#response#ReadTSServerDiagnostics() should handle suggestions from tsserver):
|
|
AssertEqual
|
|
\ [
|
|
\ {
|
|
\ 'lnum': 27,
|
|
\ 'col': 3,
|
|
\ 'nr': 2515,
|
|
\ 'code': '2515',
|
|
\ 'end_lnum': 27,
|
|
\ 'type': 'I',
|
|
\ 'end_col': 13,
|
|
\ 'text': 'Some info',
|
|
\ }
|
|
\ ],
|
|
\ ale#lsp#response#ReadTSServerDiagnostics({"seq":0,"type":"event","event":"semanticDiag","body":{"file":"<removed>","diagnostics":[{"start":{"line":27,"offset":3},"end":{"line":27,"offset":14},"text":"Some info","code":2515,"category":"suggestion","source":"tslint"}]}})
|