mirror of
https://github.com/dense-analysis/ale.git
synced 2025-12-06 04:34:25 +08:00
Add support for perl language server (#5003)
* Fix perl test case clean-up * Add support for perl language server Co-authored-by: cos <cos>
This commit is contained in:
43
ale_linters/perl/languageserver.vim
Normal file
43
ale_linters/perl/languageserver.vim
Normal file
@@ -0,0 +1,43 @@
|
||||
" Authors: ophirr33 <coghlan.ty@gmail.com>, rymdbar <https://rymdbar.x20.se/>
|
||||
" Description: Perl::LanguageServer for perl, from cpan.org
|
||||
|
||||
" This should have the same value as in perl.vim
|
||||
call ale#Set('perl_perl_executable', 'perl')
|
||||
" Please note that perl_perl_options does not exist here.
|
||||
|
||||
function! ale_linters#perl#languageserver#GetProjectRoot(buffer) abort
|
||||
" Makefile.PL, https://perldoc.perl.org/ExtUtils::MakeMaker
|
||||
" Build.PL, https://metacpan.org/pod/Module::Build
|
||||
" dist.ini, https://metacpan.org/pod/Dist::Zilla
|
||||
let l:potential_roots = [ 'Makefile.PL', 'Build.PL', 'dist.ini', '.git' ]
|
||||
|
||||
for l:root in l:potential_roots
|
||||
let l:project_root = ale#path#FindNearestFile(a:buffer, l:root)
|
||||
|
||||
if !empty(l:project_root)
|
||||
return fnamemodify(l:project_root . '/', ':p:h:h')
|
||||
endif
|
||||
endfor
|
||||
|
||||
return fnamemodify(expand('#' . a:buffer . ':p:h'), ':p:h')
|
||||
endfunction
|
||||
|
||||
call ale#Set('perl_languageserver_config', {})
|
||||
|
||||
function! s:get_lsp_config(buffer) abort
|
||||
" This tool doesn't kick in unless workspace/didChangeConfiguration is
|
||||
" called, thus this function returning a fallback dict when there is no
|
||||
" config.
|
||||
let l:lsp_config = ale#Var(a:buffer, 'perl_languageserver_config')
|
||||
|
||||
return empty(l:lsp_config) ? { 'perl': { 'enable': 1 } } : l:lsp_config
|
||||
endfunction
|
||||
|
||||
call ale#linter#Define('perl', {
|
||||
\ 'name': 'languageserver',
|
||||
\ 'lsp': 'stdio',
|
||||
\ 'executable': {b -> ale#Var(b, 'perl_perl_executable')},
|
||||
\ 'command': '%e -MPerl::LanguageServer -ePerl::LanguageServer::run',
|
||||
\ 'lsp_config': {b -> s:get_lsp_config(b)},
|
||||
\ 'project_root': function('ale_linters#perl#languageserver#GetProjectRoot'),
|
||||
\ })
|
||||
@@ -35,6 +35,42 @@ g:ale_perl_perl_options
|
||||
invocation.
|
||||
|
||||
|
||||
===============================================================================
|
||||
perl language server *ale-perl-languageserver*
|
||||
|
||||
perl_perl_executable
|
||||
g:ale_perl_perl_executable
|
||||
Type: |String|
|
||||
Default: `'perl'`
|
||||
|
||||
The language server will use the same variable as |ale-perl-perl| to launch
|
||||
the perl executable with the Perl::LanguageServer module.
|
||||
|
||||
*ale-options.perl_languageserver_config*
|
||||
*g:ale_perl_languageserver_config*
|
||||
*b:ale_perl_languageserver_config*
|
||||
perl_languageserver_config
|
||||
g:ale_perl_languageserver_config
|
||||
Type: |Dictionary|
|
||||
Default: `'{}'`
|
||||
|
||||
This variable can be changed to customize the lsp_config (sent as a
|
||||
workspace/didChangeConfiguration command).
|
||||
For example: >
|
||||
|
||||
let g:ale_perl_languageserver_config = {
|
||||
\ 'perl': {
|
||||
\ 'fileFilter': [''],
|
||||
\ 'logLevel': 2,
|
||||
\ 'logFile': '/tmp/plls-log.txt',
|
||||
\ 'perlInc': ['/usr/share/perl5/', '/usr/local/share/perl5/' ],
|
||||
\ },
|
||||
\}
|
||||
<
|
||||
For all available options and explanations, visit
|
||||
https://metacpan.org/pod/Perl::LanguageServer#Extension-Settings
|
||||
|
||||
|
||||
===============================================================================
|
||||
perlcritic *ale-perl-perlcritic*
|
||||
|
||||
|
||||
@@ -472,6 +472,7 @@ Notes:
|
||||
* Pawn
|
||||
* `uncrustify`
|
||||
* Perl
|
||||
* `languageserver`
|
||||
* `perl -c`
|
||||
* `perl-critic`
|
||||
* `perltidy`
|
||||
|
||||
@@ -3750,6 +3750,7 @@ documented in additional help files.
|
||||
uncrustify............................|ale-pawn-uncrustify|
|
||||
perl....................................|ale-perl-options|
|
||||
perl..................................|ale-perl-perl|
|
||||
perl language server..................|ale-perl-languageserver|
|
||||
perlcritic............................|ale-perl-perlcritic|
|
||||
perltidy..............................|ale-perl-perltidy|
|
||||
perl6...................................|ale-perl6-options|
|
||||
|
||||
@@ -482,6 +482,7 @@ formatting.
|
||||
* Pawn
|
||||
* [uncrustify](https://github.com/uncrustify/uncrustify)
|
||||
* Perl
|
||||
* [languageserver](https://metacpan.org/pod/Perl::LanguageServer)
|
||||
* [perl -c](https://perl.org/) :warning:
|
||||
* [perl-critic](https://metacpan.org/pod/Perl::Critic)
|
||||
* [perltidy](https://metacpan.org/pod/distribution/Perl-Tidy/bin/perltidy)
|
||||
|
||||
@@ -12,3 +12,5 @@ Execute(Overriding the executable and command should work):
|
||||
let b:ale_perl_perl_options = '-w'
|
||||
|
||||
AssertLinter 'foobar', ale#Escape('foobar') . ' -w %t'
|
||||
unlet b:ale_perl_perl_executable
|
||||
unlet b:ale_perl_perl_options
|
||||
|
||||
82
test/linter/test_perl_languageserver.vader
Normal file
82
test/linter/test_perl_languageserver.vader
Normal file
@@ -0,0 +1,82 @@
|
||||
" Author: rymdbar <https://rymdbar.x20.se/>
|
||||
|
||||
Before:
|
||||
call ale#assert#SetUpLinterTest('perl', 'languageserver')
|
||||
|
||||
After:
|
||||
call ale#assert#TearDownLinterTest()
|
||||
|
||||
Execute(The default Perl command callback should be correct):
|
||||
AssertLinter 'perl',
|
||||
\ ale#Escape('perl') . ' -MPerl::LanguageServer -ePerl::LanguageServer::run'
|
||||
|
||||
Execute(Overriding the executable should work):
|
||||
let b:ale_perl_perl_executable = 'plls'
|
||||
|
||||
AssertLinter 'plls', ale#Escape('plls') .
|
||||
\ ' -MPerl::LanguageServer -ePerl::LanguageServer::run'
|
||||
unlet b:ale_perl_perl_executable
|
||||
|
||||
Execute(The project root should be detected correctly in from build files):
|
||||
for mod in ['extutils-makemaker', 'module-build', 'dist-zilla']
|
||||
call ale#test#SetFilename('../test-files/perl/' . mod . '/subdir/empty.pl')
|
||||
|
||||
AssertLSPProject ale#path#Simplify(g:dir . '/../test-files/perl/' . mod)
|
||||
endfor
|
||||
|
||||
Execute(The project root should be globally configurable):
|
||||
for mod in ['extutils-makemaker', 'module-build', 'dist-zilla']
|
||||
call ale#test#SetFilename('../test-files/perl/'. mod . '/subdir/empty.pl')
|
||||
" Configuring g:ale_root using a Dictionary works.
|
||||
let g:ale_root.languageserver =
|
||||
\ ale#path#Simplify(g:dir . '/../test-files/perl')
|
||||
|
||||
AssertLSPProject ale#path#Simplify(g:dir . '/../test-files/perl')
|
||||
unlet g:ale_root.languageserver
|
||||
" As tracked by <https://github.com/dense-analysis/ale/issues/5002>, there
|
||||
" is a bug with g:ale_root.
|
||||
" While attempting to configure g:ale_root using a String might be a quite
|
||||
" limiting setup, it would be handy for debugging. However the test case is
|
||||
" missing here. It would unfortunately just fail.
|
||||
endfor
|
||||
|
||||
Execute(The project root should be per buffer configurable):
|
||||
for mod in ['extutils-makemaker', 'module-build', 'dist-zilla']
|
||||
call ale#test#SetFilename('../test-files/perl/'. mod . '/subdir/empty.pl')
|
||||
" Configuring b:ale_root using a String works.
|
||||
let b:ale_root = ale#path#Simplify(g:dir . '/../test-files/perl')
|
||||
|
||||
AssertLSPProject ale#path#Simplify(g:dir . '/../test-files/perl')
|
||||
unlet b:ale_root
|
||||
|
||||
" Configuring b:ale_root using a Dictionary works.
|
||||
let b:ale_root = {
|
||||
\ 'languageserver': ale#path#Simplify(g:dir . '/../test-files/perl')
|
||||
\ }
|
||||
|
||||
AssertLSPProject ale#path#Simplify(g:dir . '/../test-files/perl')
|
||||
unlet b:ale_root.languageserver
|
||||
endfor
|
||||
|
||||
Execute(The LSP values should be set correctly):
|
||||
|
||||
AssertLSPLanguage 'perl'
|
||||
|
||||
AssertLSPOptions {}
|
||||
|
||||
AssertLSPConfig {'perl': {'enable': 1}}
|
||||
|
||||
Execute(Should accept configuration settings):
|
||||
let b:ale_perl_languageserver_config = {
|
||||
\ 'perl': {
|
||||
\ 'perlInc': ['/usr/share/perl5/', '/usr/local/share/perl5/' ],
|
||||
\ 'fileFilter': [''],
|
||||
\ },
|
||||
\ }
|
||||
|
||||
AssertLSPConfig {
|
||||
\ 'perl': {
|
||||
\ 'perlInc': ['/usr/share/perl5/', '/usr/local/share/perl5/' ],
|
||||
\ 'fileFilter': [''],
|
||||
\ },
|
||||
\ }
|
||||
1
test/test-files/perl/dist-zilla/dist.ini
Normal file
1
test/test-files/perl/dist-zilla/dist.ini
Normal file
@@ -0,0 +1 @@
|
||||
# https://metacpan.org/pod/Dist::Zilla
|
||||
0
test/test-files/perl/dist-zilla/subdir/empty.pl
Normal file
0
test/test-files/perl/dist-zilla/subdir/empty.pl
Normal file
1
test/test-files/perl/extutils-makemaker/Makefile.PL
Normal file
1
test/test-files/perl/extutils-makemaker/Makefile.PL
Normal file
@@ -0,0 +1 @@
|
||||
# https://perldoc.perl.org/ExtUtils::MakeMaker
|
||||
1
test/test-files/perl/module-build/Build.PL
Normal file
1
test/test-files/perl/module-build/Build.PL
Normal file
@@ -0,0 +1 @@
|
||||
# https://metacpan.org/pod/Module::Build
|
||||
0
test/test-files/perl/module-build/subdir/empty.pl
Normal file
0
test/test-files/perl/module-build/subdir/empty.pl
Normal file
Reference in New Issue
Block a user