mirror of
https://github.com/dense-analysis/ale.git
synced 2025-12-07 05:04:28 +08:00
Merge pull request #3148 from charlesbjohnson/charlesbjohnson/xo
fixers/xo: enhance `xo` fixer
This commit is contained in:
@@ -1,26 +1,9 @@
|
|||||||
" Author: Daniel Lupu <lupu.daniel.f@gmail.com>
|
" Author: Daniel Lupu <lupu.daniel.f@gmail.com>
|
||||||
" Description: xo for JavaScript files
|
" 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', {
|
call ale#linter#Define('javascript', {
|
||||||
\ 'name': 'xo',
|
\ 'name': 'xo',
|
||||||
\ 'executable': function('ale_linters#javascript#xo#GetExecutable'),
|
\ 'executable': function('ale#handlers#xo#GetExecutable'),
|
||||||
\ 'command': function('ale_linters#javascript#xo#GetCommand'),
|
\ 'command': function('ale#handlers#xo#GetLintCommand'),
|
||||||
\ 'callback': 'ale#handlers#eslint#HandleJSON',
|
\ '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', {
|
call ale#linter#Define('typescript', {
|
||||||
\ 'name': 'xo',
|
\ 'name': 'xo',
|
||||||
\ 'executable': function('ale_linters#typescript#xo#GetExecutable'),
|
\ 'executable': function('ale#handlers#xo#GetExecutable'),
|
||||||
\ 'command': function('ale_linters#typescript#xo#GetCommand'),
|
\ 'command': function('ale#handlers#xo#GetLintCommand'),
|
||||||
\ 'callback': 'ale#handlers#eslint#HandleJSON',
|
\ 'callback': 'ale#handlers#xo#HandleJSON',
|
||||||
\})
|
\})
|
||||||
|
|||||||
@@ -1,23 +1,36 @@
|
|||||||
" Author: Albert Marquez - https://github.com/a-marquez
|
" Author: Albert Marquez - https://github.com/a-marquez
|
||||||
" Description: Fixing files with XO.
|
" Description: Fixing files with XO.
|
||||||
|
|
||||||
call ale#Set('javascript_xo_executable', 'xo')
|
function! ale#fixers#xo#Fix(buffer) abort
|
||||||
call ale#Set('javascript_xo_use_global', get(g:, 'ale_use_global_executables', 0))
|
let l:executable = ale#handlers#xo#GetExecutable(a:buffer)
|
||||||
call ale#Set('javascript_xo_options', '')
|
let l:options = ale#handlers#xo#GetOptions(a:buffer)
|
||||||
|
|
||||||
function! ale#fixers#xo#GetExecutable(buffer) abort
|
return ale#semver#RunWithVersionCheck(
|
||||||
return ale#node#FindExecutable(a:buffer, 'javascript_xo', [
|
\ a:buffer,
|
||||||
\ 'node_modules/xo/cli.js',
|
\ l:executable,
|
||||||
\ 'node_modules/.bin/xo',
|
\ '%e --version',
|
||||||
\])
|
\ {b, v -> ale#fixers#xo#ApplyFixForVersion(b, v, l:executable, l:options)}
|
||||||
|
\)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! ale#fixers#xo#Fix(buffer) abort
|
function! ale#fixers#xo#ApplyFixForVersion(buffer, version, executable, options) abort
|
||||||
let l:executable = ale#fixers#xo#GetExecutable(a:buffer)
|
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 {
|
return {
|
||||||
\ 'command': ale#node#Executable(a:buffer, l:executable)
|
\ 'command': l:executable
|
||||||
\ . ' --fix %t',
|
\ . ' --fix %t'
|
||||||
|
\ . l:options,
|
||||||
\ 'read_temporary_file': 1,
|
\ 'read_temporary_file': 1,
|
||||||
\}
|
\}
|
||||||
endfunction
|
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.
|
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:
|
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|
|
standard..............................|ale-typescript-standard|
|
||||||
tslint................................|ale-typescript-tslint|
|
tslint................................|ale-typescript-tslint|
|
||||||
tsserver..............................|ale-typescript-tsserver|
|
tsserver..............................|ale-typescript-tsserver|
|
||||||
|
xo....................................|ale-typescript-xo|
|
||||||
vala....................................|ale-vala-options|
|
vala....................................|ale-vala-options|
|
||||||
uncrustify............................|ale-vala-uncrustify|
|
uncrustify............................|ale-vala-uncrustify|
|
||||||
verilog/systemverilog...................|ale-verilog-options|
|
verilog/systemverilog...................|ale-verilog-options|
|
||||||
|
|||||||
@@ -1,8 +1,11 @@
|
|||||||
Before:
|
Before:
|
||||||
call ale#assert#SetUpLinterTest('typescript', 'xo')
|
call ale#assert#SetUpLinterTest('javascript', 'xo')
|
||||||
call ale#test#SetFilename('testfile.ts')
|
call ale#test#SetFilename('testfile.jsx')
|
||||||
unlet! b:executable
|
unlet! b:executable
|
||||||
|
|
||||||
|
set filetype=javascriptreact
|
||||||
|
runtime autoload/ale/handlers/xo.vim
|
||||||
|
|
||||||
After:
|
After:
|
||||||
call ale#assert#TearDownLinterTest()
|
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'
|
AssertLinter 'xo', ale#Escape('xo') . ' --reporter json --stdin --stdin-filename %s'
|
||||||
|
|
||||||
Execute(The XO executable should be configurable):
|
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'
|
AssertLinter 'foobar', ale#Escape('foobar') . ' --reporter json --stdin --stdin-filename %s'
|
||||||
|
|
||||||
Execute(The XO options should be configurable):
|
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'
|
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 New Issue
Block a user