Fix #246 Don't run flow if there's no .flowconfig
This commit is contained in:
parent
926cd1a953
commit
49f7ce4f6d
@ -8,68 +8,74 @@ let g:ale_javascript_flow_use_global =
|
|||||||
\ get(g:, 'ale_javascript_flow_use_global', 0)
|
\ get(g:, 'ale_javascript_flow_use_global', 0)
|
||||||
|
|
||||||
function! ale_linters#javascript#flow#GetExecutable(buffer) abort
|
function! ale_linters#javascript#flow#GetExecutable(buffer) abort
|
||||||
if g:ale_javascript_flow_use_global
|
if g:ale_javascript_flow_use_global
|
||||||
return g:ale_javascript_flow_executable
|
return g:ale_javascript_flow_executable
|
||||||
endif
|
endif
|
||||||
|
|
||||||
return ale#util#ResolveLocalPath(
|
return ale#util#ResolveLocalPath(
|
||||||
\ a:buffer,
|
\ a:buffer,
|
||||||
\ 'node_modules/.bin/flow',
|
\ 'node_modules/.bin/flow',
|
||||||
\ g:ale_javascript_flow_executable
|
\ g:ale_javascript_flow_executable
|
||||||
\)
|
\)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! ale_linters#javascript#flow#GetCommand(buffer) abort
|
function! ale_linters#javascript#flow#GetCommand(buffer) abort
|
||||||
return ale_linters#javascript#flow#GetExecutable(a:buffer)
|
let l:flow_config = ale#util#FindNearestFile(a:buffer, '.flowconfig')
|
||||||
\ . ' check-contents --respect-pragma --json --from ale %s'
|
|
||||||
|
if empty(l:flow_config)
|
||||||
|
" Don't run Flow if we can't find a .flowconfig file.
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
|
||||||
|
return ale_linters#javascript#flow#GetExecutable(a:buffer)
|
||||||
|
\ . ' check-contents --respect-pragma --json --from ale %s'
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! ale_linters#javascript#flow#Handle(buffer, lines) abort
|
function! ale_linters#javascript#flow#Handle(buffer, lines) abort
|
||||||
let l:str = join(a:lines, '')
|
let l:str = join(a:lines, '')
|
||||||
if l:str ==# ''
|
|
||||||
return []
|
|
||||||
endif
|
|
||||||
let l:flow_output = json_decode(l:str)
|
|
||||||
|
|
||||||
if has_key(l:flow_output, 'errors')
|
if l:str ==# ''
|
||||||
|
return []
|
||||||
|
endif
|
||||||
|
|
||||||
|
let l:flow_output = json_decode(l:str)
|
||||||
let l:output = []
|
let l:output = []
|
||||||
|
|
||||||
for l:error in l:flow_output.errors
|
for l:error in get(l:flow_output, 'errors', [])
|
||||||
" Each error is broken up into parts
|
" Each error is broken up into parts
|
||||||
let l:text = ''
|
let l:text = ''
|
||||||
let l:line = 0
|
let l:line = 0
|
||||||
let l:col = 0
|
let l:col = 0
|
||||||
for l:message in l:error.message
|
|
||||||
" Comments have no line of column information
|
|
||||||
if has_key(l:message, 'loc') && l:line ==# 0
|
|
||||||
let l:line = l:message.loc.start.line + 0
|
|
||||||
let l:col = l:message.loc.start.column + 0
|
|
||||||
endif
|
|
||||||
if l:text ==# ''
|
|
||||||
let l:text = l:message.descr . ':'
|
|
||||||
else
|
|
||||||
let l:text = l:text . ' ' . l:message.descr
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
|
|
||||||
if has_key(l:error, 'operation')
|
for l:message in l:error.message
|
||||||
let l:text = l:text . ' See also: ' . l:error.operation.descr
|
" Comments have no line of column information
|
||||||
endif
|
if has_key(l:message, 'loc') && l:line ==# 0
|
||||||
|
let l:line = l:message.loc.start.line + 0
|
||||||
|
let l:col = l:message.loc.start.column + 0
|
||||||
|
endif
|
||||||
|
|
||||||
call add(l:output, {
|
if l:text ==# ''
|
||||||
\ 'bufnr': a:buffer,
|
let l:text = l:message.descr . ':'
|
||||||
\ 'lnum': l:line,
|
else
|
||||||
\ 'vcol': 0,
|
let l:text = l:text . ' ' . l:message.descr
|
||||||
\ 'col': l:col,
|
endif
|
||||||
\ 'text': l:text,
|
endfor
|
||||||
\ 'type': l:error.level ==# 'error' ? 'E' : 'W',
|
|
||||||
\})
|
if has_key(l:error, 'operation')
|
||||||
|
let l:text = l:text . ' See also: ' . l:error.operation.descr
|
||||||
|
endif
|
||||||
|
|
||||||
|
call add(l:output, {
|
||||||
|
\ 'bufnr': a:buffer,
|
||||||
|
\ 'lnum': l:line,
|
||||||
|
\ 'vcol': 0,
|
||||||
|
\ 'col': l:col,
|
||||||
|
\ 'text': l:text,
|
||||||
|
\ 'type': l:error.level ==# 'error' ? 'E' : 'W',
|
||||||
|
\})
|
||||||
endfor
|
endfor
|
||||||
|
|
||||||
return l:output
|
return l:output
|
||||||
else
|
|
||||||
return []
|
|
||||||
endif
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
call ale#linter#Define('javascript', {
|
call ale#linter#Define('javascript', {
|
||||||
|
0
test/flow/a/.flowconfig
Normal file
0
test/flow/a/.flowconfig
Normal file
0
test/flow/a/sub/dummy
Normal file
0
test/flow/a/sub/dummy
Normal file
0
test/flow/b/sub/dummy
Normal file
0
test/flow/b/sub/dummy
Normal file
17
test/test_flow_command.vader
Normal file
17
test/test_flow_command.vader
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
Before:
|
||||||
|
runtime ale_linters/javascript/flow.vim
|
||||||
|
|
||||||
|
After:
|
||||||
|
call ale#linter#Reset()
|
||||||
|
|
||||||
|
Execute(flow should return a command to run if a .flowconfig file exists):
|
||||||
|
silent! cd /testplugin/test
|
||||||
|
:e! flow/a/sub/dummy
|
||||||
|
|
||||||
|
AssertEqual 'flow check-contents --respect-pragma --json --from ale %s', ale_linters#javascript#flow#GetCommand(bufnr('%'))
|
||||||
|
|
||||||
|
Execute(flow should not return a command to run if no .flowconfig file exists):
|
||||||
|
silent! cd /testplugin/test
|
||||||
|
:e! flow/b/sub/dummy
|
||||||
|
|
||||||
|
AssertEqual '', ale_linters#javascript#flow#GetCommand(bufnr('%'))
|
132
test/test_flow_handler.vader
Normal file
132
test/test_flow_handler.vader
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
Before:
|
||||||
|
let g:flow_output = {
|
||||||
|
\ "flowVersion": "0.39.0",
|
||||||
|
\ "errors": [
|
||||||
|
\ {
|
||||||
|
\ "kind": "infer",
|
||||||
|
\ "level": "error",
|
||||||
|
\ "message": [
|
||||||
|
\ {
|
||||||
|
\ "context": " return 1",
|
||||||
|
\ "descr": "number",
|
||||||
|
\ "type": "Blame",
|
||||||
|
\ "loc": {
|
||||||
|
\ "source": "/home/w0rp/Downloads/graphql-js/src/language/parser.js",
|
||||||
|
\ "type": "SourceFile",
|
||||||
|
\ "start": {
|
||||||
|
\ "line": 417,
|
||||||
|
\ "column": 10,
|
||||||
|
\ "offset": 9503
|
||||||
|
\ },
|
||||||
|
\ "end": {
|
||||||
|
\ "line": 417,
|
||||||
|
\ "column": 10,
|
||||||
|
\ "offset": 9504
|
||||||
|
\ }
|
||||||
|
\ },
|
||||||
|
\ "path": "/home/w0rp/Downloads/graphql-js/src/language/parser.js",
|
||||||
|
\ "line": 417,
|
||||||
|
\ "endline": 417,
|
||||||
|
\ "start": 10,
|
||||||
|
\ "end": 10
|
||||||
|
\ },
|
||||||
|
\ {
|
||||||
|
\ "context": v:null,
|
||||||
|
\ "descr": "This type is incompatible with the expected return type of",
|
||||||
|
\ "type": "Comment",
|
||||||
|
\ "path": "",
|
||||||
|
\ "line": 0,
|
||||||
|
\ "endline": 0,
|
||||||
|
\ "start": 1,
|
||||||
|
\ "end": 0
|
||||||
|
\ },
|
||||||
|
\ {
|
||||||
|
\ "context": "function parseArguments(lexer: Lexer<*>): Array<ArgumentNode> {",
|
||||||
|
\ "descr": "array type",
|
||||||
|
\ "type": "Blame",
|
||||||
|
\ "loc": {
|
||||||
|
\ "source": "/home/w0rp/Downloads/graphql-js/src/language/parser.js",
|
||||||
|
\ "type": "SourceFile",
|
||||||
|
\ "start": {
|
||||||
|
\ "line": 416,
|
||||||
|
\ "column": 43,
|
||||||
|
\ "offset": 9472
|
||||||
|
\ },
|
||||||
|
\ "end": {
|
||||||
|
\ "line": 416,
|
||||||
|
\ "column": 61,
|
||||||
|
\ "offset": 9491
|
||||||
|
\ }
|
||||||
|
\ },
|
||||||
|
\ "path": "/home/w0rp/Downloads/graphql-js/src/language/parser.js",
|
||||||
|
\ "line": 416,
|
||||||
|
\ "endline": 416,
|
||||||
|
\ "start": 43,
|
||||||
|
\ "end": 61
|
||||||
|
\ }
|
||||||
|
\ ]
|
||||||
|
\ },
|
||||||
|
\ {
|
||||||
|
\ "kind": "infer",
|
||||||
|
\ "level": "warning",
|
||||||
|
\ "message": [
|
||||||
|
\ {
|
||||||
|
\ "context": " return peek(lexer, TokenKind.PAREN_L) ?",
|
||||||
|
\ "descr": "unreachable code",
|
||||||
|
\ "type": "Blame",
|
||||||
|
\ "loc": {
|
||||||
|
\ "source": "/home/w0rp/Downloads/graphql-js/src/language/parser.js",
|
||||||
|
\ "type": "SourceFile",
|
||||||
|
\ "start": {
|
||||||
|
\ "line": 419,
|
||||||
|
\ "column": 3,
|
||||||
|
\ "offset": 9508
|
||||||
|
\ },
|
||||||
|
\ "end": {
|
||||||
|
\ "line": 421,
|
||||||
|
\ "column": 7,
|
||||||
|
\ "offset": 9626
|
||||||
|
\ }
|
||||||
|
\ },
|
||||||
|
\ "path": "/home/w0rp/Downloads/graphql-js/src/language/parser.js",
|
||||||
|
\ "line": 419,
|
||||||
|
\ "endline": 421,
|
||||||
|
\ "start": 3,
|
||||||
|
\ "end": 7
|
||||||
|
\ }
|
||||||
|
\ ]
|
||||||
|
\ }
|
||||||
|
\ ],
|
||||||
|
\ "passed": v:false
|
||||||
|
\}
|
||||||
|
|
||||||
|
runtime ale_linters/javascript/flow.vim
|
||||||
|
|
||||||
|
After:
|
||||||
|
unlet! g:flow_output
|
||||||
|
unlet! g:expected
|
||||||
|
unlet! g:actual
|
||||||
|
call ale#linter#Reset()
|
||||||
|
|
||||||
|
Execute(The flow handler should process errors correctly.):
|
||||||
|
let g:actual = ale_linters#javascript#flow#Handle(347, [json_encode(g:flow_output)])
|
||||||
|
let g:expected = [
|
||||||
|
\ {
|
||||||
|
\ 'lnum': 417,
|
||||||
|
\ 'bufnr': 347,
|
||||||
|
\ 'vcol': 0,
|
||||||
|
\ 'type': 'E',
|
||||||
|
\ 'col': 10,
|
||||||
|
\ 'text': 'number: This type is incompatible with the expected return type of array type',
|
||||||
|
\ },
|
||||||
|
\ {
|
||||||
|
\ 'lnum': 419,
|
||||||
|
\ 'bufnr': 347,
|
||||||
|
\ 'vcol': 0,
|
||||||
|
\ 'type': 'W',
|
||||||
|
\ 'col': 3,
|
||||||
|
\ 'text': 'unreachable code:',
|
||||||
|
\ },
|
||||||
|
\]
|
||||||
|
|
||||||
|
AssertEqual g:expected, g:actual
|
Loading…
Reference in New Issue
Block a user