diff --git a/lua/lazyvim/plugins/extras/lang/java.lua b/lua/lazyvim/plugins/extras/lang/java.lua index 31f9f7c2..64808bee 100644 --- a/lua/lazyvim/plugins/extras/lang/java.lua +++ b/lua/lazyvim/plugins/extras/lang/java.lua @@ -64,6 +64,49 @@ return { "mfussenegger/nvim-jdtls", dependencies = { "folke/which-key.nvim" }, ft = java_filetypes, + opts = function() + return { + -- How to find the root dir for a given filename. The default comes from + -- lspconfig which provides a function specifically for java projects. + root_dir = require("lspconfig.server_configurations.jdtls").default_config.root_dir, + + -- How to find the project name for a given root dir. + project_name = function(root_dir) + return root_dir and vim.fs.basename(root_dir) + end, + + -- Where are the config and workspace dirs for a project? + jdtls_config_dir = function(project_name) + return vim.fn.stdpath("cache") .. "/jdtls/" .. project_name .. "/config" + end, + jdtls_workspace_dir = function(project_name) + return vim.fn.stdpath("cache") .. "/jdtls/" .. project_name .. "/workspace" + end, + + -- How to run jdtls. This can be overridden to a full java command-line + -- if the Python wrapper script doesn't suffice. + cmd = { "jdtls" }, + full_cmd = function(opts) + local fname = vim.api.nvim_buf_get_name(0) + local root_dir = opts.root_dir(fname) + local project_name = opts.project_name(root_dir) + local cmd = vim.deepcopy(opts.cmd) + if project_name then + vim.list_extend(cmd, { + "-configuration", + opts.jdtls_config_dir(project_name), + "-data", + opts.jdtls_workspace_dir(project_name), + }) + end + return cmd + end, + + -- These depend on nvim-dap, but can additionally be disabled by setting false here. + dap = { hotcodereplace = "auto", config_overrides = {} }, + test = true, + } + end, config = function() local opts = Util.opts("nvim-jdtls") or {} @@ -71,14 +114,14 @@ return { -- if nvim-dap is enabled with java debug/test. local mason_registry = require("mason-registry") local bundles = {} ---@type string[] - if opts.dap ~= false and Util.has("nvim-dap") and mason_registry.is_installed("java-debug-adapter") then + if opts.dap and Util.has("nvim-dap") and mason_registry.is_installed("java-debug-adapter") then local java_dbg_pkg = mason_registry.get_package("java-debug-adapter") local java_dbg_path = java_dbg_pkg:get_install_path() local jar_patterns = { java_dbg_path .. "/extension/server/com.microsoft.java.debug.plugin-*.jar", } -- java-test also depends on java-debug-adapter. - if opts.test ~= false and mason_registry.is_installed("java-test") then + if opts.test and mason_registry.is_installed("java-test") then local java_test_pkg = mason_registry.get_package("java-test") local java_test_path = java_test_pkg:get_install_path() vim.list_extend(jar_patterns, { @@ -93,38 +136,21 @@ return { end local function attach_jdtls() - -- The configuration for jdtls contains a useful function to find the java - -- project root. This can be overridden by opts.root_dir - local find_java_project_root = opts.root_dir - or require("lspconfig.server_configurations.jdtls").default_config.root_dir local fname = vim.api.nvim_buf_get_name(0) - local root_dir = find_java_project_root(fname) - local project_name = root_dir and vim.fs.basename(root_dir) - local cmd = { "jdtls" } - if project_name then - local jdtls_cache_dir = vim.fn.stdpath("cache") .. "/jdtls/" .. project_name - vim.list_extend(cmd, { - "-configuration", - jdtls_cache_dir .. "/config", - "-data", - jdtls_cache_dir .. "/workspace", - }) - end - - -- Base configuration can be augmented and overridden by opts.jdtls - local base_config = { - cmd = cmd, - root_dir = root_dir, + -- Configuration can be augmented and overridden by opts.jdtls + local config = extend_or_override({ + cmd = opts.full_cmd(opts), + root_dir = opts.root_dir(fname), init_options = { bundles = bundles, }, -- enable CMP capabilities capabilities = require("cmp_nvim_lsp").default_capabilities(), - } + }, opts.jdtls) -- Existing server will be reused if the root_dir matches. - require("jdtls").start_or_attach(extend_or_override(base_config, opts.jdtls)) + require("jdtls").start_or_attach(config) -- not need to require("jdtls.setup").add_commands(), start automatically adds commands end @@ -169,15 +195,13 @@ return { }, }, { mode = "v", buffer = args.buf }) - if opts.dap ~= false and Util.has("nvim-dap") and mason_registry.is_installed("java-debug-adapter") then + if opts.dap and Util.has("nvim-dap") and mason_registry.is_installed("java-debug-adapter") then -- custom init for Java debugger - require("jdtls").setup_dap( - extend_or_override({ hotcodereplace = "auto", config_overrides = {} }, opts.dap) - ) + require("jdtls").setup_dap(opts.dap) require("jdtls.dap").setup_dap_main_class_configs() -- Java Test require Java debugger to work - if opts.test ~= false and mason_registry.is_installed("java-test") then + if opts.test and mason_registry.is_installed("java-test") then -- custom keymaps for Java test runner (not yet compatible with neotest) wk.register({ ["t"] = { name = "+test" },