[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