mfussenegger / nvim-jdtls

Extensions for the built-in LSP support in Neovim for eclipse.jdt.ls
GNU General Public License v3.0
1.05k stars 61 forks source link

No test class found #508

Closed shwahnim closed 1 year ago

shwahnim commented 1 year ago

LSP client configuration

local lsp = require "mks.lsp"
local jdtls = require "jdtls"

local home = os.getenv "HOME"

local jdtls_binary = home .. "/.local/share/nvim/mason/bin/jdtls"
local jdtls_installation = home .. "/.local/share/nvim/mason/packages/jdtls/"
local lombok = jdtls_installation .. "lombok.jar"
local project_name = vim.fn.fnamemodify(vim.fn.getcwd(), ":p:h:t")
local java_test_path = home .. "/.local/share/nvim/mason/packages/java-test/extension/server/"
local java_dap_path = home .. "/.local/share/nvim/mason/packages/java-debug-adapter/extension/server/"
local workspace_dir = jdtls_installation .. "workspace" .. project_name

local settings = {
  java = {
    forma = {
      settings = {
        url = home .. "/.config/nvim/language-servers/java-google-formatter.xml",
        profile = "GoogleStyle",
      },
    },
    eclipse = {
      downloadSources = true,
    },
    maven = {
      downloadSources = true,
    },
    implementationsCodeLens = {
      enabled = true,
    },
    referencesCodeLens = {
      enabled = true,
    },
    testsCodeLens = {
      enabled = true,
    },
    signatureHelp = { enabled = true },
    contentProvider = { preferred = "fernflower" },
    completion = {
      favoriteStaticMembers = {
        "org.hamcrest.MatcherAssert.assertThat",
        "org.hamcrest.Matchers.*",
        "org.hamcrest.CoreMatchers.*",
        "org.junit.jupiter.api.Assertions.*",
        "java.util.Objects.requireNonNull",
        "java.util.Objects.requireNonNullElse",
        "org.mockito.Mockito.*",
      },
      importOrder = {
        "java",
        "javax",
        "com",
        "org",
      },
      filteredTypes = {
        "com.sun.*",
        "io.micrometer.shaded.*",
        "java.awt.*",
        "jdk.*",
        "sun.*",
      },
    },
    sources = {
      organizeImports = {
        starThreshold = 9999,
        staticStarThreshold = 9999,
      },
    },
    codeGeneration = {
      toString = {
        template = "${object.className}{${member.name()}=${member.value}, ${otherMembers}}",
      },
      hashCodeEquals = {
        useJava7Objects = true,
      },
      useBlocks = true,
    },
    lintOptions = {},
    configuration = {
      runtimes = {
        -- {
        --   name = "JavaSE-21",
        --   path = home .. "/.sdkman/candidates/java/21.ea.25-open/",
        -- },
        {
          name = "JavaSE-17",
          path = home .. "/.sdkman/candidates/java/17.0.7-amzn/",
        },
        {
          name = "JavaSE-11",
          path = home .. "/.sdkman/candidates/java/11.0.12-open/",
        },
        {
          name = "JavaSE-1.8",
          path = home .. "/.sdkman/candidates/java/8.0.302-open/",
        },
      },
    },
  },
}

local extendedClientCapabilities = require("jdtls").extendedClientCapabilities
extendedClientCapabilities.resolveAdditionalTextEditsSupport = true

local bundles = vim.fn.extend(
  vim.fn.split(vim.fn.glob(java_test_path .. "*.jar"), "\n"),
  vim.fn.split(vim.fn.glob(java_dap_path .. "*.jar"), "\n")
)

-- This is the new part

