summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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(''))