aboutsummaryrefslogtreecommitdiffstats
path: root/lua/lspconfig/server_configurations/jdtls.lua
diff options
context:
space:
mode:
authorMichael Lingelbach <m.j.lbach@gmail.com>2021-11-24 23:01:07 -0500
committerMichael Lingelbach <m.j.lbach@gmail.com>2021-11-25 23:46:21 -0500
commit6c2fb86c6a03e20abea5ddd17d735885f0b7cb5e (patch)
tree7f2bf25ca5456b23304295dba8fe0005e85a5c10 /lua/lspconfig/server_configurations/jdtls.lua
parentfix: only set cmd_cwd if filepath exists (#1485) (diff)
downloadnvim-lspconfig-6c2fb86c6a03e20abea5ddd17d735885f0b7cb5e.tar
nvim-lspconfig-6c2fb86c6a03e20abea5ddd17d735885f0b7cb5e.tar.gz
nvim-lspconfig-6c2fb86c6a03e20abea5ddd17d735885f0b7cb5e.tar.bz2
nvim-lspconfig-6c2fb86c6a03e20abea5ddd17d735885f0b7cb5e.tar.lz
nvim-lspconfig-6c2fb86c6a03e20abea5ddd17d735885f0b7cb5e.tar.xz
nvim-lspconfig-6c2fb86c6a03e20abea5ddd17d735885f0b7cb5e.tar.zst
nvim-lspconfig-6c2fb86c6a03e20abea5ddd17d735885f0b7cb5e.zip
feat: expose configs
Diffstat (limited to 'lua/lspconfig/server_configurations/jdtls.lua')
-rw-r--r--lua/lspconfig/server_configurations/jdtls.lua203
1 files changed, 203 insertions, 0 deletions
diff --git a/lua/lspconfig/server_configurations/jdtls.lua b/lua/lspconfig/server_configurations/jdtls.lua
new file mode 100644
index 00000000..353b1d42
--- /dev/null
+++ b/lua/lspconfig/server_configurations/jdtls.lua
@@ -0,0 +1,203 @@
+local util = require 'lspconfig/util'
+local handlers = require 'vim.lsp.handlers'
+
+local sysname = vim.loop.os_uname().sysname
+local env = {
+ HOME = vim.loop.os_homedir(),
+ JAVA_HOME = os.getenv 'JAVA_HOME',
+ JDTLS_HOME = os.getenv 'JDTLS_HOME',
+ WORKSPACE = os.getenv 'WORKSPACE',
+}
+
+local function get_java_executable()
+ local executable = env.JAVA_HOME and util.path.join(env.JAVA_HOME, 'bin', 'java') or 'java'
+
+ return sysname:match 'Windows' and executable .. '.exe' or executable
+end
+
+local function get_workspace_dir()
+ return env.WORKSPACE and env.WORKSPACE or util.path.join(env.HOME, 'workspace')
+end
+
+local function get_jdtls_jar()
+ return vim.fn.expand '$JDTLS_HOME/plugins/org.eclipse.equinox.launcher_*.jar'
+end
+
+local function get_jdtls_config()
+ if sysname:match 'Linux' then
+ return util.path.join(env.JDTLS_HOME, 'config_linux')
+ elseif sysname:match 'Darwin' then
+ return util.path.join(env.JDTLS_HOME, 'config_mac')
+ elseif sysname:match 'Windows' then
+ return util.path.join(env.JDTLS_HOME, 'config_win')
+ else
+ return util.path.join(env.JDTLS_HOME, 'config_linux')
+ end
+end
+
+-- TextDocument version is reported as 0, override with nil so that
+-- the client doesn't think the document is newer and refuses to update
+-- See: https://github.com/eclipse/eclipse.jdt.ls/issues/1695
+local function fix_zero_version(workspace_edit)
+ if workspace_edit and workspace_edit.documentChanges then
+ for _, change in pairs(workspace_edit.documentChanges) do
+ local text_document = change.textDocument
+ if text_document and text_document.version and text_document.version == 0 then
+ text_document.version = nil
+ end
+ end
+ end
+ return workspace_edit
+end
+
+-- Compatibility shim added for breaking changes to the lsp handler signature in nvim-0.5.1
+local function remap_arguments(err, result, ctx)
+ if vim.fn.has 'nvim-0.5.1' == 1 then
+ handlers[ctx.method](err, result, ctx)
+ else
+ handlers[ctx.method](err, ctx.method, result)
+ end
+end
+
+local function on_textdocument_codeaction(err, actions, ctx)
+ for _, action in ipairs(actions) do
+ -- TODO: (steelsojka) Handle more than one edit?
+ if action.command == 'java.apply.workspaceEdit' then -- 'action' is Command in java format
+ action.edit = fix_zero_version(action.edit or action.arguments[1])
+ elseif type(action.command) == 'table' and action.command.command == 'java.apply.workspaceEdit' then -- 'action' is CodeAction in java format
+ action.edit = fix_zero_version(action.edit or action.command.arguments[1])
+ end
+ end
+
+ remap_arguments(err, actions, ctx)
+end
+
+local function on_textdocument_rename(err, workspace_edit, ctx)
+ remap_arguments(err, fix_zero_version(workspace_edit), ctx)
+end
+
+local function on_workspace_applyedit(err, workspace_edit, ctx)
+ remap_arguments(err, fix_zero_version(workspace_edit), ctx)
+end
+
+-- Non-standard notification that can be used to display progress
+local function on_language_status(_, result)
+ local command = vim.api.nvim_command
+ command 'echohl ModeMsg'
+ command(string.format('echo "%s"', result.message))
+ command 'echohl None'
+end
+
+local root_files = {
+ -- Single-module projects
+ {
+ 'build.xml', -- Ant
+ 'pom.xml', -- Maven
+ 'settings.gradle', -- Gradle
+ 'settings.gradle.kts', -- Gradle
+ },
+ -- Multi-module projects
+ { 'build.gradle', 'build.gradle.kts' },
+}
+
+return {
+ default_config = {
+ cmd = {
+ get_java_executable(),
+ '-Declipse.application=org.eclipse.jdt.ls.core.id1',
+ '-Dosgi.bundles.defaultStartLevel=4',
+ '-Declipse.product=org.eclipse.jdt.ls.core.product',
+ '-Dlog.protocol=true',
+ '-Dlog.level=ALL',
+ '-Xms1g',
+ '-Xmx2G',
+ '--add-modules=ALL-SYSTEM',
+ '--add-opens',
+ 'java.base/java.util=ALL-UNNAMED',
+ '--add-opens',
+ 'java.base/java.lang=ALL-UNNAMED',
+ '-jar',
+ get_jdtls_jar(),
+ '-configuration',
+ get_jdtls_config(),
+ '-data',
+ get_workspace_dir(),
+ },
+ filetypes = { 'java' },
+ root_dir = function(fname)
+ for _, patterns in ipairs(root_files) do
+ local root = util.root_pattern(unpack(patterns))(fname)
+ if root then
+ return root
+ end
+ end
+ end,
+ single_file_mode = true,
+ init_options = {
+ workspace = get_workspace_dir(),
+ jvm_args = {},
+ os_config = nil,
+ },
+ handlers = {
+ -- Due to an invalid protocol implementation in the jdtls we have to conform these to be spec compliant.
+ -- https://github.com/eclipse/eclipse.jdt.ls/issues/376
+ ['textDocument/codeAction'] = util.compat_handler(on_textdocument_codeaction),
+ ['textDocument/rename'] = util.compat_handler(on_textdocument_rename),
+ ['workspace/applyEdit'] = util.compat_handler(on_workspace_applyedit),
+ ['language/status'] = util.compat_handler(vim.schedule_wrap(on_language_status)),
+ },
+ },
+ docs = {
+ package_json = 'https://raw.githubusercontent.com/redhat-developer/vscode-java/master/package.json',
+ description = [[
+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)
+
+Due to the nature of java, settings cannot be inferred. Please set the following
+environmental variables to match your installation. If you need per-project configuration
+[direnv](https://github.com/direnv/direnv) is highly recommended.
+
+```bash
+# Mandatory:
+# .bashrc
+export JDTLS_HOME=/path/to/jdtls_root # Directory with the plugin and configs directories
+
+# Optional:
+export JAVA_HOME=/path/to/java_home # In case you don't have java in path or want to use a version in particular
+export WORKSPACE=/path/to/workspace # Defaults to $HOME/workspace
+```
+```lua
+ -- init.lua
+ require'lspconfig'.jdtls.setup{}
+```
+
+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
+ require'lspconfig'.jdtls.setup{ cmd = { 'jdtls' } }
+ ```
+ ]],
+ default_config = {
+ root_dir = [[{
+ -- Single-module projects
+ {
+ 'build.xml', -- Ant
+ 'pom.xml', -- Maven
+ 'settings.gradle', -- Gradle
+ 'settings.gradle.kts', -- Gradle
+ },
+ -- Multi-module projects
+ { 'build.gradle', 'build.gradle.kts' },
+ } or vim.fn.getcwd()]],
+ },
+ },
+}