Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 6 additions & 4 deletions lua/java.lua
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,14 @@ function M.setup(custom_config)
local config = vim.tbl_deep_extend('force', global_config, custom_config)

nvim_dep.check()
mason_dep.install(config)

setup_wrap.setup(config)
decomple_watch.setup()
local is_installing = mason_dep.install(config)

dap.setup_dap_on_lsp_attach()
if not is_installing then
setup_wrap.setup(config)
decomple_watch.setup()
dap.setup_dap_on_lsp_attach()
end
end

----------------------------------------------------------------------
Expand Down
88 changes: 33 additions & 55 deletions lua/java/startup/mason-dep.lua
Original file line number Diff line number Diff line change
@@ -1,76 +1,54 @@
local log = require('java.utils.log')
local mason_reg = require('mason-registry')
local mason_ui = require('mason.ui')
local mason_util = require('java.utils.mason')
local notify = require('java-core.utils.notify')
local async = require('java-core.utils.async')
local sync = async.sync

local M = {}

local dependecies = {
{ name = 'jdtls', version = 'v1.29.0' },
{ name = 'java-test', version = '0.40.1' },
{ name = 'java-debug-adapter', version = '0.52.0' },
}

---Install mason package dependencies for nvim-java
---@param config java.Config
function M.install(config)
log.info('check mason dependecies')

local is_installing = false

if config.jdk.auto_install then
table.insert(dependecies, { name = 'openjdk-17', version = '17.0.2' })
end

for _, dep in ipairs(dependecies) do
if not M.is_installed(dep.name, dep.version) then
log.info('installing mason pkg: ' .. tostring(dep.name))

is_installing = true

local pkg = mason_reg.get_package(dep.name)

pkg:install({
version = dep.version,
force = true,
})
end
local packages = M.get_pkg_list(config)
local is_outdated = mason_util.is_outdated(packages)

if is_outdated then
sync(function()
M.refresh_and_install(packages)
end)
.catch(function(err)
notify.error('Failed to setup nvim-java ' .. tostring(err))
log.error('failed to setup nvim-java ' .. tostring(err))
end)
.run()
end

if is_installing then
mason_ui.open()
notify.warn(
'Please restart the editor after dependency installation is done'
)
end
return is_outdated
end

---Returns true if the package and its expected version is already installed
---@private
---@param pkg_name string name of the package
---@param expc_version string expected version of the package
---@return boolean true if the package and its version is already installed
function M.is_installed(pkg_name, expc_version)
local pkg = mason_reg.get_package(pkg_name)

if not pkg:is_installed() then
return false
end
function M.refresh_and_install(packages)
vim.schedule(function()
mason_ui.open()
notify.warn('Please close and re-open after dependecies are installed')
end)

---@type string | nil
local installed_version
mason_util.refresh_registry()
mason_util.install_pkgs(packages)
end

pkg:get_installed_version(function(ok, version)
if ok then
installed_version = version
end
end)
function M.get_pkg_list(config)
local dependecies = {
{ name = 'jdtls', version = 'v1.29.0' },
{ name = 'java-test', version = '0.40.1' },
{ name = 'java-debug-adapter', version = '0.52.0' },
}

if installed_version == expc_version then
return true
if config.jdk.auto_install then
table.insert(dependecies, { name = 'openjdk-17', version = '17.0.2' })
end

return false
return dependecies
end

return M
80 changes: 80 additions & 0 deletions lua/java/utils/mason.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
local log = require('java.utils.log')
local mason_reg = require('mason-registry')
local async = require('java-core.utils.async')
local await = async.wait_handle_ok

local M = {}

function M.is_available(package_name, package_version)
local has_pkg = mason_reg.has_package(package_name)

if not has_pkg then
return false
end

local has_version = false

local pkg = mason_reg.get_package(package_name)
pkg:get_installed_version(function(success, version)
if success and version == package_version then
has_version = true
end
end)

return has_version
end

function M.is_installed(package_name, package_version)
local pkg = mason_reg.get_package(package_name)
local is_installed = pkg:is_installed()

if not is_installed then
return false
end

local installed_version
pkg:get_installed_version(function(ok, version)
if not ok then
return
end

installed_version = version
end)

return installed_version == package_version
end

function M.is_outdated(packages)
for _, pkg in ipairs(packages) do
if not M.is_available(pkg.name, pkg.version) then
return true
end

if not M.is_installed(pkg.name, pkg.version) then
return true
end
end
end

function M.refresh_registry()
await(function(callback)
mason_reg.update(callback)
end)
end

function M.install_pkgs(packages)
log.info('check mason dependecies')

for _, dep in ipairs(packages) do
if not M.is_installed(dep.name, dep.version) then
local pkg = mason_reg.get_package(dep.name)

pkg:install({
version = dep.version,
force = true,
})
end
end
end

return M