Feature/add ant support (#2539)

Use ant files to load Java settings too.
This commit is contained in:
Andrew Lee 2019-06-03 12:30:18 -07:00 committed by w0rp
parent a76f056bd9
commit c6a5cbb3c7
8 changed files with 116 additions and 0 deletions

View file

@ -21,6 +21,11 @@ function! ale_linters#java#javac#RunWithImportPaths(buffer) abort
let l:command = ale#gradle#BuildClasspathCommand(a:buffer)
endif
" Try to use Ant if Gradle and Maven aren't available
if empty(l:command)
let l:command = ale#ant#BuildClasspathCommand(a:buffer)
endif
if empty(l:command)
return ale_linters#java#javac#GetCommand(a:buffer, [], {})
endif

41
autoload/ale/ant.vim Normal file
View file

@ -0,0 +1,41 @@
" Author: Andrew Lee <andrewl@mbda.fun>.
" Inspired by ale/gradle.vim by Michael Pardo <michael@michaelpardo.com>
" Description: Functions for working with Ant projects.
" Given a buffer number, find an Ant project root
function! ale#ant#FindProjectRoot(buffer) abort
let l:build_xml_path = ale#path#FindNearestFile(a:buffer, 'build.xml')
if !empty(l:build_xml_path)
return fnamemodify(l:build_xml_path, ':h')
endif
return ''
endfunction
" Given a buffer number, find the path to the `ant` executable. Returns an empty
" string if cannot find the executable.
function! ale#ant#FindExecutable(buffer) abort
if executable('ant')
return 'ant'
endif
return ''
endfunction
" Given a buffer number, build a command to print the classpath of the root
" project. Returns an empty string if cannot build the command.
function! ale#ant#BuildClasspathCommand(buffer) abort
let l:executable = ale#ant#FindExecutable(a:buffer)
let l:project_root = ale#ant#FindProjectRoot(a:buffer)
if !empty(l:executable) && !empty(l:project_root)
return ale#path#CdString(l:project_root)
\ . ale#Escape(l:executable)
\ . ' classpath'
\ . ' -S'
\ . ' -q'
endif
return ''
endfunction

View file

@ -16,5 +16,11 @@ function! ale#java#FindProjectRoot(buffer) abort
return fnamemodify(l:maven_pom_file, ':h')
endif
let l:ant_root = ale#ant#FindProjectRoot(a:buffer)
if !empty(l:ant_root)
return l:ant_root
endif
return ''
endfunction

0
test/ant-test-files/bin/ant Executable file
View file

View file

View file

@ -0,0 +1,29 @@
Before:
call ale#test#SetDirectory('/testplugin/test')
runtime ale_linters/java/javac.vim
Save $PATH
let $PATH = ale#path#Simplify(g:dir . '/ant-test-files/bin')
let g:valid_project = 'ant-test-files/ant-project'
let g:invalid_project = 'ant-test-files/non-ant-project'
let g:command_tail = ' classpath' . ' -S' . ' -q'
After:
Restore
unlet! g:command_tail
unlet! g:valid_project
unlet! g:invalid_project
call ale#test#RestoreDirectory()
call ale#linter#Reset()
Execute(Should return `cd '[dir]' && 'ant' classpath -S -q`):
call ale#test#SetFilename(valid_project . '/Main.java')
AssertEqual
\ ale#path#CdString(ale#path#Simplify(g:dir . '/ant-test-files/ant-project'))
\ . ale#Escape('ant')
\ . g:command_tail,
\ ale#ant#BuildClasspathCommand(bufnr(''))

View file

@ -0,0 +1,35 @@
Before:
call ale#test#SetDirectory('/testplugin/test')
runtime ale_linters/java/javac.vim
After:
call ale#test#RestoreDirectory()
call ale#linter#Reset()
Execute(Should return current directory if called on the project root):
call ale#test#SetFilename('ant-test-files/ant-project/Main.java')
AssertEqual
\ ale#path#Simplify(g:dir . '/ant-test-files/ant-project'),
\ ale#ant#FindProjectRoot(bufnr(''))
Execute(Should return root directory if called on a deeply nested source file):
call ale#test#SetFilename('ant-test-files/ant-project/src/several/namespace/layers/A.java')
AssertEqual
\ ale#path#Simplify(g:dir . '/ant-test-files/ant-project'),
\ ale#ant#FindProjectRoot(bufnr(''))
Execute(Should return empty string if called on a non-ant project):
call ale#test#SetFilename('ant-test-files/non-ant-project/Main.java')
AssertEqual
\ '',
\ ale#ant#FindProjectRoot(bufnr(''))
Execute(Should return empty string if called on a file in a non-ant project):
call ale#test#SetFilename('ant-test-files/non-ant-project/several/namespace/layers/A.java')
AssertEqual
\ '',
\ ale#ant#FindProjectRoot(bufnr(''))