summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGordon Fontenot <gordon@fonten.io>2018-12-07 17:20:58 -0500
committerBjorn Neergaard <bjorn@neersighted.com>2018-12-07 15:20:58 -0700
commit9226e13b31474ac17d0c25cd27aa55bff21d55c2 (patch)
tree78847e0326af18ad72d0c82da364b73c40ebd2f2
parent3db564f7742360a870679ef6c63361371646fed8 (diff)
downloadale-9226e13b31474ac17d0c25cd27aa55bff21d55c2.zip
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.
-rw-r--r--ale_linters/swift/swiftlint.vim32
-rw-r--r--test/swiftlint-test-files/cocoapods-and-react-native/Pods/SwiftLint/swiftlint0
-rw-r--r--test/swiftlint-test-files/cocoapods-and-react-native/ios/Pods/SwiftLint/swiftlint0
-rw-r--r--test/swiftlint-test-files/cocoapods/Pods/SwiftLint/swiftlint0
-rw-r--r--test/swiftlint-test-files/react-native/ios/Pods/SwiftLint/swiftlint0
-rw-r--r--test/test_swiftlint_executable_detection.vader50
6 files changed, 75 insertions, 7 deletions
diff --git a/ale_linters/swift/swiftlint.vim b/ale_linters/swift/swiftlint.vim
index 697d246b..a1150658 100644
--- a/ale_linters/swift/swiftlint.vim
+++ b/ale_linters/swift/swiftlint.vim
@@ -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
+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
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)
let l:item = {
- \ 'lnum': str2nr(l:match[2]),
- \ 'type': l:match[4] is# 'error' ? 'E' : 'W',
- \ 'text': l:match[5],
- \}
+ \ 'lnum': str2nr(l:match[2]),
+ \ 'type': l:match[4] is# 'error' ? 'E' : 'W',
+ \ 'text': l:match[5],
+ \}
if l:match[4] is# 'error'
let l:item.type = 'E'
@@ -45,7 +63,7 @@ endfunction
call ale#linter#Define('swift', {
\ 'name': 'swiftlint',
-\ 'executable': 'swiftlint',
-\ 'command': 'swiftlint lint --use-stdin',
+\ 'executable_callback': 'ale_linters#swift#swiftlint#GetExecutable',
+\ 'command_callback': 'ale_linters#swift#swiftlint#GetCommand',
\ 'callback': 'ale_linters#swift#swiftlint#Handle',
\})
diff --git a/test/swiftlint-test-files/cocoapods-and-react-native/Pods/SwiftLint/swiftlint b/test/swiftlint-test-files/cocoapods-and-react-native/Pods/SwiftLint/swiftlint
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/swiftlint-test-files/cocoapods-and-react-native/Pods/SwiftLint/swiftlint
diff --git a/test/swiftlint-test-files/cocoapods-and-react-native/ios/Pods/SwiftLint/swiftlint b/test/swiftlint-test-files/cocoapods-and-react-native/ios/Pods/SwiftLint/swiftlint
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/swiftlint-test-files/cocoapods-and-react-native/ios/Pods/SwiftLint/swiftlint
diff --git a/test/swiftlint-test-files/cocoapods/Pods/SwiftLint/swiftlint b/test/swiftlint-test-files/cocoapods/Pods/SwiftLint/swiftlint
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/swiftlint-test-files/cocoapods/Pods/SwiftLint/swiftlint
diff --git a/test/swiftlint-test-files/react-native/ios/Pods/SwiftLint/swiftlint b/test/swiftlint-test-files/react-native/ios/Pods/SwiftLint/swiftlint
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/swiftlint-test-files/react-native/ios/Pods/SwiftLint/swiftlint
diff --git a/test/test_swiftlint_executable_detection.vader b/test/test_swiftlint_executable_detection.vader
new file mode 100644
index 00000000..a8e14c84
--- /dev/null
+++ b/test/test_swiftlint_executable_detection.vader
@@ -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(''))