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 = {}, +}  |