mirror of
https://github.com/dense-analysis/ale
synced 2024-12-18 04:15:39 +00:00
Add support for jsonnetfmt and jsonnet-lint (#3907)
* update to lates Signed-off-by: Trevor Whitney <trevorjwhitney@gmail.com> * fix up docs Signed-off-by: Trevor Whitney <trevorjwhitney@gmail.com> * fix docs Signed-off-by: Trevor Whitney <trevorjwhitney@gmail.com> * get tests passing Signed-off-by: Trevor Whitney <trevorjwhitney@gmail.com> * update regex Signed-off-by: Trevor Whitney <trevorjwhitney@gmail.com> * use ale#Pad and AssertFixer Signed-off-by: Trevor Whitney <trevorjwhitney@gmail.com>
This commit is contained in:
parent
2f72a3ed19
commit
f8a4c78b5b
59
ale_linters/jsonnet/jsonnet_lint.vim
Normal file
59
ale_linters/jsonnet/jsonnet_lint.vim
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
" Author: Trevor Whitney <trevorjwhitney@gmail.com>
|
||||||
|
" Description: jsonnet-lint for jsonnet files
|
||||||
|
|
||||||
|
call ale#Set('jsonnet_jsonnet_lint_executable', 'jsonnet-lint')
|
||||||
|
call ale#Set('jsonnet_jsonnet_lint_options', '')
|
||||||
|
|
||||||
|
function! ale_linters#jsonnet#jsonnet_lint#GetCommand(buffer) abort
|
||||||
|
let l:options = ale#Var(a:buffer, 'jsonnet_jsonnet_lint_options')
|
||||||
|
|
||||||
|
return '%e'
|
||||||
|
\ . ale#Pad(l:options)
|
||||||
|
\ . ' %t'
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
function! ale_linters#jsonnet#jsonnet_lint#Handle(buffer, lines) abort
|
||||||
|
" Matches patterns line the following:
|
||||||
|
"
|
||||||
|
" ERROR: foo.jsonnet:22:3-12 expected token OPERATOR but got (IDENTIFIER, "bar")
|
||||||
|
" ERROR: hoge.jsonnet:20:3 unexpected: "}" while parsing terminal
|
||||||
|
" ERROR: main.jsonnet:212:1-14 Expected , or ; but got (IDENTIFIER, "older_cluster")
|
||||||
|
let l:pattern = '^ERROR: [^:]*:\(\d\+\):\(\d\+\)\(-\d\+\)* \(.*\)'
|
||||||
|
let l:output = []
|
||||||
|
|
||||||
|
for l:line in a:lines
|
||||||
|
let l:match = matchlist(l:line, l:pattern)
|
||||||
|
|
||||||
|
if len(l:match) == 0
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
|
||||||
|
let line_number = l:match[1] + 0
|
||||||
|
let column = l:match[2] + 0
|
||||||
|
" l:match[3] has optional -14, when linter is showing a range
|
||||||
|
let text = l:match[4]
|
||||||
|
|
||||||
|
|
||||||
|
" vcol is Needed to indicate that the column is a character.
|
||||||
|
call add(l:output, {
|
||||||
|
\ 'bufnr': a:buffer,
|
||||||
|
\ 'lnum': line_number,
|
||||||
|
\ 'vcol': 0,
|
||||||
|
\ 'col': column,
|
||||||
|
\ 'text': text,
|
||||||
|
\ 'type': 'E',
|
||||||
|
\ 'nr': -1,
|
||||||
|
\})
|
||||||
|
endfor
|
||||||
|
|
||||||
|
return l:output
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
call ale#linter#Define('jsonnet', {
|
||||||
|
\ 'name': 'jsonnet_lint',
|
||||||
|
\ 'output_stream': 'stderr',
|
||||||
|
\ 'executable': {b -> ale#Var(b, 'jsonnet_jsonnet_lint_executable')},
|
||||||
|
\ 'command': function('ale_linters#jsonnet#jsonnet_lint#GetCommand'),
|
||||||
|
\ 'callback': 'ale_linters#jsonnet#jsonnet_lint#Handle',
|
||||||
|
\})
|
52
ale_linters/jsonnet/jsonnetfmt.vim
Normal file
52
ale_linters/jsonnet/jsonnetfmt.vim
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
" Authors: Trevor Whitney <trevorjwhitney@gmail.com> and Takuya Kosugiyama <re@itkq.jp>
|
||||||
|
" Description: jsonnetfmt for jsonnet files
|
||||||
|
|
||||||
|
call ale#Set('jsonnet_jsonnetfmt_executable', 'jsonnetfmt')
|
||||||
|
call ale#Set('jsonnet_jsonnetfmt_options', '')
|
||||||
|
|
||||||
|
function! ale_linters#jsonnet#jsonnetfmt#GetCommand(buffer) abort
|
||||||
|
let l:options = ale#Var(a:buffer, 'jsonnet_jsonnetfmt_options')
|
||||||
|
|
||||||
|
return '%e'
|
||||||
|
\ . ale#Pad(l:options)
|
||||||
|
\ . ' %t'
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
function! ale_linters#jsonnet#jsonnetfmt#Handle(buffer, lines) abort
|
||||||
|
" Matches patterns line the following:
|
||||||
|
"
|
||||||
|
" STATIC ERROR: foo.jsonnet:22:3-12: expected token OPERATOR but got (IDENTIFIER, "bar")
|
||||||
|
" STATIC ERROR: hoge.jsonnet:20:3: unexpected: "}" while parsing terminal
|
||||||
|
let l:pattern = '^STATIC ERROR:[^:]*:\(\d\+\):\(\d\+\):*\(-\d\+\)* \(.*\)'
|
||||||
|
let l:output = []
|
||||||
|
|
||||||
|
for l:line in a:lines
|
||||||
|
let l:match = matchlist(l:line, l:pattern)
|
||||||
|
|
||||||
|
if len(l:match) == 0
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
|
||||||
|
" vcol is Needed to indicate that the column is a character.
|
||||||
|
call add(l:output, {
|
||||||
|
\ 'bufnr': a:buffer,
|
||||||
|
\ 'lnum': l:match[1] + 0,
|
||||||
|
\ 'vcol': 0,
|
||||||
|
\ 'col': l:match[2] + 0,
|
||||||
|
\ 'text': l:match[4],
|
||||||
|
\ 'type': 'E',
|
||||||
|
\ 'nr': -1,
|
||||||
|
\})
|
||||||
|
endfor
|
||||||
|
|
||||||
|
return l:output
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
call ale#linter#Define('jsonnet', {
|
||||||
|
\ 'name': 'jsonnetfmt',
|
||||||
|
\ 'output_stream': 'stderr',
|
||||||
|
\ 'executable': {b -> ale#Var(b, 'jsonnet_jsonnetfmt_executable')},
|
||||||
|
\ 'command': function('ale_linters#jsonnet#jsonnetfmt#GetCommand'),
|
||||||
|
\ 'callback': 'ale_linters#jsonnet#jsonnetfmt#Handle',
|
||||||
|
\})
|
@ -486,6 +486,11 @@ let s:default_registry = {
|
|||||||
\ 'suggested_filetypes': ['haskell'],
|
\ 'suggested_filetypes': ['haskell'],
|
||||||
\ 'description': 'A formatter for Haskell source code.',
|
\ 'description': 'A formatter for Haskell source code.',
|
||||||
\ },
|
\ },
|
||||||
|
\ 'jsonnetfmt': {
|
||||||
|
\ 'function': 'ale#fixers#jsonnetfmt#Fix',
|
||||||
|
\ 'suggested_filetypes': ['jsonnet'],
|
||||||
|
\ 'description': 'Fix jsonnet files with jsonnetfmt',
|
||||||
|
\ },
|
||||||
\ 'ptop': {
|
\ 'ptop': {
|
||||||
\ 'function': 'ale#fixers#ptop#Fix',
|
\ 'function': 'ale#fixers#ptop#Fix',
|
||||||
\ 'suggested_filetypes': ['pascal'],
|
\ 'suggested_filetypes': ['pascal'],
|
||||||
|
18
autoload/ale/fixers/jsonnetfmt.vim
Normal file
18
autoload/ale/fixers/jsonnetfmt.vim
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
" Authors: Trevor Whitney <trevorjwhitney@gmail.com> and Takuya Kosugiyama <re@itkq.jp>
|
||||||
|
" Description: Integration of jsonnetfmt with ALE.
|
||||||
|
|
||||||
|
call ale#Set('jsonnet_jsonnetfmt_executable', 'jsonnetfmt')
|
||||||
|
call ale#Set('jsonnet_jsonnetfmt_options', '')
|
||||||
|
|
||||||
|
function! ale#fixers#jsonnetfmt#Fix(buffer) abort
|
||||||
|
let l:executable = ale#Var(a:buffer, 'jsonnet_jsonnetfmt_executable')
|
||||||
|
let l:options = ale#Var(a:buffer, 'jsonnet_jsonnetfmt_options')
|
||||||
|
|
||||||
|
return {
|
||||||
|
\ 'command': ale#Escape(l:executable)
|
||||||
|
\ . ' -i'
|
||||||
|
\ . ale#Pad(l:options)
|
||||||
|
\ . ' %t',
|
||||||
|
\ 'read_temporary_file': 1,
|
||||||
|
\}
|
||||||
|
endfunction
|
43
doc/ale-jsonnet.txt
Normal file
43
doc/ale-jsonnet.txt
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
===============================================================================
|
||||||
|
ALE Jsonnet Integration *ale-jsonnet-options*
|
||||||
|
|
||||||
|
|
||||||
|
===============================================================================
|
||||||
|
jsonnetfmt *ale-jsonnet-jsonnetfmt*
|
||||||
|
|
||||||
|
g:ale_jsonnet_jsonnetfmt_executable *g:ale_jsonnet_jsonnetfmt_executable*
|
||||||
|
*b:ale_jsonnet_jsonnetfmt_executable*
|
||||||
|
Type: |String|
|
||||||
|
Default: `'jsonnetfmt'`
|
||||||
|
|
||||||
|
This option can be changed to change the path for `jsonnetfmt`.
|
||||||
|
|
||||||
|
|
||||||
|
g:ale_jsonnet_jsonnetfmt_options *g:ale_jsonnet_jsonnetfmt_options*
|
||||||
|
*b:ale_jsonnet_jsonnetfmt_options*
|
||||||
|
Type: |String|
|
||||||
|
Default: `''`
|
||||||
|
|
||||||
|
This option can be changed to pass extra options to `jsonnetfmt`.
|
||||||
|
|
||||||
|
|
||||||
|
===============================================================================
|
||||||
|
jsonnet-lint *ale-jsonnet-jsonnet-lint*
|
||||||
|
|
||||||
|
g:ale_jsonnet_jsonnet_lint_executable *g:ale_jsonnet_jsonnet_lint_executable*
|
||||||
|
*b:ale_jsonnet_jsonnet_lint_executable*
|
||||||
|
Type: |String|
|
||||||
|
Default: `'jsonnet-lint'`
|
||||||
|
|
||||||
|
This option can be changed to change the path for `jsonnet-lint`.
|
||||||
|
|
||||||
|
|
||||||
|
g:ale_jsonnet_jsonnet_lint_options *g:ale_jsonnet_jsonnet_lint_options*
|
||||||
|
*b:ale_jsonnet_jsonnet_lint_options*
|
||||||
|
Type: |String|
|
||||||
|
Default: `''`
|
||||||
|
|
||||||
|
This option can be changed to pass extra options to `jsonnet-lint`.
|
||||||
|
|
||||||
|
|
||||||
|
vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl:
|
@ -271,6 +271,9 @@ Notes:
|
|||||||
* `eslint`
|
* `eslint`
|
||||||
* JSONC
|
* JSONC
|
||||||
* `eslint`
|
* `eslint`
|
||||||
|
* Jsonnet
|
||||||
|
* `jsonnet-lint`
|
||||||
|
* `jsonnetfmt`
|
||||||
* Julia
|
* Julia
|
||||||
* `languageserver`
|
* `languageserver`
|
||||||
* Kotlin
|
* Kotlin
|
||||||
|
@ -2833,6 +2833,9 @@ documented in additional help files.
|
|||||||
spectral..............................|ale-json-spectral|
|
spectral..............................|ale-json-spectral|
|
||||||
jsonc...................................|ale-jsonc-options|
|
jsonc...................................|ale-jsonc-options|
|
||||||
eslint................................|ale-jsonc-eslint|
|
eslint................................|ale-jsonc-eslint|
|
||||||
|
jsonnet.................................|ale-jsonnet-options|
|
||||||
|
jsonnetfmt............................|ale-jsonnet-jsonnetfmt|
|
||||||
|
jsonnet-lint..........................|ale-jsonnet-jsonnet-lint|
|
||||||
json5...................................|ale-json5-options|
|
json5...................................|ale-json5-options|
|
||||||
eslint................................|ale-json5-eslint|
|
eslint................................|ale-json5-eslint|
|
||||||
julia...................................|ale-julia-options|
|
julia...................................|ale-julia-options|
|
||||||
|
@ -280,6 +280,9 @@ formatting.
|
|||||||
* [eslint](http://eslint.org/)
|
* [eslint](http://eslint.org/)
|
||||||
* JSONC
|
* JSONC
|
||||||
* [eslint](http://eslint.org/)
|
* [eslint](http://eslint.org/)
|
||||||
|
* Jsonnet
|
||||||
|
* [jsonnet-lint](https://jsonnet.org/learning/tools.html)
|
||||||
|
* [jsonnetfmt](https://jsonnet.org/learning/tools.html)
|
||||||
* Julia
|
* Julia
|
||||||
* [languageserver](https://github.com/JuliaEditorSupport/LanguageServer.jl)
|
* [languageserver](https://github.com/JuliaEditorSupport/LanguageServer.jl)
|
||||||
* Kotlin
|
* Kotlin
|
||||||
|
38
test/fixers/test_jsonnetfmt_fixer_callback.vader
Normal file
38
test/fixers/test_jsonnetfmt_fixer_callback.vader
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
Before:
|
||||||
|
Save g:ale_jsonnet_jsonnetfmt_executable
|
||||||
|
Save g:ale_jsonnet_jsonnetfmt_options
|
||||||
|
|
||||||
|
" Use an invalid global executable, so we don't match it.
|
||||||
|
let g:ale_jsonnet_jsonnetfmt_executable = 'xxxinvalid'
|
||||||
|
let g:ale_jsonnet_jsonnetfmt_options = ''
|
||||||
|
|
||||||
|
call ale#test#SetDirectory('/testplugin/test/fixers')
|
||||||
|
call ale#assert#SetUpFixerTest('jsonnet', 'jsonnetfmt')
|
||||||
|
|
||||||
|
After:
|
||||||
|
call ale#test#RestoreDirectory()
|
||||||
|
call ale#assert#TearDownFixerTest()
|
||||||
|
|
||||||
|
Execute(The jsonnetfmt callback should return the correct default values):
|
||||||
|
call ale#test#SetFilename('../jsonnet_files/testfile.jsonnet')
|
||||||
|
|
||||||
|
AssertFixer {
|
||||||
|
\ 'read_temporary_file': 1,
|
||||||
|
\ 'command': ale#Escape(g:ale_jsonnet_jsonnetfmt_executable)
|
||||||
|
\ . ' -i'
|
||||||
|
\ . ' %t',
|
||||||
|
\}
|
||||||
|
|
||||||
|
Execute(The jsonnetfmt callback should include custom options):
|
||||||
|
let g:ale_jsonnet_jsonnetfmt_options = '--pad-arrays'
|
||||||
|
|
||||||
|
call ale#test#SetFilename('../jsonnet_files/testfile.jsonnet')
|
||||||
|
|
||||||
|
AssertFixer {
|
||||||
|
\ 'read_temporary_file': 1,
|
||||||
|
\ 'command': ale#Escape(g:ale_jsonnet_jsonnetfmt_executable)
|
||||||
|
\ . ' -i'
|
||||||
|
\ . ' ' . g:ale_jsonnet_jsonnetfmt_options
|
||||||
|
\ . ' %t',
|
||||||
|
\}
|
||||||
|
|
1
test/jsonnet_files/testfile.jsonnet
Normal file
1
test/jsonnet_files/testfile.jsonnet
Normal file
@ -0,0 +1 @@
|
|||||||
|
{ foo: bar }
|
19
test/linter/test_jsonnet_lint.vader
Normal file
19
test/linter/test_jsonnet_lint.vader
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
Before:
|
||||||
|
call ale#assert#SetUpLinterTest('jsonnet', 'jsonnet_lint')
|
||||||
|
call ale#test#SetFilename('../jsonnet_files/testfile.jsonnet')
|
||||||
|
|
||||||
|
After:
|
||||||
|
Restore
|
||||||
|
|
||||||
|
call ale#assert#TearDownLinterTest()
|
||||||
|
|
||||||
|
Execute(The default jsonnet-lint command should be correct):
|
||||||
|
AssertLinter 'jsonnet-lint',
|
||||||
|
\ ale#Escape('jsonnet-lint') . ' %t'
|
||||||
|
|
||||||
|
Execute(jsonnet-lint command and options should be customizable):
|
||||||
|
let g:ale_jsonnet_jsonnet_lint_executable = 'jsonnet'
|
||||||
|
let g:ale_jsonnet_jsonnet_lint_options = 'fmt'
|
||||||
|
|
||||||
|
AssertLinter 'jsonnet',
|
||||||
|
\ ale#Escape('jsonnet') . ' fmt %t'
|
19
test/linter/test_jsonnetfmt.vader
Normal file
19
test/linter/test_jsonnetfmt.vader
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
Before:
|
||||||
|
call ale#assert#SetUpLinterTest('jsonnet', 'jsonnetfmt')
|
||||||
|
call ale#test#SetFilename('../jsonnet_files/testfile.jsonnet')
|
||||||
|
|
||||||
|
After:
|
||||||
|
Restore
|
||||||
|
|
||||||
|
call ale#assert#TearDownLinterTest()
|
||||||
|
|
||||||
|
Execute(The default jsonnetfmt command should be correct):
|
||||||
|
AssertLinter 'jsonnetfmt',
|
||||||
|
\ ale#Escape('jsonnetfmt') . ' %t'
|
||||||
|
|
||||||
|
Execute(jsonnetfmt command and options should be customizable):
|
||||||
|
let g:ale_jsonnet_jsonnetfmt_executable = 'jsonnet'
|
||||||
|
let g:ale_jsonnet_jsonnetfmt_options = 'fmt'
|
||||||
|
|
||||||
|
AssertLinter 'jsonnet',
|
||||||
|
\ ale#Escape('jsonnet') . ' fmt %t'
|
Loading…
Reference in New Issue
Block a user