diff --git a/CHANGELOG.md b/CHANGELOG.md index 53dcdcb..b613a14 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [1.9.0](https://github.com/nvim-java/nvim-java-core/compare/v1.8.0...v1.9.0) (2024-12-25) + + +### Features + +* add helper functions ([1ce1143](https://github.com/nvim-java/nvim-java-core/commit/1ce1143c595c5f6357bede19e9bf4000bf7f980c)) +* add refactoring APIs ([5def9bd](https://github.com/nvim-java/nvim-java-core/commit/5def9bd1a0ddd624fbc2c2028fd7a493e4d75021)) + ## [1.8.0](https://github.com/nvim-java/nvim-java-core/compare/v1.7.0...v1.8.0) (2024-07-15) diff --git a/lua/java-core/api/test.lua b/lua/java-core/api/test.lua index 9386fca..5cc95c4 100644 --- a/lua/java-core/api/test.lua +++ b/lua/java-core/api/test.lua @@ -53,6 +53,12 @@ end ---@param config? java-dap.DapLauncherConfigOverridable config to override the default values in test launcher config function M:run_class_by_buffer(buffer, report, config) local tests = self:get_test_class_by_buffer(buffer) + + if #tests < 1 then + vim.notify('No tests found in the current buffer') + return + end + self:run_test(tests, report, config) end diff --git a/lua/java-core/ls/clients/java-debug-client.lua b/lua/java-core/ls/clients/java-debug-client.lua index ab10dde..8ca02d8 100644 --- a/lua/java-core/ls/clients/java-debug-client.lua +++ b/lua/java-core/ls/clients/java-debug-client.lua @@ -5,17 +5,13 @@ local JdtlsClient = require('java-core.ls.clients.jdtls-client') ---@class java-core.DebugClient: java-core.JdtlsClient local DebugClient = class(JdtlsClient) -function DebugClient:_init(client) - self:super(client) -end - ----@class JavaDebugResolveMainClassRecord +---@class java-dap.JavaDebugResolveMainClassRecord ---@field mainClass string ---@field projectName string ---@field fileName string ---Returns a list of main classes in the current workspace ----@return JavaDebugResolveMainClassRecord[] # resolved main class +---@return java-dap.JavaDebugResolveMainClassRecord[] # resolved main class function DebugClient:resolve_main_class() return self:workspace_execute_command('vscode.java.resolveMainClass') end diff --git a/lua/java-core/ls/clients/java-test-client.lua b/lua/java-core/ls/clients/java-test-client.lua index 870cde9..7c2dcb0 100644 --- a/lua/java-core/ls/clients/java-test-client.lua +++ b/lua/java-core/ls/clients/java-test-client.lua @@ -14,26 +14,18 @@ local JdtlsClient = require('java-core.ls.clients.jdtls-client') ---@field uri string ---@class java-core.TestDetailsWithRange: java-core.TestDetails ----@field range java-core.TestRange +---@field range lsp.Range ---@class java-core.TestDetailsWithChildren: java-core.TestDetails ---@field children java-core.TestDetailsWithRange[] ---@class java-core.TestDetailsWithChildrenAndRange: java-core.TestDetails ----@field range java-core.TestRange +---@field range lsp.Range ---@field children java-core.TestDetailsWithRange[] ----@class java-core.TestRange ----@field start nvim.CursorPoint ----@field end nvim.CursorPoint - ---@class java-core.TestClient: java-core.JdtlsClient local TestClient = class(JdtlsClient) -function TestClient:_init(client) - self:super(client) -end - ---Returns a list of project details in the current root ---@return java-core.TestDetails[] # test details of the projects function TestClient:find_java_projects() @@ -89,7 +81,7 @@ function TestClient:resolve_junit_launch_arguments(args) vim.fn.json_encode(args) ) - if not launch_args.body then + if not launch_args or not launch_args.body then local msg = 'Failed to retrive JUnit launch arguments' log.error(msg, launch_args) diff --git a/lua/java-core/ls/clients/jdtls-client.lua b/lua/java-core/ls/clients/jdtls-client.lua index fa604de..61e9643 100644 --- a/lua/java-core/ls/clients/jdtls-client.lua +++ b/lua/java-core/ls/clients/jdtls-client.lua @@ -16,6 +16,9 @@ local await = async.wait_handle_error ---| 'java/generateHashCodeEquals' ---| 'java/checkDelegateMethodsStatus' ---| 'java/generateDelegateMethods' +---| 'java/move' +---| 'java/searchSymbols' +---| 'java/getMoveDestinations' ---@alias jdtls.CodeActionCommand ---| 'extractVariable' @@ -69,6 +72,7 @@ function JdtlsClient:request(method, params, buffer) callback(err, result) end + ---@diagnostic disable-next-line: param-type-mismatch return self.client.request(method, params, on_response, buffer) end) end @@ -95,6 +99,55 @@ function JdtlsClient:workspace_execute_command(command, params, buffer) }, buffer) end +---@class jdtls.ResourceMoveDestination +---@field displayName string +---@field isDefaultPackage boolean +---@field isParentOfSelectedFile boolean +---@field path string +---@field project string +---@field uri string + +---@class jdtls.InstanceMethodMoveDestination +---@field bindingKey string +---@field isField boolean +---@field isSelected boolean +---@field name string +---@field type string + +---@class jdtls.MoveDestinationsResponse +---@field errorMessage? string +---@field destinations jdtls.InstanceMethodMoveDestination[]|jdtls.ResourceMoveDestination[] + +---@param params jdtls.MoveParams +---@return jdtls.MoveDestinationsResponse +function JdtlsClient:get_move_destination(params) + return self:request('java/getMoveDestinations', params) +end + +---@class jdtls.MoveParams +---@field moveKind string +---@field sourceUris string[] +---@field params lsp.CodeActionParams | nil +---@field destination? any +---@field updateReferences? boolean + +---@param params jdtls.MoveParams +---@return jdtls.RefactorWorkspaceEdit +function JdtlsClient:java_move(params) + return self:request('java/move', params) +end + +---@class jdtls.SearchSymbolParams: lsp.WorkspaceSymbolParams +---@field projectName string +---@field maxResults? number +---@field sourceOnly? boolean + +---@param params jdtls.SearchSymbolParams +---@return lsp.SymbolInformation +function JdtlsClient:java_search_symbols(params) + return self:request('java/searchSymbols', params) +end + ---Returns more information about the object the cursor is on ---@param command jdtls.CodeActionCommand ---@param params lsp.CodeActionParams diff --git a/lua/java-core/utils/event.lua b/lua/java-core/utils/event.lua new file mode 100644 index 0000000..0c2cb6f --- /dev/null +++ b/lua/java-core/utils/event.lua @@ -0,0 +1,21 @@ +local M = {} + +---@param opts { once: boolean, group: number, callback: fun(client: vim.lsp.Client) } +function M.on_jdtls_attach(opts) + local id + + id = vim.api.nvim_create_autocmd('LspAttach', { + group = opts.group, + callback = function(args) + local client = vim.lsp.get_client_by_id(args.data.client_id) + + if client and client.name == 'jdtls' then + opts.callback(client) + + vim.api.nvim_del_autocmd(id) + end + end, + }) +end + +return M diff --git a/lua/java-core/utils/instance-factory.lua b/lua/java-core/utils/instance-factory.lua new file mode 100644 index 0000000..1dbb2cf --- /dev/null +++ b/lua/java-core/utils/instance-factory.lua @@ -0,0 +1,32 @@ +local M = {} + +---@return vim.lsp.Client +function M.get_client() + local clients = vim.lsp.get_clients({ name = 'jdtls' }) + + if #clients < 1 then + local message = 'No jdtls client found!' + require('java-core.utils.notify').error(message) + require('java.utils.log').error(message) + error(message) + end + + return clients[1] +end + +function M.get_jdtls() + local JdtlsClient = require('java-core.ls.clients.jdtls-client') + return JdtlsClient(M.get_client()) +end + +function M.get_debug() + local DebugClient = require('java-core.ls.clients.java-debug-client') + return DebugClient(M.get_client()) +end + +function M.get_test() + local TestClient = require('java-core.ls.clients.java-test-client') + return TestClient(M.get_client()) +end + +return M