Add Apple's swift-format as a linter
This commit is contained in:
parent
36e5337e30
commit
2548763d04
5 changed files with 117 additions and 0 deletions
62
ale_linters/swift/swiftformat.vim
Normal file
62
ale_linters/swift/swiftformat.vim
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
" Author: Klaas Pieter Annema <https://github.com/klaaspieter>
|
||||||
|
" Description: Support for swift-format https://github.com/apple/swift-format
|
||||||
|
|
||||||
|
let s:default_executable = 'swift-format'
|
||||||
|
call ale#Set('swift_swiftformat_executable', s:default_executable)
|
||||||
|
|
||||||
|
function! ale_linters#swift#swiftformat#UseSwift(buffer) abort
|
||||||
|
let l:swift_config = ale#path#FindNearestFile(a:buffer, 'Package.swift')
|
||||||
|
let l:executable = ale#Var(a:buffer, 'swift_swiftformat_executable')
|
||||||
|
|
||||||
|
return !empty(l:swift_config) && l:executable is# s:default_executable
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! ale_linters#swift#swiftformat#GetExecutable(buffer) abort
|
||||||
|
if ale_linters#swift#swiftformat#UseSwift(a:buffer)
|
||||||
|
return 'swift'
|
||||||
|
endif
|
||||||
|
|
||||||
|
return ale#Var(a:buffer, 'swift_swiftformat_executable')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! ale_linters#swift#swiftformat#GetCommand(buffer) abort
|
||||||
|
let l:executable = ale_linters#swift#swiftformat#GetExecutable(a:buffer)
|
||||||
|
let l:args = '--mode lint %t'
|
||||||
|
|
||||||
|
if ale_linters#swift#swiftformat#UseSwift(a:buffer)
|
||||||
|
let l:args = 'run swift-format' . ' ' . l:args
|
||||||
|
endif
|
||||||
|
|
||||||
|
return ale#Escape(l:executable) . ' ' . l:args
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! ale_linters#swift#swiftformat#Handle(buffer, lines) abort
|
||||||
|
" Matches lines of the following pattern:
|
||||||
|
"
|
||||||
|
" Sources/main.swift:4:21: warning: [DoNotUseSemicolons]: remove ';' and move the next statement to the new line
|
||||||
|
" Sources/main.swift:3:12: warning: [Spacing]: remove 1 space
|
||||||
|
let l:pattern = '\v^.*:(\d+):(\d+): (\S+) \[(\S+)\]: (.*)$'
|
||||||
|
let l:output = []
|
||||||
|
|
||||||
|
for l:match in ale#util#GetMatches(a:lines, l:pattern)
|
||||||
|
call add(l:output, {
|
||||||
|
\ 'lnum': l:match[1] + 0,
|
||||||
|
\ 'col': l:match[2] + 0,
|
||||||
|
\ 'type': l:match[3] is# 'error' ? 'E' : 'W',
|
||||||
|
\ 'code': l:match[4],
|
||||||
|
\ 'text': l:match[5],
|
||||||
|
\})
|
||||||
|
endfor
|
||||||
|
|
||||||
|
return l:output
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
call ale#linter#Define('swift', {
|
||||||
|
\ 'name': 'swift-format',
|
||||||
|
\ 'executable': function('ale_linters#swift#swiftformat#GetExecutable'),
|
||||||
|
\ 'command': function('ale_linters#swift#swiftformat#GetCommand'),
|
||||||
|
\ 'output_stream': 'stderr',
|
||||||
|
\ 'language': 'swift',
|
||||||
|
\ 'callback': 'ale_linters#swift#swiftformat#Handle'
|
||||||
|
\})
|
|
@ -445,6 +445,7 @@ Notes:
|
||||||
* Swift
|
* Swift
|
||||||
* `sourcekit-lsp`
|
* `sourcekit-lsp`
|
||||||
* `swiftformat`
|
* `swiftformat`
|
||||||
|
* `swift-format`
|
||||||
* `swiftlint`
|
* `swiftlint`
|
||||||
* Tcl
|
* Tcl
|
||||||
* `nagelfar`!!
|
* `nagelfar`!!
|
||||||
|
|
|
@ -454,6 +454,7 @@ formatting.
|
||||||
* Swift
|
* Swift
|
||||||
* [sourcekit-lsp](https://github.com/apple/sourcekit-lsp)
|
* [sourcekit-lsp](https://github.com/apple/sourcekit-lsp)
|
||||||
* [swiftformat](https://github.com/nicklockwood/SwiftFormat)
|
* [swiftformat](https://github.com/nicklockwood/SwiftFormat)
|
||||||
|
* [swift-format](https://github.com/apple/swift-format)
|
||||||
* [swiftlint](https://github.com/realm/SwiftLint)
|
* [swiftlint](https://github.com/realm/SwiftLint)
|
||||||
* Tcl
|
* Tcl
|
||||||
* [nagelfar](http://nagelfar.sourceforge.net) :floppy_disk:
|
* [nagelfar](http://nagelfar.sourceforge.net) :floppy_disk:
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
Before:
|
||||||
|
call ale#assert#SetUpLinterTest('swift', 'swiftformat')
|
||||||
|
|
||||||
|
After:
|
||||||
|
call ale#assert#TearDownLinterTest()
|
||||||
|
|
||||||
|
Execute(Should use default command when not in a swift package):
|
||||||
|
call ale#test#SetFilename('../swift-test-files/non-swift-package-project/src/folder/dummy.swift')
|
||||||
|
|
||||||
|
AssertLinter 'swift-format',
|
||||||
|
\ ale#Escape('swift-format') . ' --mode lint %t'
|
||||||
|
|
||||||
|
Execute(Should use swift run when in a swift package):
|
||||||
|
call ale#test#SetFilename('../swift-test-files/swift-package-project/src/folder/dummy.swift')
|
||||||
|
|
||||||
|
AssertLinter 'swift',
|
||||||
|
\ ale#Escape('swift') . ' run swift-format --mode lint %t'
|
||||||
|
|
||||||
|
Execute(Should let users configure a global executable and override local paths):
|
||||||
|
call ale#test#SetFilename('../swift-test-files/swift-package-project/src/folder/dummy.swift')
|
||||||
|
|
||||||
|
let g:ale_swift_swiftformat_executable = '/path/to/custom/swift-format'
|
||||||
|
|
||||||
|
AssertLinter '/path/to/custom/swift-format',
|
||||||
|
\ ale#Escape('/path/to/custom/swift-format') . ' --mode lint %t'
|
28
test/handler/test_swiftformat_handler.vader
Normal file
28
test/handler/test_swiftformat_handler.vader
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
Before:
|
||||||
|
runtime ale_linters/swift/swiftformat.vim
|
||||||
|
|
||||||
|
After:
|
||||||
|
call ale#linter#Reset()
|
||||||
|
|
||||||
|
Execute(The swiftformat handler should parse lines correctly):
|
||||||
|
AssertEqual
|
||||||
|
\ [
|
||||||
|
\ {
|
||||||
|
\ 'lnum': 4,
|
||||||
|
\ 'col': 21,
|
||||||
|
\ 'type': 'W',
|
||||||
|
\ 'code': 'DoNotUseSemicolons',
|
||||||
|
\ 'text': 'remove '';'' and move the next statement to the new line',
|
||||||
|
\ },
|
||||||
|
\ {
|
||||||
|
\ 'lnum': 3,
|
||||||
|
\ 'col': 12,
|
||||||
|
\ 'type': 'W',
|
||||||
|
\ 'code': 'Spacing',
|
||||||
|
\ 'text': 'remove 1 space'
|
||||||
|
\ },
|
||||||
|
\ ],
|
||||||
|
\ ale_linters#swift#swiftformat#Handle(bufnr(''), [
|
||||||
|
\ 'Sources/main.swift:4:21: warning: [DoNotUseSemicolons]: remove '';'' and move the next statement to the new line',
|
||||||
|
\ 'Sources/main.swift:3:12: warning: [Spacing]: remove 1 space',
|
||||||
|
\ ])
|
Reference in a new issue