diff options
Diffstat (limited to '.config/nvim/lsp/jdtls.lua')
-rw-r--r-- | .config/nvim/lsp/jdtls.lua | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/.config/nvim/lsp/jdtls.lua b/.config/nvim/lsp/jdtls.lua new file mode 100644 index 0000000..4026047 --- /dev/null +++ b/.config/nvim/lsp/jdtls.lua @@ -0,0 +1,102 @@ +---@brief +--- +--- https://projects.eclipse.org/projects/eclipse.jdt.ls +--- +--- Language server for Java. +--- +--- IMPORTANT: If you want all the features jdtls has to offer, [nvim-jdtls](https://github.com/mfussenegger/nvim-jdtls) +--- is highly recommended. If all you need is diagnostics, completion, imports, gotos and formatting and some code actions +--- you can keep reading here. +--- +--- For manual installation you can download precompiled binaries from the +--- [official downloads site](http://download.eclipse.org/jdtls/snapshots/?d) +--- and ensure that the `PATH` variable contains the `bin` directory of the extracted archive. +--- +--- ```lua +--- -- init.lua +--- vim.lsp.enable('jdtls') +--- ``` +--- +--- You can also pass extra custom jvm arguments with the JDTLS_JVM_ARGS environment variable as a space separated list of arguments, +--- that will be converted to multiple --jvm-arg=<param> args when passed to the jdtls script. This will allow for example tweaking +--- the jvm arguments or integration with external tools like lombok: +--- +--- ```sh +--- export JDTLS_JVM_ARGS="-javaagent:$HOME/.local/share/java/lombok.jar" +--- ``` +--- +--- For automatic installation you can use the following unofficial installers/launchers under your own risk: +--- - [jdtls-launcher](https://github.com/eruizc-dev/jdtls-launcher) (Includes lombok support by default) +--- ```lua +--- -- init.lua +--- vim.lsp.config('jdtls', { cmd = { 'jdtls' } }) +--- ``` + +local function get_jdtls_cache_dir() + return vim.fn.stdpath('cache') .. '/jdtls' +end + +local function get_jdtls_workspace_dir() + return get_jdtls_cache_dir() .. '/workspace' +end + +local function get_jdtls_jvm_args() + local env = os.getenv('JDTLS_JVM_ARGS') + local args = {} + for a in string.gmatch((env or ''), '%S+') do + local arg = string.format('--jvm-arg=%s', a) + table.insert(args, arg) + end + return unpack(args) +end + +local root_markers1 = { + -- Multi-module projects + 'mvnw', + 'gradlew', + 'build.gradle', + 'build.gradle.kts', + -- Use git directory as last resort for multi-module maven projects + -- In multi-module maven projects it is not really possible to determine what is the parent directory + -- and what is submodule directory. And jdtls does not break if the parent directory is at higher level than + -- actual parent pom.xml so propagating all the way to root git directory is fine + '.git', +} +local root_markers2 = { + -- Single-module projects + 'build.xml', -- Ant + 'pom.xml', -- Maven + 'settings.gradle', -- Gradle + 'settings.gradle.kts', -- Gradle +} + +---@type vim.lsp.Config +return { + ---@param dispatchers? vim.lsp.rpc.Dispatchers + ---@param config vim.lsp.ClientConfig + cmd = function(dispatchers, config) + local workspace_dir = get_jdtls_workspace_dir() + local data_dir = workspace_dir + + if config.root_dir then + data_dir = data_dir .. '/' .. vim.fn.fnamemodify(config.root_dir, ':p:h:t') + end + + local config_cmd = { + 'jdtls', + '-data', + data_dir, + get_jdtls_jvm_args(), + } + + return vim.lsp.rpc.start(config_cmd, dispatchers, { + cwd = config.cmd_cwd, + env = config.cmd_env, + detached = config.detached, + }) + end, + filetypes = { 'java' }, + root_markers = vim.fn.has('nvim-0.11.3') == 1 and { root_markers1, root_markers2 } + or vim.list_extend(root_markers1, root_markers2), + init_options = {}, +} |