summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ale_linters/java/javac.vim8
-rw-r--r--autoload/ale/maven.vim51
-rwxr-xr-xtest/maven-test-files/maven-java-project/module1/mvnw0
-rwxr-xr-xtest/maven-test-files/maven-java-project/module1/mvnw.cmd0
-rw-r--r--test/maven-test-files/maven-java-project/module1/pom.xml1
-rw-r--r--test/maven-test-files/maven-java-project/module1/src/main/java/dummy1.java0
-rw-r--r--test/maven-test-files/maven-java-project/module2/pom.xml1
-rw-r--r--test/maven-test-files/maven-java-project/module2/src/main/java/dummy2.java0
-rwxr-xr-xtest/maven-test-files/mvn0
-rw-r--r--test/maven-test-files/non-maven-project/src/main/java/dummy.java0
-rw-r--r--test/test_maven_build_classpath_command.vader48
-rw-r--r--test/test_maven_find_executable.vader46
-rw-r--r--test/test_maven_find_project_root.vader28
13 files changed, 176 insertions, 7 deletions
diff --git a/ale_linters/java/javac.vim b/ale_linters/java/javac.vim
index f866eb09..a5e57e6c 100644
--- a/ale_linters/java/javac.vim
+++ b/ale_linters/java/javac.vim
@@ -9,13 +9,7 @@ call ale#Set('java_javac_classpath', '')
call ale#Set('java_javac_sourcepath', '')
function! ale_linters#java#javac#RunWithImportPaths(buffer) abort
- let l:command = ''
- let l:pom_path = ale#path#FindNearestFile(a:buffer, 'pom.xml')
-
- if !empty(l:pom_path) && executable('mvn')
- let l:command = ale#path#CdString(fnamemodify(l:pom_path, ':h'))
- \ . 'mvn dependency:build-classpath'
- endif
+ let l:command = ale#maven#BuildClasspathCommand(a:buffer)
" Try to use Gradle if Maven isn't available.
if empty(l:command)
diff --git a/autoload/ale/maven.vim b/autoload/ale/maven.vim
new file mode 100644
index 00000000..745f8c93
--- /dev/null
+++ b/autoload/ale/maven.vim
@@ -0,0 +1,51 @@
+" Description: Functions for working with Maven projects.
+"
+" Given a buffer number, find a Maven project root.
+function! ale#maven#FindProjectRoot(buffer) abort
+ let l:wrapper_path = ale#path#FindNearestFile(a:buffer, 'mvnw')
+
+ if !empty(l:wrapper_path)
+ return fnamemodify(l:wrapper_path, ':h')
+ endif
+
+ let l:pom_path = ale#path#FindNearestFile(a:buffer, 'pom.xml')
+
+ if !empty(l:pom_path)
+ return fnamemodify(l:pom_path, ':h')
+ endif
+
+ return ''
+endfunction
+
+
+" Given a buffer number, find the path to the executable.
+" First search on the path for 'mvnw' (mvnw.cmd on Windows), if nothing is found,
+" try the global command. Returns an empty string if cannot find the executable.
+function! ale#maven#FindExecutable(buffer) abort
+ let l:wrapper_cmd = has('unix') ? 'mvnw' : 'mvnw.cmd'
+ let l:wrapper_path = ale#path#FindNearestFile(a:buffer, l:wrapper_cmd)
+
+ if executable(l:wrapper_path)
+ return l:wrapper_path
+ endif
+
+ if executable('mvn')
+ return 'mvn'
+ 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#maven#BuildClasspathCommand(buffer) abort
+ let l:executable = ale#maven#FindExecutable(a:buffer)
+ let l:project_root = ale#maven#FindProjectRoot(a:buffer)
+
+ if !empty(l:executable) && !empty(l:project_root)
+ return ale#path#CdString(l:project_root)
+ \ . l:executable . ' dependency:build-classpath'
+ endif
+
+ return ''
+endfunction
diff --git a/test/maven-test-files/maven-java-project/module1/mvnw b/test/maven-test-files/maven-java-project/module1/mvnw
new file mode 100755
index 00000000..e69de29b
--- /dev/null
+++ b/test/maven-test-files/maven-java-project/module1/mvnw
diff --git a/test/maven-test-files/maven-java-project/module1/mvnw.cmd b/test/maven-test-files/maven-java-project/module1/mvnw.cmd
new file mode 100755
index 00000000..e69de29b
--- /dev/null
+++ b/test/maven-test-files/maven-java-project/module1/mvnw.cmd
diff --git a/test/maven-test-files/maven-java-project/module1/pom.xml b/test/maven-test-files/maven-java-project/module1/pom.xml
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/test/maven-test-files/maven-java-project/module1/pom.xml
@@ -0,0 +1 @@
+
diff --git a/test/maven-test-files/maven-java-project/module1/src/main/java/dummy1.java b/test/maven-test-files/maven-java-project/module1/src/main/java/dummy1.java
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/maven-test-files/maven-java-project/module1/src/main/java/dummy1.java
diff --git a/test/maven-test-files/maven-java-project/module2/pom.xml b/test/maven-test-files/maven-java-project/module2/pom.xml
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/test/maven-test-files/maven-java-project/module2/pom.xml
@@ -0,0 +1 @@
+
diff --git a/test/maven-test-files/maven-java-project/module2/src/main/java/dummy2.java b/test/maven-test-files/maven-java-project/module2/src/main/java/dummy2.java
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/maven-test-files/maven-java-project/module2/src/main/java/dummy2.java
diff --git a/test/maven-test-files/mvn b/test/maven-test-files/mvn
new file mode 100755
index 00000000..e69de29b
--- /dev/null
+++ b/test/maven-test-files/mvn
diff --git a/test/maven-test-files/non-maven-project/src/main/java/dummy.java b/test/maven-test-files/non-maven-project/src/main/java/dummy.java
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/maven-test-files/non-maven-project/src/main/java/dummy.java
diff --git a/test/test_maven_build_classpath_command.vader b/test/test_maven_build_classpath_command.vader
new file mode 100644
index 00000000..2d8b38a5
--- /dev/null
+++ b/test/test_maven_build_classpath_command.vader
@@ -0,0 +1,48 @@
+Before:
+ Save $PATH
+ Save $PATHEXT
+
+ let $PATHEXT = '.'
+
+ call ale#test#SetDirectory('/testplugin/test')
+ runtime ale_linters/java/javac.vim
+ let g:expected_wrapper = ''
+ if has('unix')
+ let g:expected_wrapper = 'mvnw'
+ else
+ let g:expected_wrapper = 'mvnw.cmd'
+ endif
+
+After:
+ Restore
+
+ unlet! g:expected_wrapper
+
+ call ale#test#RestoreDirectory()
+ call ale#linter#Reset()
+
+Execute(Should use 'mvnw' in classpath command if available):
+ call ale#test#SetFilename('maven-test-files/maven-java-project/module1/src/main/java/dummy1.java')
+
+ AssertEqual
+ \ ale#path#CdString(ale#path#Simplify(g:dir . '/maven-test-files/maven-java-project/module1'))
+ \ . ale#path#Simplify(g:dir . '/maven-test-files/maven-java-project/module1/' . g:expected_wrapper)
+ \ . ' dependency:build-classpath',
+ \ ale#maven#BuildClasspathCommand(bufnr(''))
+
+Execute(Should use 'mvn' in classpath command if it is executable and 'mvnw' is unavailable):
+ call ale#test#SetFilename('maven-test-files/maven-java-project/module2/src/main/java/dummy2.java')
+ let $PATH .= (has('win32') ? ';' : ':')
+ \ . ale#path#Simplify(g:dir . '/maven-test-files')
+
+ AssertEqual
+ \ ale#path#CdString(ale#path#Simplify(g:dir . '/maven-test-files/maven-java-project/module2'))
+ \ . 'mvn dependency:build-classpath',
+ \ ale#maven#BuildClasspathCommand(bufnr(''))
+
+Execute(Should return empty string if maven cannot be executed):
+ call ale#test#SetFilename('maven-test-files/non-maven-project/src/main/java/dummy.java')
+
+ AssertEqual
+ \ '',
+ \ ale#maven#BuildClasspathCommand(bufnr(''))
diff --git a/test/test_maven_find_executable.vader b/test/test_maven_find_executable.vader
new file mode 100644
index 00000000..1d2f6da2
--- /dev/null
+++ b/test/test_maven_find_executable.vader
@@ -0,0 +1,46 @@
+Before:
+ Save $PATH
+ Save $PATHEXT
+
+ " Count the maven executable without .exe as executable on Windows
+ let $PATHEXT = '.'
+
+ call ale#test#SetDirectory('/testplugin/test')
+ runtime ale_linters/java/javac.vim
+ let g:expected_wrapper = ''
+ if has('unix')
+ let g:expected_wrapper = 'mvnw'
+ else
+ let g:expected_wrapper = 'mvnw.cmd'
+ endif
+
+After:
+ Restore
+
+ unlet! g:expected_wrapper
+
+ call ale#test#RestoreDirectory()
+ call ale#linter#Reset()
+
+Execute(Should return 'mvnw' if found in parent directory):
+ call ale#test#SetFilename('maven-test-files/maven-java-project/module1/src/main/java/dummy1.java')
+
+ AssertEqual
+ \ ale#path#Simplify(g:dir . '/maven-test-files/maven-java-project/module1/' . g:expected_wrapper),
+ \ ale#maven#FindExecutable(bufnr(''))
+
+Execute(Should return 'mvn' if 'mvnw' not found in parent directory):
+ call ale#test#SetFilename('maven-test-files/maven-java-project/module2/src/main/java/dummy2.java')
+ let $PATH .= (has('win32') ? ';' : ':')
+ \ . ale#path#Simplify(g:dir . '/maven-test-files')
+
+ AssertEqual
+ \ 'mvn',
+ \ ale#maven#FindExecutable(bufnr(''))
+
+Execute(Should return empty string if 'mvnw' not in parent directory and mvn not in path):
+ call ale#test#SetFilename('mvn-test-files/java-maven-project/module2/src/main/java/dummy2.java')
+
+ AssertEqual
+ \ '',
+ \ ale#gradle#FindExecutable(bufnr(''))
diff --git a/test/test_maven_find_project_root.vader b/test/test_maven_find_project_root.vader
new file mode 100644
index 00000000..3a2138d1
--- /dev/null
+++ b/test/test_maven_find_project_root.vader
@@ -0,0 +1,28 @@
+Before:
+ call ale#test#SetDirectory('/testplugin/test')
+ runtime ale_linters/kotlin/javac.vim
+
+After:
+ call ale#test#RestoreDirectory()
+ call ale#linter#Reset()
+
+Execute(Should return directory for 'mvnw' if found in parent directory):
+ call ale#test#SetFilename('maven-test-files/maven-java-project/module1/src/main/java/dummy1.java')
+
+ AssertEqual
+ \ ale#path#Simplify(g:dir . '/maven-test-files/maven-java-project/module1'),
+ \ ale#maven#FindProjectRoot(bufnr(''))
+
+Execute(Should return directory for 'pom.xml' if found in parent directory):
+ call ale#test#SetFilename('maven-test-files/maven-java-project/module2/src/main/java/dummy2.java')
+
+ AssertEqual
+ \ ale#path#Simplify(g:dir . '/maven-test-files/maven-java-project/module2'),
+ \ ale#maven#FindProjectRoot(bufnr(''))
+
+Execute(Should return empty string if maven files are not found in parent directory):
+ call ale#test#SetFilename('maven-test-files/non-maven-project/src/main/java/dummy.java')
+
+ AssertEqual
+ \ '',
+ \ ale#maven#FindProjectRoot(bufnr(''))