mirror of
https://github.com/neovim/nvim-lspconfig.git
synced 2025-12-25 07:21:00 +01:00
settings.gradle is marker for multi-module Gradle projects. See: https://docs.gradle.org/current/userguide/multi_project_builds.html Closes: #4137 Signed-off-by: Tomas Slusny <slusnucky@gmail.com>
103 lines
3.3 KiB
Lua
103 lines
3.3 KiB
Lua
---@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', -- Maven
|
|
'gradlew', -- Gradle
|
|
'settings.gradle', -- Gradle
|
|
'settings.gradle.kts', -- Gradle
|
|
-- 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
|
|
'build.gradle', -- Gradle
|
|
'build.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 = {},
|
|
}
|