Merge pull request #3148 from charlesbjohnson/charlesbjohnson/xo
fixers/xo: enhance `xo` fixer
This commit is contained in:
commit
64550062dc
17 changed files with 223 additions and 56 deletions
|
@ -1,26 +1,9 @@
|
|||
" Author: Daniel Lupu <lupu.daniel.f@gmail.com>
|
||||
" Description: xo for JavaScript files
|
||||
|
||||
call ale#Set('javascript_xo_executable', 'xo')
|
||||
call ale#Set('javascript_xo_use_global', get(g:, 'ale_use_global_executables', 0))
|
||||
call ale#Set('javascript_xo_options', '')
|
||||
|
||||
function! ale_linters#javascript#xo#GetExecutable(buffer) abort
|
||||
return ale#node#FindExecutable(a:buffer, 'javascript_xo', [
|
||||
\ 'node_modules/.bin/xo',
|
||||
\])
|
||||
endfunction
|
||||
|
||||
function! ale_linters#javascript#xo#GetCommand(buffer) abort
|
||||
return ale#Escape(ale_linters#javascript#xo#GetExecutable(a:buffer))
|
||||
\ . ' ' . ale#Var(a:buffer, 'javascript_xo_options')
|
||||
\ . ' --reporter json --stdin --stdin-filename %s'
|
||||
endfunction
|
||||
|
||||
" xo uses eslint and the output format is the same
|
||||
call ale#linter#Define('javascript', {
|
||||
\ 'name': 'xo',
|
||||
\ 'executable': function('ale_linters#javascript#xo#GetExecutable'),
|
||||
\ 'command': function('ale_linters#javascript#xo#GetCommand'),
|
||||
\ 'callback': 'ale#handlers#eslint#HandleJSON',
|
||||
\ 'executable': function('ale#handlers#xo#GetExecutable'),
|
||||
\ 'command': function('ale#handlers#xo#GetLintCommand'),
|
||||
\ 'callback': 'ale#handlers#xo#HandleJSON',
|
||||
\})
|
||||
|
|
|
@ -1,23 +1,6 @@
|
|||
call ale#Set('typescript_xo_executable', 'xo')
|
||||
call ale#Set('typescript_xo_use_global', get(g:, 'ale_use_global_executables', 0))
|
||||
call ale#Set('typescript_xo_options', '')
|
||||
|
||||
function! ale_linters#typescript#xo#GetExecutable(buffer) abort
|
||||
return ale#node#FindExecutable(a:buffer, 'typescript_xo', [
|
||||
\ 'node_modules/.bin/xo',
|
||||
\])
|
||||
endfunction
|
||||
|
||||
function! ale_linters#typescript#xo#GetCommand(buffer) abort
|
||||
return ale#Escape(ale_linters#typescript#xo#GetExecutable(a:buffer))
|
||||
\ . ale#Pad(ale#Var(a:buffer, 'typescript_xo_options'))
|
||||
\ . ' --reporter json --stdin --stdin-filename %s'
|
||||
endfunction
|
||||
|
||||
" xo uses eslint and the output format is the same
|
||||
call ale#linter#Define('typescript', {
|
||||
\ 'name': 'xo',
|
||||
\ 'executable': function('ale_linters#typescript#xo#GetExecutable'),
|
||||
\ 'command': function('ale_linters#typescript#xo#GetCommand'),
|
||||
\ 'callback': 'ale#handlers#eslint#HandleJSON',
|
||||
\ 'executable': function('ale#handlers#xo#GetExecutable'),
|
||||
\ 'command': function('ale#handlers#xo#GetLintCommand'),
|
||||
\ 'callback': 'ale#handlers#xo#HandleJSON',
|
||||
\})
|
||||
|
|
|
@ -1,23 +1,36 @@
|
|||
" Author: Albert Marquez - https://github.com/a-marquez
|
||||
" Description: Fixing files with XO.
|
||||
|
||||
call ale#Set('javascript_xo_executable', 'xo')
|
||||
call ale#Set('javascript_xo_use_global', get(g:, 'ale_use_global_executables', 0))
|
||||
call ale#Set('javascript_xo_options', '')
|
||||
function! ale#fixers#xo#Fix(buffer) abort
|
||||
let l:executable = ale#handlers#xo#GetExecutable(a:buffer)
|
||||
let l:options = ale#handlers#xo#GetOptions(a:buffer)
|
||||
|
||||
function! ale#fixers#xo#GetExecutable(buffer) abort
|
||||
return ale#node#FindExecutable(a:buffer, 'javascript_xo', [
|
||||
\ 'node_modules/xo/cli.js',
|
||||
\ 'node_modules/.bin/xo',
|
||||
\])
|
||||
return ale#semver#RunWithVersionCheck(
|
||||
\ a:buffer,
|
||||
\ l:executable,
|
||||
\ '%e --version',
|
||||
\ {b, v -> ale#fixers#xo#ApplyFixForVersion(b, v, l:executable, l:options)}
|
||||
\)
|
||||
endfunction
|
||||
|
||||
function! ale#fixers#xo#Fix(buffer) abort
|
||||
let l:executable = ale#fixers#xo#GetExecutable(a:buffer)
|
||||
function! ale#fixers#xo#ApplyFixForVersion(buffer, version, executable, options) abort
|
||||
let l:executable = ale#node#Executable(a:buffer, a:executable)
|
||||
let l:options = ale#Pad(a:options)
|
||||
|
||||
" 0.30.0 is the first version with a working --stdin --fix
|
||||
if ale#semver#GTE(a:version, [0, 30, 0])
|
||||
return {
|
||||
\ 'command': l:executable
|
||||
\ . ' --stdin --stdin-filename %s'
|
||||
\ . ' --fix'
|
||||
\ . l:options,
|
||||
\}
|
||||
endif
|
||||
|
||||
return {
|
||||
\ 'command': ale#node#Executable(a:buffer, l:executable)
|
||||
\ . ' --fix %t',
|
||||
\ 'command': l:executable
|
||||
\ . ' --fix %t'
|
||||
\ . l:options,
|
||||
\ 'read_temporary_file': 1,
|
||||
\}
|
||||
endfunction
|
||||
|
|
44
autoload/ale/handlers/xo.vim
Normal file
44
autoload/ale/handlers/xo.vim
Normal file
|
@ -0,0 +1,44 @@
|
|||
call ale#Set('javascript_xo_executable', 'xo')
|
||||
call ale#Set('javascript_xo_use_global', get(g:, 'ale_use_global_executables', 0))
|
||||
call ale#Set('javascript_xo_options', '')
|
||||
|
||||
call ale#Set('typescript_xo_executable', 'xo')
|
||||
call ale#Set('typescript_xo_use_global', get(g:, 'ale_use_global_executables', 0))
|
||||
call ale#Set('typescript_xo_options', '')
|
||||
|
||||
function! ale#handlers#xo#GetExecutable(buffer) abort
|
||||
let l:type = ale#handlers#xo#GetType(a:buffer)
|
||||
|
||||
return ale#node#FindExecutable(a:buffer, l:type . '_xo', [
|
||||
\ 'node_modules/xo/cli.js',
|
||||
\ 'node_modules/.bin/xo',
|
||||
\])
|
||||
endfunction
|
||||
|
||||
function! ale#handlers#xo#GetLintCommand(buffer) abort
|
||||
return ale#Escape(ale#handlers#xo#GetExecutable(a:buffer))
|
||||
\ . ale#Pad(ale#handlers#xo#GetOptions(a:buffer))
|
||||
\ . ' --reporter json --stdin --stdin-filename %s'
|
||||
endfunction
|
||||
|
||||
function! ale#handlers#xo#GetOptions(buffer) abort
|
||||
let l:type = ale#handlers#xo#GetType(a:buffer)
|
||||
|
||||
return ale#Var(a:buffer, l:type . '_xo_options')
|
||||
endfunction
|
||||
|
||||
" xo uses eslint and the output format is the same
|
||||
function! ale#handlers#xo#HandleJSON(buffer, lines) abort
|
||||
return ale#handlers#eslint#HandleJSON(a:buffer, a:lines)
|
||||
endfunction
|
||||
|
||||
function! ale#handlers#xo#GetType(buffer) abort
|
||||
let l:filetype = getbufvar(a:buffer, '&filetype')
|
||||
let l:type = 'javascript'
|
||||
|
||||
if l:filetype =~# 'typescript'
|
||||
let l:type = 'typescript'
|
||||
endif
|
||||
|
||||
return l:type
|
||||
endfunction
|
|
@ -138,5 +138,32 @@ g:ale_typescript_tsserver_use_global *g:ale_typescript_tsserver_use_global*
|
|||
tsserver in node_modules.
|
||||
|
||||
|
||||
===============================================================================
|
||||
xo *ale-typescript-xo*
|
||||
|
||||
g:ale_typescript_xo_executable *g:ale_typescript_xo_executable*
|
||||
*b:ale_typescript_xo_executable*
|
||||
Type: |String|
|
||||
Default: `'xo'`
|
||||
|
||||
See |ale-integrations-local-executables|
|
||||
|
||||
|
||||
g:ale_typescript_xo_options *g:ale_typescript_xo_options*
|
||||
*b:ale_typescript_xo_options*
|
||||
Type: |String|
|
||||
Default: `''`
|
||||
|
||||
This variable can be set to pass additional options to xo.
|
||||
|
||||
|
||||
g:ale_typescript_xo_use_global *g:ale_typescript_xo_use_global*
|
||||
*b:ale_typescript_xo_use_global*
|
||||
Type: |Number|
|
||||
Default: `get(g:, 'ale_use_global_executables', 0)`
|
||||
|
||||
See |ale-integrations-local-executables|
|
||||
|
||||
|
||||
===============================================================================
|
||||
vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl:
|
||||
|
|
|
@ -2997,6 +2997,7 @@ documented in additional help files.
|
|||
standard..............................|ale-typescript-standard|
|
||||
tslint................................|ale-typescript-tslint|
|
||||
tsserver..............................|ale-typescript-tsserver|
|
||||
xo....................................|ale-typescript-xo|
|
||||
vala....................................|ale-vala-options|
|
||||
uncrustify............................|ale-vala-uncrustify|
|
||||
verilog/systemverilog...................|ale-verilog-options|
|
||||
|
|
|
@ -1,8 +1,11 @@
|
|||
Before:
|
||||
call ale#assert#SetUpLinterTest('typescript', 'xo')
|
||||
call ale#test#SetFilename('testfile.ts')
|
||||
call ale#assert#SetUpLinterTest('javascript', 'xo')
|
||||
call ale#test#SetFilename('testfile.jsx')
|
||||
unlet! b:executable
|
||||
|
||||
set filetype=javascriptreact
|
||||
runtime autoload/ale/handlers/xo.vim
|
||||
|
||||
After:
|
||||
call ale#assert#TearDownLinterTest()
|
||||
|
||||
|
@ -10,11 +13,11 @@ Execute(The XO executable should be called):
|
|||
AssertLinter 'xo', ale#Escape('xo') . ' --reporter json --stdin --stdin-filename %s'
|
||||
|
||||
Execute(The XO executable should be configurable):
|
||||
let b:ale_typescript_xo_executable = 'foobar'
|
||||
let b:ale_javascript_xo_executable = 'foobar'
|
||||
|
||||
AssertLinter 'foobar', ale#Escape('foobar') . ' --reporter json --stdin --stdin-filename %s'
|
||||
|
||||
Execute(The XO options should be configurable):
|
||||
let b:ale_typescript_xo_options = '--wat'
|
||||
let b:ale_javascript_xo_options = '--wat'
|
||||
|
||||
AssertLinter 'xo', ale#Escape('xo') . ' --wat --reporter json --stdin --stdin-filename %s'
|
||||
|
|
23
test/command_callback/test_xots_command_callback.vader
Normal file
23
test/command_callback/test_xots_command_callback.vader
Normal file
|
@ -0,0 +1,23 @@
|
|||
Before:
|
||||
call ale#assert#SetUpLinterTest('typescript', 'xo')
|
||||
call ale#test#SetFilename('testfile.tsx')
|
||||
unlet! b:executable
|
||||
|
||||
set filetype=typescriptreact
|
||||
runtime autoload/ale/handlers/xo.vim
|
||||
|
||||
After:
|
||||
call ale#assert#TearDownLinterTest()
|
||||
|
||||
Execute(The XO executable should be called):
|
||||
AssertLinter 'xo', ale#Escape('xo') . ' --reporter json --stdin --stdin-filename %s'
|
||||
|
||||
Execute(The XO executable should be configurable):
|
||||
let b:ale_typescript_xo_executable = 'foobar'
|
||||
|
||||
AssertLinter 'foobar', ale#Escape('foobar') . ' --reporter json --stdin --stdin-filename %s'
|
||||
|
||||
Execute(The XO options should be configurable):
|
||||
let b:ale_typescript_xo_options = '--wat'
|
||||
|
||||
AssertLinter 'xo', ale#Escape('xo') . ' --wat --reporter json --stdin --stdin-filename %s'
|
0
test/eslint-test-files/react-app/node_modules/xo/cli.js
generated
vendored
Normal file
0
test/eslint-test-files/react-app/node_modules/xo/cli.js
generated
vendored
Normal file
0
test/eslint-test-files/react-app/subdir/testfile.ts
Normal file
0
test/eslint-test-files/react-app/subdir/testfile.ts
Normal file
45
test/fixers/test_xo_fixer_callback.vader
Normal file
45
test/fixers/test_xo_fixer_callback.vader
Normal file
|
@ -0,0 +1,45 @@
|
|||
Before:
|
||||
call ale#assert#SetUpFixerTest('javascript', 'xo')
|
||||
runtime autoload/ale/handlers/xo.vim
|
||||
set filetype=javascript
|
||||
|
||||
After:
|
||||
call ale#assert#TearDownFixerTest()
|
||||
|
||||
Execute(The xo callback should return the correct default values):
|
||||
call ale#test#SetFilename('../xo-test-files/monorepo/packages/a/index.js')
|
||||
|
||||
AssertFixer
|
||||
\ {
|
||||
\ 'read_temporary_file': 1,
|
||||
\ 'command': (has('win32') ? 'node.exe ' : '')
|
||||
\ . ale#Escape(ale#path#Simplify(g:dir . '/../xo-test-files/monorepo/node_modules/xo/cli.js'))
|
||||
\ . ' --fix %t',
|
||||
\ }
|
||||
|
||||
Execute(The xo callback should include custom xo options):
|
||||
let g:ale_javascript_xo_options = '--space'
|
||||
call ale#test#SetFilename('../xo-test-files/monorepo/packages/a/index.js')
|
||||
|
||||
AssertFixer
|
||||
\ {
|
||||
\ 'read_temporary_file': 1,
|
||||
\ 'command': (has('win32') ? 'node.exe ' : '')
|
||||
\ . ale#Escape(ale#path#Simplify(g:dir . '/../xo-test-files/monorepo/node_modules/xo/cli.js'))
|
||||
\ . ' --fix %t'
|
||||
\ . ' --space',
|
||||
\ }
|
||||
|
||||
Execute(--stdin should be used when xo is new enough):
|
||||
let g:ale_javascript_xo_options = '--space'
|
||||
call ale#test#SetFilename('../xo-test-files/monorepo/packages/a/index.js')
|
||||
|
||||
GivenCommandOutput ['0.30.0']
|
||||
AssertFixer
|
||||
\ {
|
||||
\ 'command': (has('win32') ? 'node.exe ' : '')
|
||||
\ . ale#Escape(ale#path#Simplify(g:dir . '/../xo-test-files/monorepo/node_modules/xo/cli.js'))
|
||||
\ . ' --stdin --stdin-filename %s'
|
||||
\ . ' --fix'
|
||||
\ . ' --space',
|
||||
\ }
|
45
test/fixers/test_xots_fixer_callback.vader
Normal file
45
test/fixers/test_xots_fixer_callback.vader
Normal file
|
@ -0,0 +1,45 @@
|
|||
Before:
|
||||
call ale#assert#SetUpFixerTest('typescript', 'xo')
|
||||
runtime autoload/ale/handlers/xo.vim
|
||||
set filetype=typescript
|
||||
|
||||
After:
|
||||
call ale#assert#TearDownFixerTest()
|
||||
|
||||
Execute(The xo callback should return the correct default values):
|
||||
call ale#test#SetFilename('../xo-test-files/monorepo/packages/a/index.ts')
|
||||
|
||||
AssertFixer
|
||||
\ {
|
||||
\ 'read_temporary_file': 1,
|
||||
\ 'command': (has('win32') ? 'node.exe ' : '')
|
||||
\ . ale#Escape(ale#path#Simplify(g:dir . '/../xo-test-files/monorepo/node_modules/xo/cli.js'))
|
||||
\ . ' --fix %t',
|
||||
\ }
|
||||
|
||||
Execute(The xo callback should include custom xo options):
|
||||
let g:ale_typescript_xo_options = '--space'
|
||||
call ale#test#SetFilename('../xo-test-files/monorepo/packages/a/index.ts')
|
||||
|
||||
AssertFixer
|
||||
\ {
|
||||
\ 'read_temporary_file': 1,
|
||||
\ 'command': (has('win32') ? 'node.exe ' : '')
|
||||
\ . ale#Escape(ale#path#Simplify(g:dir . '/../xo-test-files/monorepo/node_modules/xo/cli.js'))
|
||||
\ . ' --fix %t'
|
||||
\ . ' --space',
|
||||
\ }
|
||||
|
||||
Execute(--stdin should be used when xo is new enough):
|
||||
let g:ale_typescript_xo_options = '--space'
|
||||
call ale#test#SetFilename('../xo-test-files/monorepo/packages/a/index.ts')
|
||||
|
||||
GivenCommandOutput ['0.30.0']
|
||||
AssertFixer
|
||||
\ {
|
||||
\ 'command': (has('win32') ? 'node.exe ' : '')
|
||||
\ . ale#Escape(ale#path#Simplify(g:dir . '/../xo-test-files/monorepo/node_modules/xo/cli.js'))
|
||||
\ . ' --stdin --stdin-filename %s'
|
||||
\ . ' --fix'
|
||||
\ . ' --space',
|
||||
\ }
|
0
test/xo-test-files/monorepo/node_modules/xo/cli.js
generated
vendored
Normal file
0
test/xo-test-files/monorepo/node_modules/xo/cli.js
generated
vendored
Normal file
0
test/xo-test-files/monorepo/package.json
Normal file
0
test/xo-test-files/monorepo/package.json
Normal file
0
test/xo-test-files/monorepo/packages/a/index.js
Normal file
0
test/xo-test-files/monorepo/packages/a/index.js
Normal file
0
test/xo-test-files/monorepo/packages/a/index.ts
Normal file
0
test/xo-test-files/monorepo/packages/a/index.ts
Normal file
0
test/xo-test-files/monorepo/packages/a/package.json
Normal file
0
test/xo-test-files/monorepo/packages/a/package.json
Normal file
Reference in a new issue