mirror of
https://github.com/dense-analysis/ale.git
synced 2025-12-07 13:14:29 +08:00
Add support for verible: language server + fixer (#4994)
* Add support for verible: language server + fixer * verible: add default flag, rules support for verible-ls
This commit is contained in:
committed by
GitHub
parent
29f1ff2579
commit
6d7bc15d9a
43
ale_linters/verilog/verible_ls.vim
Normal file
43
ale_linters/verilog/verible_ls.vim
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
" Author: Nicolas Derumigny <https://github.com/nicolasderumigny>
|
||||||
|
" Description: Verible LSP for verilog
|
||||||
|
|
||||||
|
call ale#Set('verilog_verible_ls_options', '--rules_config_search')
|
||||||
|
call ale#Set('verilog_verible_ls_rules', '')
|
||||||
|
call ale#Set('verilog_verible_ls_executable', 'verible-verilog-ls')
|
||||||
|
call ale#Set('verilog_verible_ls_config', {})
|
||||||
|
|
||||||
|
function! ale_linters#verilog#verible_ls#GetProjectRoot(buffer) abort
|
||||||
|
let l:git_dir = ale#path#FindNearestFile(a:buffer, 'verible.filelist')
|
||||||
|
|
||||||
|
if !empty(l:git_dir)
|
||||||
|
return fnamemodify(l:git_dir, ':p:h')
|
||||||
|
else
|
||||||
|
return fnamemodify('', ':h')
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! ale_linters#verilog#verible_ls#GetCommand(buffer) abort
|
||||||
|
let l:command = ale#Escape(ale#Var(a:buffer, 'verilog_verible_ls_executable'))
|
||||||
|
let l:options = ale#Var(a:buffer, 'verilog_verible_ls_options')
|
||||||
|
let l:rules = ale#Var(a:buffer, 'verilog_verible_ls_rules')
|
||||||
|
|
||||||
|
if l:options isnot# ''
|
||||||
|
let l:command .= ' ' . l:options
|
||||||
|
endif
|
||||||
|
|
||||||
|
if l:rules isnot# ''
|
||||||
|
let l:command .= ' --rules=' . l:rules
|
||||||
|
endif
|
||||||
|
|
||||||
|
return l:command
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
call ale#linter#Define('verilog', {
|
||||||
|
\ 'name': 'verible_ls',
|
||||||
|
\ 'lsp': 'stdio',
|
||||||
|
\ 'lsp_config': {b -> ale#Var(b, 'verilog_verible_ls_config')},
|
||||||
|
\ 'executable': {b -> ale#Var(b, 'verilog_verible_ls_executable')},
|
||||||
|
\ 'command': function('ale_linters#verilog#verible_ls#GetCommand') ,
|
||||||
|
\ 'project_root': function('ale_linters#verilog#verible_ls#GetProjectRoot'),
|
||||||
|
\})
|
||||||
@@ -742,6 +742,11 @@ let s:default_registry = {
|
|||||||
\ 'suggested_filetypes': ['toml'],
|
\ 'suggested_filetypes': ['toml'],
|
||||||
\ 'description': 'Lints TOML files',
|
\ 'description': 'Lints TOML files',
|
||||||
\ },
|
\ },
|
||||||
|
\ 'verible_format': {
|
||||||
|
\ 'function': 'ale#fixers#verible_format#Fix',
|
||||||
|
\ 'suggested_filetypes': ['verilog'],
|
||||||
|
\ 'description': 'Formats verilog files using verible.',
|
||||||
|
\ },
|
||||||
\}
|
\}
|
||||||
|
|
||||||
" Reset the function registry to the default entries.
|
" Reset the function registry to the default entries.
|
||||||
|
|||||||
17
autoload/ale/fixers/verible_format.vim
Normal file
17
autoload/ale/fixers/verible_format.vim
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
" Author: Nicolas Derumigny <https://github.com/nicolasderumigny>
|
||||||
|
" Description: verible formatter for verilog.
|
||||||
|
|
||||||
|
call ale#Set('verilog_verible_format_executable', 'verible-verilog-format')
|
||||||
|
call ale#Set('verilog_verible_format_options', '')
|
||||||
|
|
||||||
|
function! ale#fixers#verible_format#Fix(buffer) abort
|
||||||
|
let l:executable = ale#Escape(ale#Var(a:buffer, 'verilog_verible_format_executable'))
|
||||||
|
let l:command = l:executable
|
||||||
|
let l:options = ale#Var(a:buffer, 'verilog_verible_format_options')
|
||||||
|
|
||||||
|
if l:options isnot# ''
|
||||||
|
let l:command .= ' ' . l:options
|
||||||
|
endif
|
||||||
|
|
||||||
|
return {'command': l:command . ' -'}
|
||||||
|
endfunction
|
||||||
@@ -724,6 +724,7 @@ Notes:
|
|||||||
* `hdl-checker`
|
* `hdl-checker`
|
||||||
* `iverilog`
|
* `iverilog`
|
||||||
* slang
|
* slang
|
||||||
|
* `verible`
|
||||||
* `verilator`
|
* `verilator`
|
||||||
* `vlog`
|
* `vlog`
|
||||||
* `xvlog`
|
* `xvlog`
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ ALE Verilog/SystemVerilog Integration *ale-verilog-options*
|
|||||||
|
|
||||||
|
|
||||||
===============================================================================
|
===============================================================================
|
||||||
ALE can use seven different linters for Verilog HDL:
|
ALE can use eight different linters for Verilog HDL:
|
||||||
|
|
||||||
HDL Checker
|
HDL Checker
|
||||||
Using `hdl_checker --lsp`
|
Using `hdl_checker --lsp`
|
||||||
@@ -14,6 +14,9 @@ ALE can use seven different linters for Verilog HDL:
|
|||||||
slang:
|
slang:
|
||||||
Using `slang -Weverything`
|
Using `slang -Weverything`
|
||||||
|
|
||||||
|
verible_ls
|
||||||
|
Using `verible-verilog-ls`
|
||||||
|
|
||||||
verilator
|
verilator
|
||||||
Using `verilator --lint-only -Wall`
|
Using `verilator --lint-only -Wall`
|
||||||
|
|
||||||
@@ -35,6 +38,12 @@ defining 'g:ale_linters' variable: >
|
|||||||
\ let g:ale_linters = {'systemverilog' : ['verilator'],}
|
\ let g:ale_linters = {'systemverilog' : ['verilator'],}
|
||||||
<
|
<
|
||||||
|
|
||||||
|
===============================================================================
|
||||||
|
ALE can use one fixer for Verilog HDL:
|
||||||
|
|
||||||
|
|
||||||
|
verible_fomat
|
||||||
|
Using `verible-verilog-format`
|
||||||
===============================================================================
|
===============================================================================
|
||||||
General notes
|
General notes
|
||||||
|
|
||||||
@@ -80,8 +89,74 @@ g:ale_verilog_slang_option
|
|||||||
|
|
||||||
This variable can be changed to modify 'slang' command arguments.
|
This variable can be changed to modify 'slang' command arguments.
|
||||||
|
|
||||||
|
===============================================================================
|
||||||
|
verible_ls *ale-verilog-verible-ls*
|
||||||
|
|
||||||
|
*ale-config.verilog_verible_ls_executable*
|
||||||
|
*g:ale_verilog_verible_ls_executable*
|
||||||
|
*b:ale_verilog_verible_ls_executable*
|
||||||
|
verilog_verible_ls_executable
|
||||||
|
g:ale_verilog_verible_ls_executable
|
||||||
|
Type: |String|
|
||||||
|
Default: `'verible-verilog-ls'`
|
||||||
|
|
||||||
|
This variable can be modifies to change the executable path for `verible_ls`
|
||||||
|
|
||||||
|
*ale-config.verilog_verible_ls_config*
|
||||||
|
*g:ale_verilog_verible_ls_config*
|
||||||
|
*b:ale_verilog_verible_ls_config*
|
||||||
|
verilog_verible_ls_config
|
||||||
|
g:ale_verilog_verible_ls_config
|
||||||
|
Type: |Dictionary|
|
||||||
|
Default: `{}`
|
||||||
|
|
||||||
|
Dictionary with configuration settings for `verible_ls`
|
||||||
|
|
||||||
|
*ale-config.verilog_verible_ls_options*
|
||||||
|
*g:ale_verilog_verible_ls_options*
|
||||||
|
*b:ale_verilog_verible_ls_options*
|
||||||
|
verilog_verible_ls_options
|
||||||
|
g:ale_verilog_verible_ls_options
|
||||||
|
Type: |String|
|
||||||
|
Default: `'--rules_config_search'`
|
||||||
|
|
||||||
|
Additional flags for `verible_ls`
|
||||||
|
|
||||||
|
*ale-config.verilog_verible_ls_rules*
|
||||||
|
*g:ale_verilog_verible_ls_rules*
|
||||||
|
*b:ale_verilog_verible_ls_rules*
|
||||||
|
verilog_verible_ls_rules
|
||||||
|
g:ale_verilog_verible_ls_rules
|
||||||
|
Type: |String|
|
||||||
|
Default: `''`
|
||||||
|
|
||||||
|
Additional rules applied by `verible_ls`
|
||||||
|
|
||||||
===============================================================================
|
===============================================================================
|
||||||
|
verible_format *ale-verilog-verible-format*
|
||||||
|
|
||||||
|
*ale-config.verilog_verible_format_executable*
|
||||||
|
*g:ale_verilog_verible_format_executable*
|
||||||
|
*b:ale_verilog_verible_format_executable*
|
||||||
|
verilog_verible_format_executable
|
||||||
|
g:ale_verilog_verible_format_executable
|
||||||
|
Type: |String|
|
||||||
|
Default: `'verible-verilog-format'`
|
||||||
|
|
||||||
|
This variable can be modifies to change the executable path for
|
||||||
|
`verible_format`
|
||||||
|
|
||||||
|
*ale-config.verilog_verible_format_options*
|
||||||
|
*g:ale_verilog_verible_format_options*
|
||||||
|
*b:ale_verilog_verible_format_options*
|
||||||
|
verilog_verible_format_options
|
||||||
|
g:ale_verilog_verible_format_options
|
||||||
|
Type: |String|
|
||||||
|
Default: `''`
|
||||||
|
|
||||||
|
Additional flags for `verible_format`
|
||||||
|
===============================================================================
|
||||||
|
|
||||||
verilator *ale-verilog-verilator*
|
verilator *ale-verilog-verilator*
|
||||||
|
|
||||||
*ale-options.verilog_verilator_options*
|
*ale-options.verilog_verilator_options*
|
||||||
|
|||||||
@@ -3984,6 +3984,8 @@ documented in additional help files.
|
|||||||
hdl-checker...........................|ale-verilog-hdl-checker|
|
hdl-checker...........................|ale-verilog-hdl-checker|
|
||||||
iverilog..............................|ale-verilog-iverilog|
|
iverilog..............................|ale-verilog-iverilog|
|
||||||
slang.................................|ale-verilog-slang|
|
slang.................................|ale-verilog-slang|
|
||||||
|
verible_ls............................|ale-verilog-verible-ls|
|
||||||
|
verible_format........................|ale-verilog-verible-format|
|
||||||
verilator.............................|ale-verilog-verilator|
|
verilator.............................|ale-verilog-verilator|
|
||||||
vlog..................................|ale-verilog-vlog|
|
vlog..................................|ale-verilog-vlog|
|
||||||
xvlog.................................|ale-verilog-xvlog|
|
xvlog.................................|ale-verilog-xvlog|
|
||||||
|
|||||||
@@ -734,6 +734,7 @@ formatting.
|
|||||||
* [hdl-checker](https://pypi.org/project/hdl-checker)
|
* [hdl-checker](https://pypi.org/project/hdl-checker)
|
||||||
* [iverilog](https://github.com/steveicarus/iverilog)
|
* [iverilog](https://github.com/steveicarus/iverilog)
|
||||||
* [slang](https://github.com/MikePopoloski/slang)
|
* [slang](https://github.com/MikePopoloski/slang)
|
||||||
|
* [verible](https://github.com/chipsalliance/verible/tree/master)
|
||||||
* [verilator](http://www.veripool.org/projects/verilator/wiki/Intro)
|
* [verilator](http://www.veripool.org/projects/verilator/wiki/Intro)
|
||||||
* [vlog](https://www.mentor.com/products/fv/questa/)
|
* [vlog](https://www.mentor.com/products/fv/questa/)
|
||||||
* [xvlog](https://www.xilinx.com/products/design-tools/vivado.html) :speech_balloon:
|
* [xvlog](https://www.xilinx.com/products/design-tools/vivado.html) :speech_balloon:
|
||||||
|
|||||||
16
test/fixers/test_verible_format_fixer_callback.vader
Normal file
16
test/fixers/test_verible_format_fixer_callback.vader
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
Before:
|
||||||
|
call ale#assert#SetUpFixerTest('verilog', 'verible_format')
|
||||||
|
|
||||||
|
After:
|
||||||
|
call ale#assert#TearDownFixerTest()
|
||||||
|
|
||||||
|
Execute(The verible format callback should return the correct default values):
|
||||||
|
AssertFixer {'command': ale#Escape('verible-verilog-format') .' -'}
|
||||||
|
|
||||||
|
Execute(The verible format callback should allow a custom executable):
|
||||||
|
let g:ale_verilog_verible_format_executable = 'foo/bar'
|
||||||
|
AssertFixer {'command': ale#Escape('foo/bar') . ' -'}
|
||||||
|
|
||||||
|
Execute(The verible format callback should allow custom options):
|
||||||
|
let g:ale_verilog_verible_format_options = '--foo --bar'
|
||||||
|
AssertFixer {'command': ale#Escape('verible-verilog-format') .' --foo --bar -'}
|
||||||
33
test/linter/test_verilog_verible_ls.vader
Normal file
33
test/linter/test_verilog_verible_ls.vader
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
Before:
|
||||||
|
call ale#assert#SetUpLinterTest('verilog', 'verible_ls')
|
||||||
|
|
||||||
|
After:
|
||||||
|
call ale#assert#TearDownLinterTest()
|
||||||
|
|
||||||
|
Execute(The default executable path and arguments should be correct):
|
||||||
|
AssertLinter 'verible-verilog-ls', ale#Escape('verible-verilog-ls') . ' --rules_config_search'
|
||||||
|
|
||||||
|
Execute(The project root should be detected correctly in empty directory):
|
||||||
|
AssertLSPProject '.'
|
||||||
|
|
||||||
|
Execute(The project root should be detected correctly with verible.filelist):
|
||||||
|
call ale#test#SetFilename('../test-files/verilog/verible/module.sv')
|
||||||
|
AssertLSPProject ale#path#Simplify(g:dir . '/../test-files/verilog/verible')
|
||||||
|
|
||||||
|
Execute(The LSP values should be set correctly):
|
||||||
|
call ale#test#SetFilename('../test-files/verilog/verible/module.sv')
|
||||||
|
|
||||||
|
AssertLSPLanguage 'verilog'
|
||||||
|
AssertLSPOptions {}
|
||||||
|
AssertLSPConfig {}
|
||||||
|
AssertLSPProject ale#path#Simplify(g:dir . '/../test-files/verilog/verible')
|
||||||
|
|
||||||
|
|
||||||
|
Execute(The verible LSP callback should allow custom options):
|
||||||
|
let g:ale_verilog_verible_ls_options = '--foo --bar'
|
||||||
|
AssertLinter 'verible-verilog-ls', ale#Escape('verible-verilog-ls') . ' --foo --bar'
|
||||||
|
|
||||||
|
|
||||||
|
Execute(The verible LSP callback should allow custom rules):
|
||||||
|
let g:ale_verilog_verible_ls_rules = '+foo,-bar'
|
||||||
|
AssertLinter 'verible-verilog-ls', ale#Escape('verible-verilog-ls') . ' --rules_config_search --rules=+foo,-bar'
|
||||||
0
test/test-files/verilog/verible/module.sv
Normal file
0
test/test-files/verilog/verible/module.sv
Normal file
1
test/test-files/verilog/verible/verible.filelist
Normal file
1
test/test-files/verilog/verible/verible.filelist
Normal file
@@ -0,0 +1 @@
|
|||||||
|
./module.sv
|
||||||
@@ -119,7 +119,7 @@ Execute(The defaults for the zsh filetype should be correct):
|
|||||||
Execute(The defaults for the verilog filetype should be correct):
|
Execute(The defaults for the verilog filetype should be correct):
|
||||||
" This filetype isn't configured with default, so we can test loading all
|
" This filetype isn't configured with default, so we can test loading all
|
||||||
" available linters with this.
|
" available linters with this.
|
||||||
AssertEqual ['hdl_checker', 'iverilog', 'slang', 'verilator', 'vlog', 'xvlog', 'yosys'], GetLinterNames('verilog')
|
AssertEqual ['hdl_checker', 'iverilog', 'slang', 'verible_ls', 'verilator', 'vlog', 'xvlog', 'yosys'], GetLinterNames('verilog')
|
||||||
|
|
||||||
let g:ale_linters_explicit = 1
|
let g:ale_linters_explicit = 1
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user