Add support for Pod based SwiftLint (#2122)
It's common to add SwiftLint as a CocoaPod dependency, instead of as a global binary. In this case we should use that version of SwiftLint before looking for any others. Note that I'm also adding support for SwiftLint in ReactNative projects here as well, where the Pods directory would be nested inside an ios directory.
This commit is contained in:
parent
3db564f774
commit
9226e13b31
6 changed files with 75 additions and 7 deletions
|
@ -1,6 +1,24 @@
|
||||||
" Author: David Mohundro <david@mohundro.com>
|
" Author: David Mohundro <david@mohundro.com>, Gordon Fontenot <gordon@fonten.io>
|
||||||
" Description: swiftlint for swift files
|
" Description: swiftlint for swift files
|
||||||
|
|
||||||
|
call ale#Set('swift_swiftlint_executable', 'swiftlint')
|
||||||
|
call ale#Set('swift_swiftlint_use_global', get(g:, 'ale_use_global_executables', 0))
|
||||||
|
|
||||||
|
function! ale_linters#swift#swiftlint#GetExecutable(buffer) abort
|
||||||
|
return ale#node#FindExecutable(a:buffer, 'swift_swiftlint', [
|
||||||
|
\ 'Pods/SwiftLint/swiftlint',
|
||||||
|
\ 'ios/Pods/SwiftLint/swiftlint',
|
||||||
|
\ 'swiftlint',
|
||||||
|
\])
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! ale_linters#swift#swiftlint#GetCommand(buffer) abort
|
||||||
|
let l:executable = ale_linters#swift#swiftlint#GetExecutable(a:buffer)
|
||||||
|
let l:args = 'lint --use-stdin'
|
||||||
|
|
||||||
|
return ale#Escape(l:executable)
|
||||||
|
\ . ' ' .l:args
|
||||||
|
endfunction
|
||||||
|
|
||||||
function! ale_linters#swift#swiftlint#Handle(buffer, lines) abort
|
function! ale_linters#swift#swiftlint#Handle(buffer, lines) abort
|
||||||
let l:pattern = '\v^([a-zA-Z]?:?[^:]+):(\d+):(\d+)?:? ([^:]+): (.+)$'
|
let l:pattern = '\v^([a-zA-Z]?:?[^:]+):(\d+):(\d+)?:? ([^:]+): (.+)$'
|
||||||
|
@ -8,10 +26,10 @@ function! ale_linters#swift#swiftlint#Handle(buffer, lines) abort
|
||||||
|
|
||||||
for l:match in ale#util#GetMatches(a:lines, l:pattern)
|
for l:match in ale#util#GetMatches(a:lines, l:pattern)
|
||||||
let l:item = {
|
let l:item = {
|
||||||
\ 'lnum': str2nr(l:match[2]),
|
\ 'lnum': str2nr(l:match[2]),
|
||||||
\ 'type': l:match[4] is# 'error' ? 'E' : 'W',
|
\ 'type': l:match[4] is# 'error' ? 'E' : 'W',
|
||||||
\ 'text': l:match[5],
|
\ 'text': l:match[5],
|
||||||
\}
|
\}
|
||||||
|
|
||||||
if l:match[4] is# 'error'
|
if l:match[4] is# 'error'
|
||||||
let l:item.type = 'E'
|
let l:item.type = 'E'
|
||||||
|
@ -45,7 +63,7 @@ endfunction
|
||||||
|
|
||||||
call ale#linter#Define('swift', {
|
call ale#linter#Define('swift', {
|
||||||
\ 'name': 'swiftlint',
|
\ 'name': 'swiftlint',
|
||||||
\ 'executable': 'swiftlint',
|
\ 'executable_callback': 'ale_linters#swift#swiftlint#GetExecutable',
|
||||||
\ 'command': 'swiftlint lint --use-stdin',
|
\ 'command_callback': 'ale_linters#swift#swiftlint#GetCommand',
|
||||||
\ 'callback': 'ale_linters#swift#swiftlint#Handle',
|
\ 'callback': 'ale_linters#swift#swiftlint#Handle',
|
||||||
\})
|
\})
|
||||||
|
|
0
test/swiftlint-test-files/cocoapods-and-react-native/Pods/SwiftLint/swiftlint
generated
Normal file
0
test/swiftlint-test-files/cocoapods-and-react-native/Pods/SwiftLint/swiftlint
generated
Normal file
0
test/swiftlint-test-files/cocoapods-and-react-native/ios/Pods/SwiftLint/swiftlint
generated
Normal file
0
test/swiftlint-test-files/cocoapods-and-react-native/ios/Pods/SwiftLint/swiftlint
generated
Normal file
0
test/swiftlint-test-files/cocoapods/Pods/SwiftLint/swiftlint
generated
Normal file
0
test/swiftlint-test-files/cocoapods/Pods/SwiftLint/swiftlint
generated
Normal file
0
test/swiftlint-test-files/react-native/ios/Pods/SwiftLint/swiftlint
generated
Normal file
0
test/swiftlint-test-files/react-native/ios/Pods/SwiftLint/swiftlint
generated
Normal file
50
test/test_swiftlint_executable_detection.vader
Normal file
50
test/test_swiftlint_executable_detection.vader
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
Before:
|
||||||
|
let g:ale_swift_swiftlint_executable = 'swiftlint_d'
|
||||||
|
|
||||||
|
call ale#test#SetDirectory('/testplugin/test')
|
||||||
|
|
||||||
|
runtime ale_linters/swift/swiftlint.vim
|
||||||
|
|
||||||
|
After:
|
||||||
|
let g:ale_has_override = {}
|
||||||
|
let g:ale_swift_swiftlint_executable = 'swiftlint'
|
||||||
|
let g:ale_swift_swiftlint_use_global = 0
|
||||||
|
|
||||||
|
call ale#test#RestoreDirectory()
|
||||||
|
call ale#linter#Reset()
|
||||||
|
|
||||||
|
Execute(Global installation should be the default executable):
|
||||||
|
call ale#test#SetFilename('swiftlint-test-files/global/testfile.swift')
|
||||||
|
|
||||||
|
AssertEqual
|
||||||
|
\ 'swiftlint_d',
|
||||||
|
\ ale_linters#swift#swiftlint#GetExecutable(bufnr(''))
|
||||||
|
|
||||||
|
Execute(React Native apps using CocoaPods should take precedence over the default executable):
|
||||||
|
call ale#test#SetFilename('swiftlint-test-files/react-native/testfile.swift')
|
||||||
|
|
||||||
|
AssertEqual
|
||||||
|
\ ale#path#Simplify(g:dir . '/swiftlint-test-files/react-native/ios/Pods/SwiftLint/swiftlint'),
|
||||||
|
\ ale_linters#swift#swiftlint#GetExecutable(bufnr(''))
|
||||||
|
|
||||||
|
Execute(CocoaPods installation should take precedence over the default executable):
|
||||||
|
call ale#test#SetFilename('swiftlint-test-files/cocoapods/testfile.swift')
|
||||||
|
|
||||||
|
AssertEqual
|
||||||
|
\ ale#path#Simplify(g:dir . '/swiftlint-test-files/cocoapods/Pods/SwiftLint/swiftlint'),
|
||||||
|
\ ale_linters#swift#swiftlint#GetExecutable(bufnr(''))
|
||||||
|
|
||||||
|
Execute(Top level CocoaPods installation should take precedence over React Native installation):
|
||||||
|
call ale#test#SetFilename('swiftlint-test-files/cocoapods-and-react-native/testfile.swift')
|
||||||
|
|
||||||
|
AssertEqual
|
||||||
|
\ ale#path#Simplify(g:dir . '/swiftlint-test-files/cocoapods-and-react-native/Pods/SwiftLint/swiftlint'),
|
||||||
|
\ ale_linters#swift#swiftlint#GetExecutable(bufnr(''))
|
||||||
|
|
||||||
|
Execute(use-global should override other versions):
|
||||||
|
let g:ale_swift_swiftlint_use_global = 1
|
||||||
|
call ale#test#SetFilename('swiftlint-test-files/cocoapods-and-react-native/testfile.swift')
|
||||||
|
|
||||||
|
AssertEqual
|
||||||
|
\ 'swiftlint_d',
|
||||||
|
\ ale_linters#swift#swiftlint#GetExecutable(bufnr(''))
|
Reference in a new issue