From 21929ee44df28b37b557579c920d090472367319 Mon Sep 17 00:00:00 2001 From: "asep.komarudin" Date: Fri, 28 Jun 2024 13:14:19 +0700 Subject: [PATCH] add: config nvim-jdtls --- lazy-lock.json | 1 + lua/custom/default.lua | 3 +- lua/plugins/java.lua | 218 +++++++++++++++++++++++++++++++++++------ 3 files changed, 193 insertions(+), 29 deletions(-) diff --git a/lazy-lock.json b/lazy-lock.json index 5ee0b4f..8d82e6a 100644 --- a/lazy-lock.json +++ b/lazy-lock.json @@ -37,6 +37,7 @@ "nvim-dap": { "branch": "master", "commit": "5ba8ceace596360321cf33fa4b56d9d46e057ce9" }, "nvim-dap-ui": { "branch": "master", "commit": "f7d75cca202b52a60c520ec7b1ec3414d6e77b0f" }, "nvim-dap-virtual-text": { "branch": "master", "commit": "d7c695ea39542f6da94ee4d66176f5d660ab0a77" }, + "nvim-jdtls": { "branch": "master", "commit": "a5c6f38f8151d7b4f5b32c005a95022fa66f4c9d" }, "nvim-lint": { "branch": "master", "commit": "efc6fc83f0772283e064c53a8f9fb5645bde0bc0" }, "nvim-lspconfig": { "branch": "master", "commit": "0b8165cf95806bc4bb8f745bb0c92021b2ed4b98" }, "nvim-material-icon": { "branch": "main", "commit": "5ad42234d880659dfe9d4ff936c310cd6c5a1610" }, diff --git a/lua/custom/default.lua b/lua/custom/default.lua index 4ea9586..72c1a94 100644 --- a/lua/custom/default.lua +++ b/lua/custom/default.lua @@ -70,7 +70,7 @@ pcode.mason_ensure_installed = { -- sebelumnya register_lsp -- tambahkan di bawah sini setelah melakukan :masoninstall } pcode.unregister_lsp = { - "jdtls", -- tambahkan di bawah ini + -- "jdtls", -- tambahkan di bawah ini } -- https://github.com/jose-elias-alvarez/null-ls.nvim/blob/main/doc/BUILTINS.md @@ -174,4 +174,5 @@ pcode.active_cpp_config = false pcode.active_java_config = { active = true, project = "gradle", -- gradle or maven + -- use_nvim_jdtls = false, -- mfussenegger/nvim-jdtls } diff --git a/lua/plugins/java.lua b/lua/plugins/java.lua index f1c1fa8..fde5f9f 100644 --- a/lua/plugins/java.lua +++ b/lua/plugins/java.lua @@ -1,8 +1,179 @@ local M = {} +local java_filetypes = { "java" } +local root_markers = { ".git", "mvnw", "gradlew", "pom.xml", "build.gradle" } + +-- Utility function to extend or override a config table, similar to the way +-- that Plugin.opts works. +---@param config table +---@param custom function | table | nil +local function extend_or_override(config, custom, ...) + if type(custom) == "function" then + config = custom(config, ...) or config + elseif custom then + config = vim.tbl_deep_extend("force", config, custom) --[[@as table]] + end + return config +end + if pcode.active_java_config.active then M = { -- { -- "mfussenegger/nvim-jdtls", + -- ft = java_filetypes, + -- enable = pcode.active_java_config.use_nvim_jdtls or false, + -- opts = function() + -- return { + -- root_dir = require("jdtls.setup").find_root(root_markers), + -- project_name = function() + -- return vim.fn.fnamemodify(vim.fn.getcwd(), ":p:h:t") + -- 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, + -- cmd = { vim.fn.exepath("jdtls") }, + -- full_cmd = function(opts) + -- local project_name = vim.fn.fnamemodify(vim.fn.getcwd(), ":p:h:t") + -- 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 = {} }, + -- dap_main = {}, + -- test = true, + -- settings = { + -- java = { + -- inlayHints = { + -- parameterNames = { + -- enabled = "all", + -- }, + -- }, + -- }, + -- }, + -- } + -- end, + -- config = function(_, opts) + -- local mason_registry = require("mason-registry") + -- local bundles = {} ---@type string[] + -- if opts.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 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, { + -- java_test_path .. "/extension/server/*.jar", + -- }) + -- end + -- for _, jar_pattern in ipairs(jar_patterns) do + -- for _, bundle in ipairs(vim.split(vim.fn.glob(jar_pattern), "\n")) do + -- table.insert(bundles, bundle) + -- end + -- end + -- end + -- + -- local function attach_jdtls() + -- local fname = vim.api.nvim_buf_get_name(0) + -- + -- -- Configuration can be augmented and overridden by opts.jdtls + -- local config = extend_or_override({ + -- cmd = opts.full_cmd(opts), + -- root_dir = require("jdtls.setup").find_root(root_markers), + -- init_options = { + -- bundles = bundles, + -- }, + -- settings = opts.settings, + -- -- enable CMP capabilities + -- capabilities = require("user.lsp.handlers").capabilities or nil, + -- }, opts.jdtls) + -- + -- -- Existing server will be reused if the root_dir matches. + -- require("jdtls").start_or_attach(config) + -- -- not need to require("jdtls.setup").add_commands(), start automatically adds commands + -- end + -- + -- vim.api.nvim_create_autocmd("FileType", { + -- pattern = java_filetypes, + -- callback = attach_jdtls, + -- }) + -- + -- -- Setup keymap and dap after the lsp is fully attached. + -- -- https://github.com/mfussenegger/nvim-jdtls#nvim-dap-configuration + -- -- https://neovim.io/doc/user/lsp.html#LspAttach + -- vim.api.nvim_create_autocmd("LspAttach", { + -- callback = function(args) + -- local client = vim.lsp.get_client_by_id(args.data.client_id) + -- if client and client.name == "jdtls" then + -- local wk = require("which-key") + -- wk.register({ + -- ["cx"] = { name = "+extract" }, + -- ["cxv"] = { require("jdtls").extract_variable_all, "Extract Variable" }, + -- ["cxc"] = { require("jdtls").extract_constant, "Extract Constant" }, + -- ["gs"] = { require("jdtls").super_implementation, "Goto Super" }, + -- ["co"] = { require("jdtls").organize_imports, "Organize Imports" }, + -- }, { mode = "n", buffer = args.buf }) + -- wk.register({ + -- ["c"] = { name = "+code" }, + -- ["cx"] = { name = "+extract" }, + -- ["cxm"] = { + -- [[lua require('jdtls').extract_method(true)]], + -- "Extract Method", + -- }, + -- ["cxv"] = { + -- [[lua require('jdtls').extract_variable_all(true)]], + -- "Extract Variable", + -- }, + -- ["cxc"] = { + -- [[lua require('jdtls').extract_constant(true)]], + -- "Extract Constant", + -- }, + -- }, { mode = "v", buffer = args.buf }) + -- + -- if opts.dap and mason_registry.is_installed("java-debug-adapter") then + -- -- custom init for Java debugger + -- require("jdtls").setup_dap(opts.dap) + -- require("jdtls.dap").setup_dap_main_class_configs(opts.dap_main) + -- + -- -- Java Test require Java debugger to work + -- 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" }, + -- ["tt"] = { require("jdtls.dap").test_class, "Run All Test" }, + -- ["tr"] = { require("jdtls.dap").test_nearest_method, "Run Nearest Test" }, + -- ["tT"] = { require("jdtls.dap").pick_test, "Run Test" }, + -- }, { mode = "n", buffer = args.buf }) + -- end + -- end + -- + -- -- User can set additional keymaps in opts.on_attach + -- if opts.on_attach then + -- opts.on_attach(args) + -- end + -- end + -- end, + -- }) + -- + -- -- Avoid race condition by calling attach the first time, since the autocmd won't fire. + -- attach_jdtls() + -- end, -- }, { "nvim-treesitter/nvim-treesitter", @@ -22,7 +193,7 @@ if pcode.active_java_config.active then "stevearc/conform.nvim", event = "VeryLazy", opts = function(_, opts) - local package="google-java-format" + local package = "google-java-format" require("user.utils.mason").try_install(package) opts.formatters_by_ft.java = { package } end, @@ -69,33 +240,24 @@ if pcode.active_java_config.active then { "TS", function() require("neotest").run.stop() end, desc = "Stop" }, }, }, - -- { - -- "stevearc/conform.nvim", - -- event = { "BufReadPre", "BufNewFile" }, - -- opts = function(_, opts) - -- local psave = pcode.format_on_save or 0 - -- opts.formatters_by_ft = opts.formatters_by_ft or {} - -- opts.formatters_by_ft.java = { "lsp_fmt" } - -- if psave == 1 then - -- opts.format_on_save = { - -- timeout_ms = pcode.format_timeout_ms or 500, - -- lsp_fallback = true, - -- } - -- end - -- return opts - -- end, - -- config = function(_, opts) - -- local conform = require("conform") - -- conform.setup(opts) - -- vim.keymap.set({ "n", "v" }, "lF", function() - -- conform.format({ - -- lsp_fallback = true, - -- async = false, - -- timeout_ms = pcode.format_timeout_ms or 500, - -- }) - -- end, { desc = "Format file or range (in visual mode)" }) - -- end, - -- }, } end + +-- if pcode.active_java_config.use_nvim_jdtls then +-- table.insert(M, { +-- "neovim/nvim-lspconfig", +-- enabled = pcode.active_java_config.use_nvim_jdtls or false, +-- opts = { +-- -- make sure mason installs the server +-- servers = { +-- jdtls = {}, +-- }, +-- setup = { +-- jdtls = function() +-- return true -- avoid duplicate servers +-- end, +-- }, +-- }, +-- }) +-- end return M