aboutsummaryrefslogtreecommitdiff
path: root/.config/nvim/lsp/jdtls.lua
diff options
context:
space:
mode:
authorawy <awy@awy.one>2025-10-20 20:55:26 +0300
committerawy <awy@awy.one>2025-10-20 20:55:26 +0300
commit662dafc52b2c8a9426bb2197ab9246a8cda318e4 (patch)
treef9d1f20e3864360bf941fd6bc02848ed77b037a8 /.config/nvim/lsp/jdtls.lua
parent8131d9f2898b991a2d2c7a2ac601ce9e07cc9c9f (diff)
downloadhyprdots-662dafc52b2c8a9426bb2197ab9246a8cda318e4.tar.gz
nvqw
Diffstat (limited to '.config/nvim/lsp/jdtls.lua')
-rw-r--r--.config/nvim/lsp/jdtls.lua102
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 = {},
+}