[lsp] Add Swift / SourceKit-LSP support (#2420)
* [linter] Add LSP support for Swift via sourcekit-lsp
This commit is contained in:
parent
9a0ece1ecb
commit
864d0861e4
7 changed files with 65 additions and 0 deletions
13
ale_linters/swift/sourcekitlsp.vim
Normal file
13
ale_linters/swift/sourcekitlsp.vim
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
" Author: Dan Loman <https://github.com/namolnad>
|
||||||
|
" Description: Support for sourcekit-lsp https://github.com/apple/sourcekit-lsp
|
||||||
|
|
||||||
|
call ale#Set('sourcekit_lsp_executable', 'sourcekit-lsp')
|
||||||
|
|
||||||
|
call ale#linter#Define('swift', {
|
||||||
|
\ 'name': 'sourcekitlsp',
|
||||||
|
\ 'lsp': 'stdio',
|
||||||
|
\ 'executable': {b -> ale#Var(b, 'sourcekit_lsp_executable')},
|
||||||
|
\ 'command': '%e',
|
||||||
|
\ 'project_root': function('ale#swift#FindProjectRoot'),
|
||||||
|
\ 'language': 'swift',
|
||||||
|
\})
|
13
autoload/ale/swift.vim
Normal file
13
autoload/ale/swift.vim
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
" Author: Dan Loman <https://github.com/namolnad>
|
||||||
|
" Description: Functions for integrating with Swift tools
|
||||||
|
|
||||||
|
" Find the nearest dir containing a Package.swift file and assume it is the root of the Swift project.
|
||||||
|
function! ale#swift#FindProjectRoot(buffer) abort
|
||||||
|
let l:swift_config = ale#path#FindNearestFile(a:buffer, 'Package.swift')
|
||||||
|
|
||||||
|
if !empty(l:swift_config)
|
||||||
|
return fnamemodify(l:swift_config, ':h')
|
||||||
|
endif
|
||||||
|
|
||||||
|
return ''
|
||||||
|
endfunction
|
|
@ -0,0 +1,21 @@
|
||||||
|
Before:
|
||||||
|
call ale#assert#SetUpLinterTest('swift', 'sourcekitlsp')
|
||||||
|
|
||||||
|
After:
|
||||||
|
call ale#assert#TearDownLinterTest()
|
||||||
|
|
||||||
|
Execute(The default executable path should be correct):
|
||||||
|
call ale#test#SetFilename('../swift-test-files/swift-package-project/src/folder/dummy.swift')
|
||||||
|
|
||||||
|
AssertLinter 'sourcekit-lsp', ale#Escape('sourcekit-lsp')
|
||||||
|
|
||||||
|
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_sourcekit_lsp_executable = '/path/to/custom/sourcekitlsp'
|
||||||
|
|
||||||
|
AssertLinter '/path/to/custom/sourcekitlsp',
|
||||||
|
\ ale#Escape('/path/to/custom/sourcekitlsp')
|
||||||
|
|
||||||
|
Execute(The language should be correct):
|
||||||
|
AssertLSPLanguage 'swift'
|
18
test/test_swift_find_project_root.vader
Normal file
18
test/test_swift_find_project_root.vader
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
Before:
|
||||||
|
call ale#test#SetDirectory('/testplugin/test')
|
||||||
|
|
||||||
|
After:
|
||||||
|
call ale#test#RestoreDirectory()
|
||||||
|
|
||||||
|
Execute(Detect root of Swift project with Package.swift correctly):
|
||||||
|
call ale#test#SetFilename('swift-test-files/swift-package-project/src/folder/dummy.swift')
|
||||||
|
AssertEqual
|
||||||
|
\ ale#path#Simplify(g:dir . '/swift-test-files/swift-package-project'),
|
||||||
|
\ ale#swift#FindProjectRoot(bufnr(''))
|
||||||
|
|
||||||
|
Execute(Detect no root in case of non-Package.swift project):
|
||||||
|
call ale#test#SetFilename('swift-test-files/non-swift-package-project/src/folder/dummy.swift')
|
||||||
|
AssertEqual
|
||||||
|
\ '',
|
||||||
|
\ ale#swift#FindProjectRoot(bufnr(''))
|
||||||
|
|
Reference in a new issue