diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 96bd2bf..34df049 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -4,6 +4,9 @@ on: push: branches: - main + paths: + - README.md + - .github/workflows/panvimdoc.yml permissions: pull-requests: write @@ -24,7 +27,7 @@ jobs: demojify: true - name: create pull request - uses: peter-evans/create-pull-request@v5 + uses: peter-evans/create-pull-request@v6 with: base: "main" commit-message: "chore(doc): automatic vimdoc update" diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 11e3060..b29c1e1 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -2,6 +2,8 @@ name: Lint on: push: + branches: + - "main" pull_request: jobs: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ca11efb..5ee0126 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,6 +13,6 @@ jobs: name: release runs-on: ubuntu-latest steps: - - uses: google-github-actions/release-please-action@v4 + - uses: googleapis/release-please-action@v4 with: release-type: simple diff --git a/.github/workflows/stylua.yml b/.github/workflows/stylua.yml index a7b609a..79840b2 100644 --- a/.github/workflows/stylua.yml +++ b/.github/workflows/stylua.yml @@ -2,6 +2,8 @@ name: Stylua on: push: + branches: + - "main" pull_request: jobs: @@ -9,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: JohnnyMorganz/stylua-action@v3 + - uses: JohnnyMorganz/stylua-action@v4 with: token: ${{ secrets.GITHUB_TOKEN }} version: latest diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index fb1e389..d46b2ff 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -2,6 +2,8 @@ name: Test on: push: + branches: + - "main" pull_request: jobs: diff --git a/.luacheckrc b/.luacheckrc index c5cdeab..2998a81 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -4,6 +4,7 @@ globals = { 'vim.wo', 'vim.bo', 'vim.opt', + 'vim.lsp', } read_globals = { 'vim', diff --git a/CHANGELOG.md b/CHANGELOG.md index d899662..1c10b0c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## [1.12.0](https://github.com/nvim-java/nvim-java/compare/v1.11.0...v1.12.0) (2024-07-10) + + +### Features + +* add command to change the runtime ([#244](https://github.com/nvim-java/nvim-java/issues/244)) ([af9c8ff](https://github.com/nvim-java/nvim-java/commit/af9c8ff3c7cf313611daa194409cb65e7831e98a)) + + +### Bug Fixes + +* remove github token from stylua workflow ([a6b1c8b](https://github.com/nvim-java/nvim-java/commit/a6b1c8b8a5569476c1a73bcb606ba2e33025d54e)) +* the manually stoped/restarted job show the error message ([#242](https://github.com/nvim-java/nvim-java/issues/242)) ([#243](https://github.com/nvim-java/nvim-java/issues/243)) ([0b9fac9](https://github.com/nvim-java/nvim-java/commit/0b9fac9cae5ac13590d5e8201d9611aebbbece73)) + ## [1.11.0](https://github.com/nvim-java/nvim-java/compare/v1.10.0...v1.11.0) (2024-07-06) diff --git a/README.md b/README.md index 6a48d6e..4f2ae29 100644 --- a/README.md +++ b/README.md @@ -121,6 +121,10 @@ Yep! That's all :) - `JavaRefactorExtractVariable` - Create a variable from returned value at cursor +### Settings + +- `JavaSettingsChangeRuntime` - Change the JDK version to another + ## :computer: APIs @@ -214,6 +218,14 @@ require('java').profile.ui() require('java').refactor.extract_variable() ``` +### Settings + +- `change_runtime` - Change the JDK version to another + +```lua +require('java').settings.change_runtime() +``` + ## :clamp: How to Use JDK X.X Version? diff --git a/doc/nvim-java.txt b/doc/nvim-java.txt index ec98759..2d8ba3b 100644 --- a/doc/nvim-java.txt +++ b/doc/nvim-java.txt @@ -1,4 +1,4 @@ -*nvim-java.txt* For Neovim >= 0.9.4 Last change: 2024 July 06 +*nvim-java.txt* For Neovim >= 0.9.4 Last change: 2024 July 10 ============================================================================== Table of Contents *nvim-java-table-of-contents* @@ -147,6 +147,11 @@ REFACTOR ~ - `JavaRefactorExtractVariable` - Create a variable from returned value at cursor +SETTINGS ~ + +- `JavaSettingsChangeRuntime` - Change the JDK version to another + + APIS *nvim-java-apis* :small_orange_diamond:details ~ @@ -243,6 +248,15 @@ REFACTOR ~ < +SETTINGS ~ + +- `change_runtime` - Change the JDK version to another + +>lua + require('java').settings.change_runtime() +< + + HOW TO USE JDK X.X VERSION? *nvim-java-how-to-use-jdk-x.x-version?* :small_orange_diamond:details ~ diff --git a/lua/java.lua b/lua/java.lua index 718f883..fa45643 100644 --- a/lua/java.lua +++ b/lua/java.lua @@ -1,3 +1,5 @@ +require('java.commands') + local decomple_watch = require('java.startup.decompile-watcher') local mason_dep = require('java.startup.mason-dep') local setup_wrap = require('java.startup.lspconfig-setup-wrap') @@ -9,17 +11,25 @@ local runner = require('java.api.runner') local profile_ui = require('java.ui.profile') local refactor = require('java.api.refactor') local build_api = require('java.api.build') +local settings_api = require('java.api.settings') local global_config = require('java.config') local M = {} function M.setup(custom_config) + vim.api.nvim_exec_autocmds('User', { pattern = 'JavaPreSetup' }) + local config = vim.tbl_deep_extend('force', global_config, custom_config or {}) vim.g.nvim_java_config = config + vim.api.nvim_exec_autocmds( + 'User', + { pattern = 'JavaSetup', data = { config = config } } + ) + if not startup_check() then return end @@ -31,6 +41,11 @@ function M.setup(custom_config) decomple_watch.setup() dap.setup_dap_on_lsp_attach() end + + vim.api.nvim_exec_autocmds( + 'User', + { pattern = 'JavaPostSetup', data = { config = config } } + ) end ---------------------------------------------------------------------- @@ -86,6 +101,12 @@ M.runner.built_in.switch_app = runner.built_in.switch_app M.profile = {} M.profile.ui = profile_ui.ui +---------------------------------------------------------------------- +-- Settings -- +---------------------------------------------------------------------- +M.settings = {} +M.settings.change_runtime = settings_api.change_runtime + function M.__run() test.debug_current_method() end diff --git a/lua/java/api/build.lua b/lua/java/api/build.lua index ac54056..292a153 100644 --- a/lua/java/api/build.lua +++ b/lua/java/api/build.lua @@ -3,15 +3,22 @@ local get_error_handler = require('java.handlers.error') local M = {} -function M.full_build_workspace() - return async(function() - local JavaCoreJdtlsClient = require('java-core.ls.clients.jdtls-client') - local jdtls = require('java.utils.jdtls') - local buf_util = require('java.utils.buffer') - local notify = require('java-core.utils.notify') +---Do a workspace build +---@param is_full_build? boolean +---@return number +function M.full_build_workspace(is_full_build) + local JavaCoreJdtlsClient = require('java-core.ls.clients.jdtls-client') + local jdtls = require('java.utils.jdtls2') + local buf_util = require('java.utils.buffer') + local notify = require('java-core.utils.notify') + + is_full_build = type(is_full_build) == 'boolean' and is_full_build or true - JavaCoreJdtlsClient:new(jdtls()) - :java_build_workspace(true, buf_util.get_curr_buf()) + return async(function() + JavaCoreJdtlsClient(jdtls()):java_build_workspace( + is_full_build, + buf_util.get_curr_buf() + ) notify.info('Workspace build successful!') end) diff --git a/lua/java/api/runner.lua b/lua/java/api/runner.lua index b060062..d5e34c5 100644 --- a/lua/java/api/runner.lua +++ b/lua/java/api/runner.lua @@ -38,7 +38,7 @@ function M.built_in.stop_app() async(function() M.runner:stop_run() end) - .catch(get_error_handler('Failed to switch run')) + .catch(get_error_handler('Failed to stop run')) .run() end diff --git a/lua/java/api/settings.lua b/lua/java/api/settings.lua new file mode 100644 index 0000000..8cc47a1 --- /dev/null +++ b/lua/java/api/settings.lua @@ -0,0 +1,57 @@ +local get_jdtls = require('java.utils.jdtls2') +local JdtlsClient = require('java-core.ls.clients.jdtls-client') +local conf_utils = require('java.utils.config') +local notify = require('java-core.utils.notify') +local ui = require('java.utils.ui') +local async = require('java-core.utils.async').sync +local get_error_handler = require('java.handlers.error') + +local M = {} + +function M.change_runtime() + local client = get_jdtls() + + ---@type RuntimeOption[] + local runtimes = conf_utils.get_property_from_conf( + client.config, + 'settings.java.configuration.runtimes', + {} + ) + + if #runtimes < 1 then + notify.error( + 'No configured runtimes available' + .. '\nRefer following link for instructions define available runtimes' + .. '\nhttps://github.com/nvim-java/nvim-java?tab=readme-ov-file#clamp-how-to-use-jdk-xx-version' + ) + return + end + + local jdtls = JdtlsClient(client) + + async(function() + local sel_runtime = ui.select( + 'Select Runtime', + runtimes, + function(runtime) + return runtime.name .. '::' .. runtime.path + end + ) + + for _, runtime in + ipairs(client.config.settings.java.configuration.runtimes) + do + if sel_runtime.path == runtime.path then + runtime.default = true + else + runtime.default = nil + end + end + + jdtls:workspace_did_change_configuration(client.config.settings) + end) + .catch(get_error_handler('Changing runtime failed')) + .run() +end + +return M diff --git a/lua/java/commands/init.lua b/lua/java/commands/init.lua new file mode 100644 index 0000000..f260495 --- /dev/null +++ b/lua/java/commands/init.lua @@ -0,0 +1,200 @@ +local log = require('java.utils.log') + +local M = {} + +local id + +id = 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 + log.debug('adding vim.lsp.commands for java') + + for key, handler in pairs(M.handlers) do + vim.lsp.commands[key] = handler + end + + vim.api.nvim_del_autocmd(id) + end + end, + + group = vim.api.nvim_create_augroup('JavaCommandReg', {}), +}) + +M.commands = { + + OPEN_BROWSER = 'vscode.open', + + OPEN_OUTPUT = 'java.open.output', + + SHOW_JAVA_REFERENCES = 'java.show.references', + + SHOW_JAVA_IMPLEMENTATIONS = 'java.show.implementations', + + SHOW_REFERENCES = 'editor.action.showReferences', + + GOTO_LOCATION = 'editor.action.goToLocations', + + MARKDOWN_API_RENDER = 'markdown.api.render', + + CONFIGURATION_UPDATE = 'java.projectConfiguration.update', + + IGNORE_INCOMPLETE_CLASSPATH = 'java.ignoreIncompleteClasspath', + + IGNORE_INCOMPLETE_CLASSPATH_HELP = 'java.ignoreIncompleteClasspath.help', + + RELOAD_WINDOW = 'workbench.action.reloadWindow', + + PROJECT_CONFIGURATION_STATUS = 'java.projectConfiguration.status', + + NULL_ANALYSIS_SET_MODE = 'java.compile.nullAnalysis.setMode', + + APPLY_WORKSPACE_EDIT = 'java.apply.workspaceEdit', + + EXECUTE_WORKSPACE_COMMAND = 'java.execute.workspaceCommand', + + COMPILE_WORKSPACE = 'java.workspace.compile', + + BUILD_PROJECT = 'java.project.build', + + OPEN_SERVER_LOG = 'java.open.serverLog', + + OPEN_SERVER_STDOUT_LOG = 'java.open.serverStdoutLog', + + OPEN_SERVER_STDERR_LOG = 'java.open.serverStderrLog', + + OPEN_CLIENT_LOG = 'java.open.clientLog', + + OPEN_LOGS = 'java.open.logs', + + OPEN_FORMATTER = 'java.open.formatter.settings', + + OPEN_FILE = 'java.open.file', + + CLEAN_WORKSPACE = 'java.clean.workspace', + + UPDATE_SOURCE_ATTACHMENT_CMD = 'java.project.updateSourceAttachment.command', + UPDATE_SOURCE_ATTACHMENT = 'java.project.updateSourceAttachment', + + RESOLVE_SOURCE_ATTACHMENT = 'java.project.resolveSourceAttachment', + + ADD_TO_SOURCEPATH_CMD = 'java.project.addToSourcePath.command', + ADD_TO_SOURCEPATH = 'java.project.addToSourcePath', + + REMOVE_FROM_SOURCEPATH_CMD = 'java.project.removeFromSourcePath.command', + REMOVE_FROM_SOURCEPATH = 'java.project.removeFromSourcePath', + + LIST_SOURCEPATHS_CMD = 'java.project.listSourcePaths.command', + LIST_SOURCEPATHS = 'java.project.listSourcePaths', + + IMPORT_PROJECTS_CMD = 'java.project.import.command', + IMPORT_PROJECTS = 'java.project.import', + CHANGE_IMPORTED_PROJECTS = 'java.project.changeImportedProjects', + + OVERRIDE_METHODS_PROMPT = 'java.action.overrideMethodsPrompt', + + HASHCODE_EQUALS_PROMPT = 'java.action.hashCodeEqualsPrompt', + + OPEN_JSON_SETTINGS = 'workbench.action.openSettingsJson', + + ORGANIZE_IMPORTS = 'java.action.organizeImports', + + ORGANIZE_IMPORTS_SILENTLY = 'java.edit.organizeImports', + MANUAL_CLEANUP = 'java.action.doCleanup', + + HANDLE_PASTE_EVENT = 'java.edit.handlePasteEvent', + + CLIPBOARD_ONPASTE = 'java.action.clipboardPasteAction', + + FILESEXPLORER_ONPASTE = 'java.action.filesExplorerPasteAction', + + CHOOSE_IMPORTS = 'java.action.organizeImports.chooseImports', + + GENERATE_TOSTRING_PROMPT = 'java.action.generateToStringPrompt', + + GENERATE_ACCESSORS_PROMPT = 'java.action.generateAccessorsPrompt', + + GENERATE_CONSTRUCTORS_PROMPT = 'java.action.generateConstructorsPrompt', + + GENERATE_DELEGATE_METHODS_PROMPT = 'java.action.generateDelegateMethodsPrompt', + + APPLY_REFACTORING_COMMAND = 'java.action.applyRefactoringCommand', + + RENAME_COMMAND = 'java.action.rename', + + NAVIGATE_TO_SUPER_IMPLEMENTATION_COMMAND = 'java.action.navigateToSuperImplementation', + + SHOW_TYPE_HIERARCHY = 'java.action.showTypeHierarchy', + + SHOW_SUPERTYPE_HIERARCHY = 'java.action.showSupertypeHierarchy', + + SHOW_SUBTYPE_HIERARCHY = 'java.action.showSubtypeHierarchy', + + SHOW_CLASS_HIERARCHY = 'java.action.showClassHierarchy', + + CHANGE_BASE_TYPE = 'java.action.changeBaseType', + + OPEN_TYPE_HIERARCHY = 'java.navigate.openTypeHierarchy', + + RESOLVE_TYPE_HIERARCHY = 'java.navigate.resolveTypeHierarchy', + + SHOW_SERVER_TASK_STATUS = 'java.show.server.task.status', + + GET_PROJECT_SETTINGS = 'java.project.getSettings', + + GET_CLASSPATHS = 'java.project.getClasspaths', + + IS_TEST_FILE = 'java.project.isTestFile', + + GET_ALL_JAVA_PROJECTS = 'java.project.getAll', + + SWITCH_SERVER_MODE = 'java.server.mode.switch', + + RESTART_LANGUAGE_SERVER = 'java.server.restart', + + LEARN_MORE_ABOUT_REFACTORING = '_java.learnMoreAboutRefactorings', + + LEARN_MORE_ABOUT_CLEAN_UPS = '_java.learnMoreAboutCleanUps', + + TEMPLATE_VARIABLES = '_java.templateVariables', + + NOT_COVERED_EXECUTION = '_java.notCoveredExecution', + + METADATA_FILES_GENERATION = '_java.metadataFilesGeneration', + + RUNTIME_VALIDATION_OPEN = 'java.runtimeValidation.open', + + RESOLVE_WORKSPACE_SYMBOL = 'java.project.resolveWorkspaceSymbol', + + GET_WORKSPACE_PATH = '_java.workspace.path', + + UPGRADE_GRADLE_WRAPPER_CMD = 'java.project.upgradeGradle.command', + UPGRADE_GRADLE_WRAPPER = 'java.project.upgradeGradle', + + LOMBOK_CONFIGURE = 'java.lombokConfigure', + + CREATE_MODULE_INFO = 'java.project.createModuleInfo', + + CREATE_MODULE_INFO_COMMAND = 'java.project.createModuleInfo.command', + + REFRESH_BUNDLES = 'java.reloadBundles', + + REFRESH_BUNDLES_COMMAND = '_java.reloadBundles.command', + + CLEAN_SHARED_INDEXES = 'java.clean.sharedIndexes', + + GET_DECOMPILED_SOURCE = 'java.decompile', + + SMARTSEMICOLON_DETECTION = 'java.edit.smartSemicolonDetection', + + RESOLVE_PASTED_TEXT = 'java.project.resolveText', + + OPEN_STATUS_SHORTCUT = '_java.openShortcuts', +} + +M.handlers = { + [M.commands.COMPILE_WORKSPACE] = function(is_full_build) + require('java.api.build').full_build_workspace(is_full_build) + end, +} diff --git a/lua/java/runner/run.lua b/lua/java/runner/run.lua index cb5ab35..d5214b2 100644 --- a/lua/java/runner/run.lua +++ b/lua/java/runner/run.lua @@ -6,6 +6,7 @@ local notify = require('java-core.utils.notify') ---@field main_class string ---@field buffer number ---@field is_running boolean +---@field is_manually_stoped boolean ---@field private cmd string ---@field private term_chan_id number ---@field private job_chan_id number | nil @@ -46,6 +47,7 @@ function Run:stop() return end + self.is_manually_stoped = true vim.fn.jobstop(self.job_chan_id) vim.fn.jobwait({ self.job_chan_id }, 1000) self.job_chan_id = nil @@ -77,8 +79,9 @@ function Run:on_job_exit(exit_code) self.is_running = false - if exit_code == 0 then + if exit_code == 0 or self.is_manually_stoped then self.is_failure = false + self.is_manually_stoped = false else self.is_failure = true notify.error(string.format('%s %s', self.name, message)) diff --git a/lua/java/startup/decompile-watcher.lua b/lua/java/startup/decompile-watcher.lua index 078cc44..9c3e9c1 100644 --- a/lua/java/startup/decompile-watcher.lua +++ b/lua/java/startup/decompile-watcher.lua @@ -1,4 +1,4 @@ -local jdtls = require('java.utils.jdtls') +local jdtls = require('java.utils.jdtls2') local get_error_handler = require('java.handlers.error') local async = require('java-core.utils.async').sync @@ -22,11 +22,10 @@ function M.setup() local done = false async(function() - local client_obj = jdtls() + local client = jdtls() local buffer = opts.buf - local text = JavaCoreJdtlsClient:new(client_obj) - :java_decompile(opts.file) + local text = JavaCoreJdtlsClient(client):java_decompile(opts.file) local lines = vim.split(text, '\n') @@ -38,8 +37,8 @@ function M.setup() vim.bo[buffer].filetype = 'java' vim.bo[buffer].modifiable = false - if not vim.lsp.buf_is_attached(buffer, client_obj.client.id) then - vim.lsp.buf_attach_client(buffer, client_obj.client.id) + if not vim.lsp.buf_is_attached(buffer, client.id) then + vim.lsp.buf_attach_client(buffer, client.id) end done = true diff --git a/lua/java/startup/lspconfig-setup-wrap.lua b/lua/java/startup/lspconfig-setup-wrap.lua index ab3eb75..2c92189 100644 --- a/lua/java/startup/lspconfig-setup-wrap.lua +++ b/lua/java/startup/lspconfig-setup-wrap.lua @@ -14,6 +14,8 @@ function M.setup(config) local org_setup = lspconfig.jdtls.setup lspconfig.jdtls.setup = function(user_config) + vim.api.nvim_exec_autocmds('User', { pattern = 'JavaJdtlsSetup' }) + local jdtls_plugins = {} if config.java_test.enable then diff --git a/lua/java/utils/config.lua b/lua/java/utils/config.lua new file mode 100644 index 0000000..eaf9f3b --- /dev/null +++ b/lua/java/utils/config.lua @@ -0,0 +1,17 @@ +local M = {} + +function M.get_property_from_conf(config, path, default) + local node = config + + for key in string.gmatch(path, '([^.]+)') do + if not node[key] then + return default + end + + node = node[key] + end + + return node +end + +return M diff --git a/lua/java/utils/jdtls2.lua b/lua/java/utils/jdtls2.lua index 5458847..2eb49c9 100644 --- a/lua/java/utils/jdtls2.lua +++ b/lua/java/utils/jdtls2.lua @@ -1,7 +1,7 @@ local get_error_handler = require('java.handlers.error') ---Returns an active jdtls client ----@return { client: LspClient } +---@return vim.lsp.Client local function get_jdtls() local clients diff --git a/lua/java/utils/ui.lua b/lua/java/utils/ui.lua index 214112d..23f2275 100644 --- a/lua/java/utils/ui.lua +++ b/lua/java/utils/ui.lua @@ -4,10 +4,17 @@ local notify = require('java-core.utils.notify') local M = {} -function M.select(prompt, values) +---Async vim.ui.select function +---@generic T +---@param prompt string +---@param values T[] +---@param format_item fun(item: T): string +---@return T +function M.select(prompt, values, format_item) return await(function(callback) vim.ui.select(values, { prompt = prompt, + format_item = format_item, }, callback) end) end diff --git a/plugin/java.lua b/plugin/java.lua index 39763a6..9f37cb8 100644 --- a/plugin/java.lua +++ b/plugin/java.lua @@ -5,6 +5,8 @@ local function c(cmd, callback, opts) end local cmd_map = { + JavaSettingsChangeRuntime = { java.settings.change_runtime }, + JavaBuildWorkspace = { java.build.build_workspace }, JavaDapConfig = { java.dap.config_dap },