All patches and comments are welcome. Please squash your changes to logical
commits before using git-format-patch and git-send-email to
patches@git.madduck.net.
If you'd read over the Git project's submission guidelines and adhered to them,
I'd be especially grateful.
1 " Author: Horacio Sanson <https://github.com/hsanson>
2 " Description: Support for the Eclipse language server https://github.com/eclipse/eclipse.jdt.ls
4 let s:version_cache = {}
6 call ale#Set('java_eclipselsp_path', ale#path#Simplify($HOME . '/eclipse.jdt.ls'))
7 call ale#Set('java_eclipselsp_config_path', '')
8 call ale#Set('java_eclipselsp_workspace_path', '')
9 call ale#Set('java_eclipselsp_executable', 'java')
10 call ale#Set('java_eclipselsp_javaagent', '')
12 function! ale_linters#java#eclipselsp#Executable(buffer) abort
13 return ale#Var(a:buffer, 'java_eclipselsp_executable')
16 function! ale_linters#java#eclipselsp#TargetPath(buffer) abort
17 return ale#Var(a:buffer, 'java_eclipselsp_path')
20 function! ale_linters#java#eclipselsp#JarPath(buffer) abort
21 let l:path = ale_linters#java#eclipselsp#TargetPath(a:buffer)
24 let l:platform = 'win32'
26 let l:platform = 'macosx'
28 let l:platform = 'linux'
31 " Search jar file within repository path when manually built using mvn
32 let l:files = globpath(l:path, '**/'.l:platform.'/**/plugins/org.eclipse.equinox.launcher_*\.jar', 1, 1)
38 " Search jar file within VSCode extensions folder.
39 let l:files = globpath(l:path, '**/'.l:platform.'/plugins/org.eclipse.equinox.launcher_*\.jar', 1, 1)
45 " Search jar file within unzipped tar.gz file
46 let l:files = globpath(l:path, 'plugins/org.eclipse.equinox.launcher_*\.jar', 1, 1)
52 " Search jar file within system package path
53 let l:files = globpath('/usr/share/java/jdtls/plugins', 'org.eclipse.equinox.launcher_*\.jar', 1, 1)
62 function! ale_linters#java#eclipselsp#ConfigurationPath(buffer) abort
63 let l:path = fnamemodify(ale_linters#java#eclipselsp#JarPath(a:buffer), ':p:h:h')
64 let l:config_path = ale#Var(a:buffer, 'java_eclipselsp_config_path')
66 if !empty(l:config_path)
67 return ale#path#Simplify(l:config_path)
71 let l:path = l:path . '/config_win'
73 let l:path = l:path . '/config_mac'
75 let l:path = l:path . '/config_linux'
78 return ale#path#Simplify(l:path)
81 function! ale_linters#java#eclipselsp#VersionCheck(version_lines) abort
82 return s:GetVersion('', a:version_lines)
85 function! s:GetVersion(executable, version_lines) abort
88 for l:line in a:version_lines
89 let l:match = matchlist(l:line, '\(\d\+\)\.\(\d\+\)\.\(\d\+\)')
92 let l:version = [l:match[1] + 0, l:match[2] + 0, l:match[3] + 0]
93 let s:version_cache[a:executable] = l:version
101 function! ale_linters#java#eclipselsp#CommandWithVersion(buffer, version_lines, meta) abort
102 let l:executable = ale_linters#java#eclipselsp#Executable(a:buffer)
103 let l:version = s:GetVersion(l:executable, a:version_lines)
105 return ale_linters#java#eclipselsp#Command(a:buffer, l:version)
108 function! ale_linters#java#eclipselsp#WorkspacePath(buffer) abort
109 let l:wspath = ale#Var(a:buffer, 'java_eclipselsp_workspace_path')
115 return ale#path#Dirname(ale#java#FindProjectRoot(a:buffer))
118 function! ale_linters#java#eclipselsp#Javaagent(buffer) abort
120 let l:raw = ale#Var(a:buffer, 'java_eclipselsp_javaagent')
126 let l:jars = split(l:raw)
129 call add(l:rets, ale#Escape('-javaagent:' . l:jar))
132 return join(l:rets, ' ')
135 function! ale_linters#java#eclipselsp#Command(buffer, version) abort
136 let l:path = ale#Var(a:buffer, 'java_eclipselsp_path')
138 let l:executable = ale_linters#java#eclipselsp#Executable(a:buffer)
140 let l:cmd = [ ale#Escape(l:executable),
141 \ ale_linters#java#eclipselsp#Javaagent(a:buffer),
142 \ '-Declipse.application=org.eclipse.jdt.ls.core.id1',
143 \ '-Dosgi.bundles.defaultStartLevel=4',
144 \ '-Declipse.product=org.eclipse.jdt.ls.core.product',
149 \ ale#Escape(ale_linters#java#eclipselsp#JarPath(a:buffer)),
151 \ ale#Escape(ale_linters#java#eclipselsp#ConfigurationPath(a:buffer)),
153 \ ale#Escape(ale_linters#java#eclipselsp#WorkspacePath(a:buffer))
156 if ale#semver#GTE(a:version, [1, 9])
157 call add(l:cmd, '--add-modules=ALL-SYSTEM')
158 call add(l:cmd, '--add-opens java.base/java.util=ALL-UNNAMED')
159 call add(l:cmd, '--add-opens java.base/java.lang=ALL-UNNAMED')
162 return join(l:cmd, ' ')
165 function! ale_linters#java#eclipselsp#RunWithVersionCheck(buffer) abort
166 let l:executable = ale_linters#java#eclipselsp#Executable(a:buffer)
168 if empty(l:executable)
172 let l:cache = s:version_cache
174 if has_key(s:version_cache, l:executable)
175 return ale_linters#java#eclipselsp#Command(a:buffer, s:version_cache[l:executable])
178 let l:command = ale#Escape(l:executable) . ' -version'
180 return ale#command#Run(
183 \ function('ale_linters#java#eclipselsp#CommandWithVersion'),
184 \ { 'output_stream': 'both' }
188 call ale#linter#Define('java', {
189 \ 'name': 'eclipselsp',
191 \ 'executable': function('ale_linters#java#eclipselsp#Executable'),
192 \ 'command': function('ale_linters#java#eclipselsp#RunWithVersionCheck'),
193 \ 'language': 'java',
194 \ 'project_root': function('ale#java#FindProjectRoot'),
195 \ 'initialization_options': {
196 \ 'extendedClientCapabilities': {
197 \ 'classFileContentsSupport': v:true