From 87e079a9b25ebf5818b8451874ce2a8bd614226f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?N=C3=A9stor=20Coppi?= Date: Sun, 4 Jul 2021 09:40:12 -0300 Subject: [PATCH] Solidity solc linter compatible with 0.6/0.7/0.8 (#3763) --- ale_linters/solidity/solc.vim | 42 ++++++++++++++++++++-------- doc/ale-solidity.txt | 7 ++++- test/handler/test_solc_handler.vader | 16 +++++++---- test/linter/test_solc_commit.vader | 14 ++++++++++ 4 files changed, 60 insertions(+), 19 deletions(-) create mode 100644 test/linter/test_solc_commit.vader diff --git a/ale_linters/solidity/solc.vim b/ale_linters/solidity/solc.vim index e4f220ac..28977083 100644 --- a/ale_linters/solidity/solc.vim +++ b/ale_linters/solidity/solc.vim @@ -1,34 +1,52 @@ " Author: Karl Bartel - http://karl.berlin/ " Description: Report solc compiler errors in Solidity code +call ale#Set('solidity_solc_executable', 'solc') call ale#Set('solidity_solc_options', '') function! ale_linters#solidity#solc#Handle(buffer, lines) abort " Matches patterns like the following: - " /path/to/file/file.sol:1:10: Error: Identifier not found or not unique. - let l:pattern = '\v^[^:]+:(\d+):(\d+): (Error|Warning): (.*)$' + " Error: Expected ';' but got '(' + " --> /path/to/file/file.sol:1:10:) + let l:pattern = '\v(Error|Warning): (.*)$' + let l:line_and_column_pattern = '\v\.sol:(\d+):(\d+):' let l:output = [] - for l:match in ale#util#GetMatches(a:lines, l:pattern) - let l:isError = l:match[3] is? 'error' - call add(l:output, { - \ 'lnum': l:match[1] + 0, - \ 'col': l:match[2] + 0, - \ 'text': l:match[4], - \ 'type': l:isError ? 'E' : 'W', - \}) + for l:line in a:lines + let l:match = matchlist(l:line, l:pattern) + + if len(l:match) == 0 + let l:match = matchlist(l:line, l:line_and_column_pattern) + + if len(l:match) > 0 + let l:index = len(l:output) - 1 + let l:output[l:index]['lnum'] = l:match[1] + 0 + let l:output[l:index]['col'] = l:match[2] + 0 + endif + else + let l:isError = l:match[1] is? 'Error' + + call add(l:output, { + \ 'lnum': 0, + \ 'col': 0, + \ 'text': l:match[2], + \ 'type': l:isError ? 'E' : 'W', + \}) + endif endfor return l:output endfunction function! ale_linters#solidity#solc#GetCommand(buffer) abort - return 'solc' . ale#Pad(ale#Var(a:buffer, 'solidity_solc_options')) . ' %s' + let l:executable = ale#Var(a:buffer, 'solidity_solc_executable') + + return l:executable . ale#Pad(ale#Var(a:buffer, 'solidity_solc_options')) . ' %s' endfunction call ale#linter#Define('solidity', { \ 'name': 'solc', -\ 'executable': 'solc', +\ 'executable': {b -> ale#Var(b, 'solidity_solc_executable')}, \ 'command': function('ale_linters#solidity#solc#GetCommand'), \ 'callback': 'ale_linters#solidity#solc#Handle', \ 'output_stream': 'stderr', diff --git a/doc/ale-solidity.txt b/doc/ale-solidity.txt index b6e48675..c4d2f02f 100644 --- a/doc/ale-solidity.txt +++ b/doc/ale-solidity.txt @@ -5,6 +5,12 @@ ALE Solidity Integration *ale-solidity-options* =============================================================================== solc *ale-solidity-solc* +g:ale_solidity_solc_executable *g:ale_solidity_solc_executable* + *b:ale_solidity_solc_executable* + Type: |String| + Default: `'solc'` + + Override the invoked solc binary. For truffle/hardhat binaries. g:ale_solidity_solc_options *g:ale_solidity_solc_options* *b:ale_solidity_solc_options* @@ -33,4 +39,3 @@ solium *ale-solidity-solium* =============================================================================== vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: - diff --git a/test/handler/test_solc_handler.vader b/test/handler/test_solc_handler.vader index 8c197507..dcaa8b2d 100644 --- a/test/handler/test_solc_handler.vader +++ b/test/handler/test_solc_handler.vader @@ -21,10 +21,14 @@ Execute(Check solc output parsing): \ }, \ ], \ ale_linters#solidity#solc#Handle(bufnr(''), [ - \ 'raiden_contracts/data/source/raiden/Token.sol:40:48: Warning: This declaration shadows an existing declaration.', - \ ' function decimals() external view returns (uint8 decimals);', - \ ' ^------------^', - \ '/home/karl/raiden-contracts/raiden_contracts/data/source/test/OneToNInternalsTest.sol:23:16: Error: Member "getSinleSignature" not found or not visible after argument-dependent lookup in type(contract OneToN).', - \ ' return OneToN.getSinleSignature(signatures, i);', - \ ' ^----------------------^', + \ 'Warning: This declaration shadows an existing declaration.', + \ ' --> /path/to/file.sol:40:48:', + \ ' |', + \ '40 | function decimals() external view returns (uint8 decimals);', + \ ' | ^------------^', + \ 'Error: Member "getSinleSignature" not found or not visible after argument-dependent lookup in type(contract OneToN).', + \ ' --> /path/to/file.sol:23:16: ', + \ ' | ', + \ '23 | return OneToN.getSinleSignature(signatures, i);', + \ ' | ^----------------------^', \ ]) diff --git a/test/linter/test_solc_commit.vader b/test/linter/test_solc_commit.vader new file mode 100644 index 00000000..e25c47e7 --- /dev/null +++ b/test/linter/test_solc_commit.vader @@ -0,0 +1,14 @@ +Before: + call ale#assert#SetUpLinterTest('solidity', 'solc') + let g:ale_solidity_solc_executable = 'solc-v0.8.4+commit.c7e474f2' + +After: + call ale#assert#TearDownLinterTest() + +Execute(The executable command should be configurable): + AssertLinter 'solc-v0.8.4+commit.c7e474f2', 'solc-v0.8.4+commit.c7e474f2 %s' + +Execute(The options should be configurable): + let g:ale_solidity_solc_options = '--foobar' + + AssertLinter 'solc-v0.8.4+commit.c7e474f2', 'solc-v0.8.4+commit.c7e474f2 --foobar %s'