parent
555d23c035
commit
73d031d7ea
@ -75,6 +75,7 @@ formatting.
|
||||
| Bourne Shell | shell [-n flag](http://linux.die.net/man/1/sh), [shellcheck](https://www.shellcheck.net/) |
|
||||
| C | [cppcheck](http://cppcheck.sourceforge.net), [cpplint](https://github.com/google/styleguide/tree/gh-pages/cpplint), [gcc](https://gcc.gnu.org/), [clang](http://clang.llvm.org/), [clangtidy](http://clang.llvm.org/extra/clang-tidy/) !!, [clang-format](https://clang.llvm.org/docs/ClangFormat.html)|
|
||||
| C++ (filetype cpp) | [clang](http://clang.llvm.org/), [clangcheck](http://clang.llvm.org/docs/ClangCheck.html) !!, [clangtidy](http://clang.llvm.org/extra/clang-tidy/) !!, [cppcheck](http://cppcheck.sourceforge.net), [cpplint](https://github.com/google/styleguide/tree/gh-pages/cpplint) !!, [gcc](https://gcc.gnu.org/), [clang-format](https://clang.llvm.org/docs/ClangFormat.html)|
|
||||
| CUDA | [nvcc](http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html) |
|
||||
| C# | [mcs](http://www.mono-project.com/docs/about-mono/languages/csharp/) |
|
||||
| Chef | [foodcritic](http://www.foodcritic.io/) |
|
||||
| CMake | [cmakelint](https://github.com/richq/cmake-lint) |
|
||||
|
56
ale_linters/cuda/nvcc.vim
Normal file
56
ale_linters/cuda/nvcc.vim
Normal file
@ -0,0 +1,56 @@
|
||||
" Author: blahgeek <i@blahgeek.com>
|
||||
" Description: NVCC linter for cuda files
|
||||
|
||||
call ale#Set('cuda_nvcc_executable', 'nvcc')
|
||||
call ale#Set('cuda_nvcc_options', '-std=c++11')
|
||||
|
||||
function! ale_linters#cuda#nvcc#GetExecutable(buffer) abort
|
||||
return ale#Var(a:buffer, 'cuda_nvcc_executable')
|
||||
endfunction
|
||||
|
||||
function! ale_linters#cuda#nvcc#GetCommand(buffer) abort
|
||||
" Unused: use ale#util#nul_file
|
||||
" let l:output_file = tempname() . '.ii'
|
||||
" call ale#engine#ManageFile(a:buffer, l:output_file)
|
||||
|
||||
return ale#Escape(ale_linters#cuda#nvcc#GetExecutable(a:buffer))
|
||||
\ . ' -cuda '
|
||||
\ . ale#c#IncludeOptions(ale#c#FindLocalHeaderPaths(a:buffer))
|
||||
\ . ale#Var(a:buffer, 'cuda_nvcc_options') . ' %s'
|
||||
\ . ' -o ' . g:ale#util#nul_file
|
||||
endfunction
|
||||
|
||||
function! ale_linters#cuda#nvcc#HandleNVCCFormat(buffer, lines) abort
|
||||
" Look for lines like the following.
|
||||
"
|
||||
" test.cu(8): error: argument of type "void *" is incompatible with parameter of type "int *"
|
||||
let l:pattern = '\v^([^:\(\)]+):?\(?(\d+)\)?:(\d+)?:?\s*\w*\s*(error|warning): (.+)$'
|
||||
let l:output = []
|
||||
|
||||
for l:match in ale#util#GetMatches(a:lines, l:pattern)
|
||||
|
||||
let l:item = {
|
||||
\ 'lnum': str2nr(l:match[2]),
|
||||
\ 'type': l:match[4] =~# 'error' ? 'E' : 'W',
|
||||
\ 'text': l:match[5],
|
||||
\ 'filename': fnamemodify(l:match[1], ':p'),
|
||||
\}
|
||||
|
||||
if !empty(l:match[3])
|
||||
let l:item.col = str2nr(l:match[3])
|
||||
endif
|
||||
|
||||
call add(l:output, l:item)
|
||||
endfor
|
||||
|
||||
return l:output
|
||||
endfunction
|
||||
|
||||
call ale#linter#Define('cuda', {
|
||||
\ 'name': 'nvcc',
|
||||
\ 'output_stream': 'stderr',
|
||||
\ 'executable_callback': 'ale_linters#cuda#nvcc#GetExecutable',
|
||||
\ 'command_callback': 'ale_linters#cuda#nvcc#GetCommand',
|
||||
\ 'callback': 'ale_linters#cuda#nvcc#HandleNVCCFormat',
|
||||
\ 'lint_file': 1,
|
||||
\})
|
25
doc/ale-cuda.txt
Normal file
25
doc/ale-cuda.txt
Normal file
@ -0,0 +1,25 @@
|
||||
===============================================================================
|
||||
ALE CUDA Integration *ale-cuda-options*
|
||||
|
||||
|
||||
===============================================================================
|
||||
NVCC *ale-cuda-nvcc*
|
||||
|
||||
g:ale_cuda_nvcc_executable *g:ale_cuda_nvcc_executable*
|
||||
*b:ale_cuda_nvcc_executable*
|
||||
Type: |String|
|
||||
Default: `'nvcc'`
|
||||
|
||||
This variable can be changed to use a different executable for nvcc.
|
||||
Currently only nvcc 8.0 is supported.
|
||||
|
||||
|
||||
g:ale_cuda_nvcc_options *g:ale_cuda_nvcc_options*
|
||||
*b:ale_cuda_nvcc_options*
|
||||
Type: |String|
|
||||
Default: `'-std=c++11'`
|
||||
|
||||
This variable can be changed to modify flags given to nvcc.
|
||||
|
||||
===============================================================================
|
||||
vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl:
|
@ -32,6 +32,8 @@ CONTENTS *ale-contents*
|
||||
cpplint.............................|ale-cpp-cpplint|
|
||||
gcc.................................|ale-cpp-gcc|
|
||||
clang-format........................|ale-cpp-clangformat|
|
||||
cuda..................................|ale-cuda-options|
|
||||
nvcc................................|ale-cuda-nvcc|
|
||||
css...................................|ale-css-options|
|
||||
prettier............................|ale-css-prettier|
|
||||
stylelint...........................|ale-css-stylelint|
|
||||
@ -201,6 +203,7 @@ Notes:
|
||||
* Bourne Shell: `shell` (-n flag), `shellcheck`
|
||||
* C: `cppcheck`, `cpplint`!!, `gcc`, `clang`, `clangtidy`!!, `clang-format`
|
||||
* C++ (filetype cpp): `clang`, `clangcheck`!!, `clangtidy`!!, `cppcheck`, `cpplint`!!, `gcc`, `clang-format`
|
||||
* CUDA: `nvcc`!!
|
||||
* C#: `mcs`
|
||||
* Chef: `foodcritic`
|
||||
* CMake: `cmakelint`
|
||||
|
34
test/command_callback/test_cuda_nvcc_command_callbacks.vader
Normal file
34
test/command_callback/test_cuda_nvcc_command_callbacks.vader
Normal file
@ -0,0 +1,34 @@
|
||||
Before:
|
||||
Save g:ale_cuda_nvcc_executable
|
||||
Save g:ale_cuda_nvcc_options
|
||||
|
||||
unlet! g:ale_cuda_nvcc_executable
|
||||
unlet! b:ale_cuda_nvcc_executable
|
||||
unlet! g:ale_cuda_nvcc_options
|
||||
unlet! b:ale_cuda_nvcc_options
|
||||
|
||||
runtime ale_linters/cuda/nvcc.vim
|
||||
|
||||
After:
|
||||
Restore
|
||||
unlet! b:ale_cuda_nvcc_executable
|
||||
unlet! b:ale_cuda_nvcc_options
|
||||
call ale#linter#Reset()
|
||||
|
||||
Execute(The executable should be configurable):
|
||||
AssertEqual 'nvcc', ale_linters#cuda#nvcc#GetExecutable(bufnr(''))
|
||||
|
||||
let b:ale_cuda_nvcc_executable = 'foobar'
|
||||
|
||||
AssertEqual 'foobar', ale_linters#cuda#nvcc#GetExecutable(bufnr(''))
|
||||
|
||||
Execute(The executable should be used in the command):
|
||||
AssertEqual
|
||||
\ ale#Escape('nvcc') . ' -cuda -std=c++11 %s -o /dev/null',
|
||||
\ ale_linters#cuda#nvcc#GetCommand(bufnr(''))
|
||||
|
||||
let b:ale_cuda_nvcc_executable = 'foobar'
|
||||
|
||||
AssertEqual
|
||||
\ ale#Escape('foobar') . ' -cuda -std=c++11 %s -o /dev/null',
|
||||
\ ale_linters#cuda#nvcc#GetCommand(bufnr(''))
|
29
test/handler/test_cuda_nvcc_handler.vader
Normal file
29
test/handler/test_cuda_nvcc_handler.vader
Normal file
@ -0,0 +1,29 @@
|
||||
Execute(The cuda nvcc handler should parse errors from multiple files for NVCC 8.0):
|
||||
AssertEqual
|
||||
\ [
|
||||
\ {
|
||||
\ 'lnum': 1,
|
||||
\ 'type': 'E',
|
||||
\ 'text': 'this declaration has no storage class or type specifier',
|
||||
\ 'filename': '/tmp/cudatest/test.cu',
|
||||
\ },
|
||||
\ {
|
||||
\ 'lnum': 2,
|
||||
\ 'type': 'E',
|
||||
\ 'text': 'attribute "global" does not apply here',
|
||||
\ 'filename': '/tmp/cudatest/common.h',
|
||||
\ },
|
||||
\ {
|
||||
\ 'lnum': 2,
|
||||
\ 'type': 'E',
|
||||
\ 'text': 'expected a ";"',
|
||||
\ 'filename': '/tmp/cudatest/common.h',
|
||||
\ },
|
||||
\ ],
|
||||
\ ale_linters#cuda#nvcc#HandleNVCCFormat(0, [
|
||||
\ '/tmp/cudatest/test.cu(1): error: this declaration has no storage class or type specifier',
|
||||
\ '/tmp/cudatest/common.h(2): error: attribute "global" does not apply here',
|
||||
\ '/tmp/cudatest/common.h(2): error: expected a ";"',
|
||||
\ 'At end of source: warning: parsing restarts here after previous syntax error',
|
||||
\ '3 errors detected in the compilation of "/tmp/tmpxft_00003a9f_00000000-7_test.cpp1.ii".',
|
||||
\ ])
|
Loading…
Reference in New Issue
Block a user