diff --git a/ftplugin/java.lua b/ftplugin/java.lua index 321d15e..ed45e4a 100644 --- a/ftplugin/java.lua +++ b/ftplugin/java.lua @@ -1,6 +1,50 @@ local nvim_jdtls = require("jdtls") nvim_jdtls.start_or_attach({ - cmd = { 'jdtls' }, - root_dir = vim.fs.dirname(vim.fs.find({'.gradlew', '.git', 'mvnw'}, {upward = true})[1]), + cmd = { 'jdtls' }, + root_dir = vim.fs.dirname(vim.fs.find({'.gradlew', '.git', 'mvnw'}, {upward = true})[1]), }) require('keybinds'):set_lsp_keys({buffer = 0}) + +-- Allow decompiling classes coming from the language server too +vim.api.nvim_create_user_command( + 'Javap', + function(args) + local fname = vim.api.nvim_buf_get_name(0) + if vim.startswith(fname, "jdt://") then + local _, _, classpath_raw, classname_raw = string.find(fname, "jdt://.+?=%a+/(.+).jar=/.+,test=/(.+)%.class.*") + local classpath = classpath_raw:gsub("%%5C", "") .. '.jar' + local classname = classname_raw:gsub("%%3C", ""):gsub("%(", ".") + vim.fn.jobstart( + {'javap', '-c', '--class-path', classpath, classname}, + { + width = 1024, + stdout_buffered = true, + on_stdout = function(_, data, _) + local buf = vim.api.nvim_create_buf(false, true) + vim.api.nvim_buf_set_text(buf, 0, 0, 0, 0, data) + vim.api.nvim_buf_set_option(buf, 'ft', 'asm') + if args.bang then + local width = vim.fn.winwidth(0) + local height = vim.fn.winheight(0) + vim.api.nvim_open_win(buf, true, { + relative='win', + row = 5, + col = 10, + width=width - 20, + height=height - 10, + border="single", + zindex=100, -- TODO hardcoded? + }) + else + vim.api.nvim_win_set_buf(0, buf) + vim.api.nvim_win_set_cursor(buf, { 1, 0 }) + end + end + } + ) + else + require('jdtls').javap() + end + end, + { bang=true } +)