mirror of
https://github.com/dense-analysis/ale.git
synced 2026-05-19 23:09:58 +08:00
Add support for LilyPond syntax (#5117)
* Add support for LilyPond syntax See: https://lilypond.org/ * Fix alpha order of LilyPond * Add support for custom executable and options to lilypond linter Enhances the lilypond linter with configurable options: - Add g:ale_lilypond_lilypond_executable for custom lilypond binary path - Add g:ale_lilypond_lilypond_options for additional command-line flags - Refactor linter to use GetCommand() function for dynamic command building - Add linter tests covering configuration scenarios - Update documentation with usage examples and proper formatting --------- Co-authored-by: samb0t <sambottoni@gmail.com>
This commit is contained in:
@@ -0,0 +1,40 @@
|
|||||||
|
" Author: Sam Bottoni
|
||||||
|
" Description: lilypond linter for LilyPond files
|
||||||
|
|
||||||
|
call ale#Set('lilypond_lilypond_executable', 'lilypond')
|
||||||
|
|
||||||
|
let g:ale_lilypond_lilypond_options = get(g:, 'ale_lilypond_lilypond_options', '')
|
||||||
|
|
||||||
|
function! ale_linters#lilypond#lilypond#GetCommand(buffer) abort
|
||||||
|
return '%e --loglevel=WARNING -dbackend=null -dno-print-pages -o /tmp'
|
||||||
|
\ . ale#Pad(ale#Var(a:buffer, 'lilypond_lilypond_options'))
|
||||||
|
\ . ' %t 2>&1'
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! ale_linters#lilypond#lilypond#Handle(buffer, lines) abort
|
||||||
|
let l:output = []
|
||||||
|
|
||||||
|
for l:line in a:lines
|
||||||
|
" Match: file:line:col: error|warning|programming error: message
|
||||||
|
let l:match = matchlist(l:line,
|
||||||
|
\ '\v^.*:(\d+):(\d+): (error|warning|programming error): (.*)$')
|
||||||
|
|
||||||
|
if !empty(l:match)
|
||||||
|
call add(l:output, {
|
||||||
|
\ 'lnum': str2nr(l:match[1]),
|
||||||
|
\ 'col': str2nr(l:match[2]),
|
||||||
|
\ 'type': l:match[3] =~? 'error' ? 'E' : 'W',
|
||||||
|
\ 'text': l:match[4]
|
||||||
|
\})
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
|
||||||
|
return l:output
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
call ale#linter#Define('lilypond', {
|
||||||
|
\ 'name': 'lilypond',
|
||||||
|
\ 'executable': {b -> ale#Var(b, 'lilypond_lilypond_executable')},
|
||||||
|
\ 'command': function('ale_linters#lilypond#lilypond#GetCommand'),
|
||||||
|
\ 'callback': 'ale_linters#lilypond#lilypond#Handle',
|
||||||
|
\})
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
===============================================================================
|
||||||
|
ALE LilyPond Integration *ale-lilypond-options*
|
||||||
|
|
||||||
|
|
||||||
|
===============================================================================
|
||||||
|
lilypond *ale-lilypond*
|
||||||
|
|
||||||
|
g:ale_lilypond_lilypond_executable *g:ale_lilypond_lilypond_executable*
|
||||||
|
*b:ale_lilypond_lilypond_executable*
|
||||||
|
Type: |String|
|
||||||
|
Default: `'lilypond'`
|
||||||
|
|
||||||
|
This variable can be changed to modify the executable used for lilypond.
|
||||||
|
|
||||||
|
|
||||||
|
g:ale_lilypond_lilypond_options *g:ale_lilypond_lilypond_options*
|
||||||
|
*b:ale_lilypond_lilypond_options*
|
||||||
|
Type: |String|
|
||||||
|
Default: `''`
|
||||||
|
|
||||||
|
This variable can be changed to modify flags given to lilypond.
|
||||||
|
|
||||||
|
For example, to add custom include paths: >
|
||||||
|
|
||||||
|
let g:ale_lilypond_lilypond_options = '--include=/path/to/includes'
|
||||||
|
<
|
||||||
|
|
||||||
|
===============================================================================
|
||||||
|
vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl:
|
||||||
@@ -383,6 +383,8 @@ Notes:
|
|||||||
* `lessc`
|
* `lessc`
|
||||||
* `prettier`
|
* `prettier`
|
||||||
* `stylelint`
|
* `stylelint`
|
||||||
|
* LilyPond
|
||||||
|
* `lilypond`
|
||||||
* LLVM
|
* LLVM
|
||||||
* `llc`
|
* `llc`
|
||||||
* Lua
|
* Lua
|
||||||
|
|||||||
@@ -3722,6 +3722,8 @@ documented in additional help files.
|
|||||||
lessc.................................|ale-less-lessc|
|
lessc.................................|ale-less-lessc|
|
||||||
prettier..............................|ale-less-prettier|
|
prettier..............................|ale-less-prettier|
|
||||||
stylelint.............................|ale-less-stylelint|
|
stylelint.............................|ale-less-stylelint|
|
||||||
|
lilypond................................|ale-lilypond-options|
|
||||||
|
lilypond..............................|ale-lilypond|
|
||||||
llvm....................................|ale-llvm-options|
|
llvm....................................|ale-llvm-options|
|
||||||
llc...................................|ale-llvm-llc|
|
llc...................................|ale-llvm-llc|
|
||||||
lua.....................................|ale-lua-options|
|
lua.....................................|ale-lua-options|
|
||||||
|
|||||||
@@ -393,6 +393,8 @@ formatting.
|
|||||||
* [lessc](https://www.npmjs.com/package/less)
|
* [lessc](https://www.npmjs.com/package/less)
|
||||||
* [prettier](https://github.com/prettier/prettier)
|
* [prettier](https://github.com/prettier/prettier)
|
||||||
* [stylelint](https://github.com/stylelint/stylelint)
|
* [stylelint](https://github.com/stylelint/stylelint)
|
||||||
|
* LilyPond
|
||||||
|
* [lilypond](https://lilypond.org/)
|
||||||
* LLVM
|
* LLVM
|
||||||
* [llc](https://llvm.org/docs/CommandGuide/llc.html)
|
* [llc](https://llvm.org/docs/CommandGuide/llc.html)
|
||||||
* Lua
|
* Lua
|
||||||
|
|||||||
@@ -0,0 +1,49 @@
|
|||||||
|
Before:
|
||||||
|
runtime ale_linters/lilypond/lilypond.vim
|
||||||
|
call ale#linter#Reset()
|
||||||
|
|
||||||
|
Execute(The lilypond handler should parse a single error correctly):
|
||||||
|
AssertEqual
|
||||||
|
\ [
|
||||||
|
\ {
|
||||||
|
\ 'lnum': 2,
|
||||||
|
\ 'col': 5,
|
||||||
|
\ 'type': 'E',
|
||||||
|
\ 'text': 'syntax error, unexpected NOT_A_TOKEN',
|
||||||
|
\ }
|
||||||
|
\ ],
|
||||||
|
\ ale_linters#lilypond#lilypond#Handle(0, [
|
||||||
|
\ 'test.ly:2:5: error: syntax error, unexpected NOT_A_TOKEN'
|
||||||
|
\ ])
|
||||||
|
|
||||||
|
Execute(The lilypond handler should parse warnings and errors):
|
||||||
|
AssertEqual
|
||||||
|
\ [
|
||||||
|
\ {
|
||||||
|
\ 'lnum': 3,
|
||||||
|
\ 'col': 1,
|
||||||
|
\ 'type': 'W',
|
||||||
|
\ 'text': 'deprecated syntax',
|
||||||
|
\ },
|
||||||
|
\ {
|
||||||
|
\ 'lnum': 5,
|
||||||
|
\ 'col': 12,
|
||||||
|
\ 'type': 'E',
|
||||||
|
\ 'text': 'unknown symbol',
|
||||||
|
\ }
|
||||||
|
\ ],
|
||||||
|
\ ale_linters#lilypond#lilypond#Handle(0, [
|
||||||
|
\ 'test.ly:3:1: warning: deprecated syntax',
|
||||||
|
\ 'test.ly:5:12: error: unknown symbol'
|
||||||
|
\ ])
|
||||||
|
|
||||||
|
Execute(The lilypond handler should ignore non-matching lines):
|
||||||
|
AssertEqual
|
||||||
|
\ [],
|
||||||
|
\ ale_linters#lilypond#lilypond#Handle(0, [
|
||||||
|
\ 'This is some unrelated output',
|
||||||
|
\ 'Another line without structure'
|
||||||
|
\ ])
|
||||||
|
|
||||||
|
After:
|
||||||
|
call ale#linter#Reset()
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
Before:
|
||||||
|
call ale#assert#SetUpLinterTest('lilypond', 'lilypond')
|
||||||
|
call ale#test#SetFilename('test.ly')
|
||||||
|
|
||||||
|
let g:ale_lilypond_lilypond_executable = 'lilypond'
|
||||||
|
let g:ale_lilypond_lilypond_options = ''
|
||||||
|
|
||||||
|
After:
|
||||||
|
call ale#assert#TearDownLinterTest()
|
||||||
|
|
||||||
|
Execute(The executable should default to lilypond):
|
||||||
|
AssertLinter 'lilypond',
|
||||||
|
\ ale#Escape('lilypond') . ' --loglevel=WARNING -dbackend=null -dno-print-pages -o /tmp %t 2>&1'
|
||||||
|
|
||||||
|
Execute(Should be able to set a custom executable):
|
||||||
|
let g:ale_lilypond_lilypond_executable = 'bin/lilypond'
|
||||||
|
|
||||||
|
AssertLinter 'bin/lilypond',
|
||||||
|
\ ale#Escape('bin/lilypond') . ' --loglevel=WARNING -dbackend=null -dno-print-pages -o /tmp %t 2>&1'
|
||||||
|
|
||||||
|
Execute(Should be able to set custom options):
|
||||||
|
let g:ale_lilypond_lilypond_options = '--include=/path/to/includes'
|
||||||
|
|
||||||
|
AssertLinter 'lilypond',
|
||||||
|
\ ale#Escape('lilypond') . ' --loglevel=WARNING -dbackend=null -dno-print-pages -o /tmp'
|
||||||
|
\ . ' --include=/path/to/includes %t 2>&1'
|
||||||
|
|
||||||
|
Execute(Should be able to set both custom executable and options):
|
||||||
|
let g:ale_lilypond_lilypond_executable = '/usr/local/bin/lilypond'
|
||||||
|
let g:ale_lilypond_lilypond_options = '--include=/custom/path -dlog-file=/tmp/lily.log'
|
||||||
|
|
||||||
|
AssertLinter '/usr/local/bin/lilypond',
|
||||||
|
\ ale#Escape('/usr/local/bin/lilypond') . ' --loglevel=WARNING -dbackend=null -dno-print-pages -o /tmp'
|
||||||
|
\ . ' --include=/custom/path -dlog-file=/tmp/lily.log %t 2>&1'
|
||||||
|
|
||||||
Reference in New Issue
Block a user