local config = {
  cmd = {
    -- "/home/mohammad/.sdkman/candidates/java/21.ea.25-open",
    jdtls_binary,
    "-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",
    "-Xmx1g",
    -- "--jvm-arg=-javaagent:" .. lombok .. " --jvm-arg=-Xbootclasspath/a:" .. lombok,
    "--jvm-arg=-javaagent:" .. lombok,
    "--add-modules=ALL-SYSTEM",
    "--add-opens",
    "java.base/java.util=ALL-UNNAMED",
    "--add-opens",
    "java.base/java.lang=ALL-UNNAMED",
    "-jar",
    vim.fn.glob(jdtls_installation .. "plugins/org.eclipse.equinox.launcher_*.jar"),
    "-configuration",
    jdtls_installation .. "config_linux",
    "-data",
    workspace_dir,
  },

  root_dir = require("jdtls.setup").find_root { ".git", "mvnw", "gradlew", "pom.xml" },
  on_attach = function(client, bufno)
    jdtls.setup_dap { hotcodereplace = "auto" }
    jdtls.setup.add_commands()

    local function buf_set_keymap(...)
      vim.api.nvim_buf_set_keymap(bufno, ...)
    end
    local function buf_set_option(...)
      vim.api.nvim_buf_set_option(bufno, ...)
    end

    buf_set_option("omnifunc", "v:lua.vim.lsp.omnifunc")
    -- Mappings.
    local opts = { noremap = true, silent = true }

    -- Java specific
    buf_set_keymap("n", "<leader>oi", "<Cmd>lua require'jdtls'.organize_imports()<CR>", opts)

    buf_set_keymap("n", "<leader>gt", "<Cmd>lua require'jdtls'.test_class()<CR>", opts)

    buf_set_keymap("n", "<leader>tn", "<Cmd>lua require'jdtls'.test_nearest_method()<CR>", opts)

    buf_set_keymap("v", "<leader>ev", "<Esc><Cmd>lua require('jdtls').extract_variable(true)<CR>", opts)

    buf_set_keymap("n", "<leader>ev", "<Cmd>lua require('jdtls').extract_variable()<CR>", opts)

    buf_set_keymap("n", "<leader>ec", "<Cmd>lua require('jdtls').extract_constant()<CR>", opts)

    buf_set_keymap("v", "<leader>em", "<Esc><Cmd>lua require('jdtls').extract_method(true)<CR>", opts)

    buf_set_keymap("n", "<leader>ll", "<cmd>lua vim.lsp.buf.format()<CR>", opts)

    buf_set_keymap("n", "<leader>cf", "<Cmd>lua require('jdtls').compile('full')<CR>", opts)

    buf_set_keymap("n", "<leader>ci", "<Cmd>lua require('jdtls').compile('incremental')<CR>", opts)

    buf_set_keymap("n", "<leader>b", "<Cmd>lua require('jdtls').build_projects()<CR>", opts)

    buf_set_keymap("n", "<leader>rl", "<Cmd>lua require('jdtls').update_project_config()<CR>", opts)

    vim.api.nvim_exec(
      [[
        augroup FormatAutogroup
          autocmd!
          autocmd BufWritePost *.java FormatWrite
        augroup end
      ]],
      true
    )

    vim.api.nvim_exec(
      [[
          hi LspReferenceRead cterm=bold ctermbg=red guibg=LightYellow
          hi LspReferenceText cterm=bold ctermbg=red guibg=LightYellow
          hi LspReferenceWrite cterm=bold ctermbg=red guibg=LightYellow
          augroup lsp_document_highlight
            autocmd!
            autocmd CursorHold <buffer> lua vim.lsp.buf.document_highlight()
            autocmd CursorMoved <buffer> lua vim.lsp.buf.clear_references()
          augroup END
      ]],
      false
    )
    lsp.on_attach(client, bufno)
  end,
  on_init = function(client, bufnr)
    lsp.on_init(client)
    client.notify("workspace/didChangeConfiguration", { settings = settings })
  end,
  settings = settings,
  init_options = {
    extendedClientCapabilities = extendedClientCapabilities,
    bundles = bundles,
  },
  flags = {
    allow_incremental_sync = true,
  },
}
require("jdtls").start_or_attach(config)

Eclipse.jdt.ls version

1.6.400.v20210924-0641

Steps to Reproduce

Open a class that has test and invoke go to test class

Expected Result

go to class

Actual Result

no test class found

JdtShowLog

[WARN][2023-06-09 22:43:48] ...lsp/handlers.lua:137 "The language server jdtls triggers a registerCapability handler despite dynamicRegistration set to false. Report upstream, this warning is harmless"
[ERROR][2023-06-09 22:43:49] ...lsp/handlers.lua:535    "Jun 9, 2023, 10:43:49 PM Command _java.reloadBundles.command not supported on client"