[lsp] Add Swift / SourceKit-LSP support (#2420)

* [linter] Add LSP support for Swift via sourcekit-lsp
This commit is contained in:
Dan Loman 2019-04-08 08:25:30 -07:00 committed by w0rp
parent 9a0ece1ecb
commit 864d0861e4
7 changed files with 65 additions and 0 deletions

View 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
View 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

View file

@ -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'

View 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(''))