Skip to content

Commit fddfeb8

Browse files
committed
test,docs,ci: real test suite, checkhealth, vimdoc, CI refresh
- replace empty spec with real tests: setup/config merge and g: bridge, mapping install guard, chains queue, regular_imports persistence, per-project settings roundtrip - add :checkhealth jc - layer-aware checks: jdtls client present, organizeImports and java-debug commands advertised, optional integrations, treesitter parser, data dir permissions - add doc/jc.txt vimdoc - CI: checkout@v4, stylua-action@v4, luacheck job; .luacheckrc and .luarc.json - README: comparison vs plain nvim-jdtls, mappings table matching the actual defaults
1 parent db82708 commit fddfeb8

12 files changed

Lines changed: 514 additions & 40 deletions

File tree

.github/workflows/default.yml

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,22 @@ jobs:
77
name: stylua
88
runs-on: ubuntu-latest
99
steps:
10-
- uses: actions/checkout@v2
11-
- uses: JohnnyMorganz/stylua-action@1.0.0
10+
- uses: actions/checkout@v4
11+
- uses: JohnnyMorganz/stylua-action@v4
1212
with:
1313
token: ${{ secrets.GITHUB_TOKEN }}
14+
version: latest
1415
args: --color always --check lua
1516

17+
luacheck:
18+
name: luacheck
19+
runs-on: ubuntu-latest
20+
steps:
21+
- uses: actions/checkout@v4
22+
- uses: lunarmodules/luacheck@v1
23+
with:
24+
args: lua tests
25+
1626
test:
1727
runs-on: ubuntu-latest
1828
strategy:
@@ -21,7 +31,7 @@ jobs:
2131
name: test
2232
steps:
2333
- name: checkout
24-
uses: actions/checkout@v2
34+
uses: actions/checkout@v4
2535

2636
- uses: rhysd/action-setup-vim@v1
2737
with:

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
vendor/plenary.nvim
22
.vimrc
3+
doc/tags
4+
.claude/

.luacheckrc

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
std = "luajit"
2+
cache = true
3+
codes = true
4+
5+
read_globals = {
6+
"vim",
7+
}
8+
9+
files["tests/**/*_spec.lua"] = {
10+
read_globals = {
11+
"describe",
12+
"it",
13+
"before_each",
14+
"after_each",
15+
"assert",
16+
},
17+
}
18+
19+
-- long lines are stylua's business
20+
max_line_length = false

.luarc.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"$schema": "https://raw.githubusercontent.com/LuaLS/vscode-lua/master/setting/schema.json",
3+
"runtime.version": "LuaJIT",
4+
"workspace.library": ["$VIMRUNTIME/lua"],
5+
"workspace.checkThirdParty": false,
6+
"diagnostics.globals": ["vim", "describe", "it", "before_each", "after_each", "assert"]
7+
}

README.md

Lines changed: 36 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,23 @@ The legacy `g:jc_default_mappings`, `g:jc_autoformat_on_save`,
7272
`g:jc_debug_backend` and `g:jc_basedir` variables still work as a
7373
fallback when the corresponding option is not passed to `setup`.
7474

75+
## What it adds over plain nvim-jdtls
76+
77+
| Feature | nvim-jdtls | jc.nvim |
78+
|---|---|---|
79+
| Code generation (toString/equals/hashCode/constructors/accessors) | via code actions | dedicated commands and mappings with field selection |
80+
| Organize imports | code action | smart mode remembering preferred classes per project |
81+
| Debug attach | manual dap config | `JCdebugAttach` with per-project host/port memory, dap or vimspector |
82+
| Class creation from templates || `JCgenerateClass` prompt DSL |
83+
| Extract refactorings | yes | reused from nvim-jdtls when installed |
84+
85+
`:checkhealth jc` verifies the setup; `:help jc` for full docs.
86+
7587
## Commands
7688

77-
- `JCdebugAttach` – start debug session with vimspector attaching to debug port;
78-
- `JCdebugLaunch` – start debug session with vimspector executing main class;
89+
- `JCdebugAttach` – attach debugger (nvim-dap or vimspector, see `debug_backend`);
90+
- `JCdebugLaunch` – launch debug session;
91+
- `JCdapAttach` / `JCvimspectorAttach` – attach using a specific backend;
7992
- `JCdebugWithConfig` – start debug session using predefined vimspector's configuration;
8093
- `JCimportsOrganizeSmart` – automatically organize imports using regular classes list;
8194
- `JCimportsOrganize` – automatically organize imports choosing from available classes list;
@@ -102,34 +115,27 @@ Using `nvim-jdtls`:
102115

103116
## Default mappings
104117

105-
```lua
106-
vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>ji", "<cmd>lua require('jc.jdtls').organize_imports(bufnr, true)<CR>", opts)
107-
vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>jI", "<cmd>lua require('jc.jdtls').organize_imports(bufnr, false)<CR>", opts)
108-
vim.api.nvim_buf_set_keymap(bufnr, "i", "<C-j>i", "<cmd>lua require('jc.jdtls').organize_imports(bufnr, false)<CR>", opts)
109-
vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>jts", "<cmd>lua require('jc.jdtls').generate_toString()<CR>", opts)
110-
vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>jeq", "<cmd>lua require('jc.jdtls').generate_hashCodeAndEquals()<CR>", opts)
111-
112-
vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>jA", "<cmd>lua require('jc.jdtls').generate_accessors()<CR>", opts)
113-
vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>js", "<cmd>lua require('jc.jdtls').generate_accessor('s')<CR>", opts)
114-
vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>jg", "<cmd>lua require('jc.jdtls').generate_accessor('g')<CR>", opts)
115-
vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>ja", "<cmd>lua require('jc.jdtls').generate_accessor('gs')<CR>", opts)
116-
vim.api.nvim_buf_set_keymap(bufnr, "i", "<C-j>s", "<cmd>lua require('jc.jdtls').generate_accessor('s')<CR>", opts)
117-
vim.api.nvim_buf_set_keymap(bufnr, "i", "<C-j>g", "<cmd>lua require('jc.jdtls').generate_accessor('g')<CR>", opts)
118-
vim.api.nvim_buf_set_keymap(bufnr, "i", "<C-j>a", "<cmd>lua require('jc.jdtls').generate_accessor('sg')<CR>", opts)
119-
120-
vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>jc", "<cmd>lua require('jc.jdtls').generate_constructor(nil, nil, {default = false})<CR>", opts)
121-
vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>jcc", "<cmd>lua require('jc.jdtls').generate_constructor(nil, nil, {default = true})<CR>", opts)
122-
123-
vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>jam", "<cmd>lua require('jc.jdtls').generate_abstractMethods()<CR>", opts)
124-
vim.api.nvim_buf_set_keymap(bufnr, "i", "<C-j>am", "<cmd>lua require('jc.jdtls').generate_abstractMethods()<CR>", opts)
125-
126-
vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>jda", "<cmd>lua require('jc.vimspector').debug_attach()<CR>", opts)
127-
128-
-- using `jdtls`
129-
vim.api.nvim_buf_set_keymap(bufnr, "v", "<leader>jre", "<Esc><Cmd>lua require('jdtls').extract_variable(true)<CR>", opts)
130-
vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>jre", "<Cmd>lua require('jdtls').extract_variable()<CR>", opts)
131-
vim.api.nvim_buf_set_keymap(bufnr, "v", "<leader>jrm", "<Esc><Cmd>lua require('jdtls').extract_method(true)<CR>", opts)
132-
```
118+
Installed on jdtls attach when `default_mappings` is enabled. `<p>` is
119+
`keys_prefix` (default `<leader>j`).
120+
121+
| Mode | Keys | Action |
122+
|---|---|---|
123+
| n | `<p>i` | organize imports (smart) |
124+
| n | `<p>I` | organize imports (manual selection) |
125+
| i | `<C-j>i` | organize imports |
126+
| n | `<p>ts` | generate `toString()` |
127+
| n | `<p>eq` | generate `hashCode()` and `equals()` |
128+
| n | `<p>A` | generate accessors (field selection) |
129+
| n | `<p>s` / `<p>g` | generate setter / getter |
130+
| n | `<leader>ja` | generate getter and setter |
131+
| i | `<C-j>s` / `<C-j>g` / `<C-j>a` | accessor generation |
132+
| n | `<p>c` | generate constructor (field selection) |
133+
| n | `<p>cc` | generate default constructor |
134+
| n | `<p>m`, i `<C-j>m` | generate abstract methods |
135+
| n | `<p>n` | new class prompt |
136+
| n | `<p>da` / `<p>dl` | debug attach / launch |
137+
| v | `<p>re` / `<p>rm` | extract variable / method (nvim-jdtls) |
138+
| n | `<leader>jre` | extract variable (nvim-jdtls) |
133139

134140
## Class creation
135141

doc/jc.txt

Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
*jc.txt* Java code generation layer over an external jdtls
2+
3+
Author: Artur Shaik
4+
License: same as the plugin repository
5+
6+
==============================================================================
7+
CONTENTS *jc-contents*
8+
9+
1. Introduction ........................... |jc-introduction|
10+
2. Requirements ........................... |jc-requirements|
11+
3. Setup .................................. |jc-setup|
12+
4. Commands ............................... |jc-commands|
13+
5. Mappings ............................... |jc-mappings|
14+
6. Debugging .............................. |jc-debug|
15+
7. Class creation ......................... |jc-class-creation|
16+
8. Health ................................. |jc-health|
17+
18+
==============================================================================
19+
1. INTRODUCTION *jc-introduction*
20+
21+
jc.nvim is a layer on top of an externally managed Eclipse JDT language
22+
server (jdtls). It never starts or installs the server itself — it hooks
23+
into whatever `jdtls` LSP client attaches (nvim-java, nvim-jdtls,
24+
nvim-lspconfig) and provides:
25+
26+
- organize imports with smart selection of remembered classes;
27+
- code generation: `toString`, `hashCode`/`equals`, constructors,
28+
accessors, with interactive field selection;
29+
- adding unimplemented (abstract) methods;
30+
- debug attach/launch via nvim-dap or vimspector with per-project
31+
host/port memory;
32+
- decompiled `jdt://` class contents view;
33+
- template-based class creation (|jc-class-creation|).
34+
35+
==============================================================================
36+
2. REQUIREMENTS *jc-requirements*
37+
38+
- Neovim >= 0.10 (0.11+ recommended);
39+
- a running jdtls managed by nvim-java, nvim-jdtls or lspconfig. The
40+
server must be started with `extendedClientCapabilities` — notably
41+
`executeClientCommandSupport` and `advancedOrganizeImportsSupport`.
42+
nvim-java and nvim-jdtls do this out of the box;
43+
- for debug attach/launch: the java-debug bundle loaded into jdtls
44+
(nvim-java bundles it; with nvim-jdtls add it to
45+
`init_options.bundles`) and nvim-dap or vimspector installed;
46+
- optional nvim-jdtls for extract refactorings and `JCutil*` commands.
47+
48+
==============================================================================
49+
3. SETUP *jc-setup*
50+
51+
Call `setup` (or use the `opts` table of lazy.nvim): >lua
52+
53+
require("jc").setup({
54+
keys_prefix = "<leader>j", -- prefix for default mappings
55+
default_mappings = true, -- install default mappings on attach
56+
autoformat_on_save = false, -- format java buffers on save
57+
debug_backend = nil, -- "dap" | "vimspector" | nil = auto
58+
basedir = nil, -- data dir, ~/.local/share/jc.nvim
59+
on_attach = nil, -- function(client, bufnr) extra hook
60+
})
61+
<
62+
*jc-legacy-vars*
63+
The legacy global variables `g:jc_default_mappings`,
64+
`g:jc_autoformat_on_save`, `g:jc_debug_backend` and `g:jc_basedir` are
65+
still honored as a fallback when the corresponding option is not passed
66+
to `setup`.
67+
68+
If `setup` is never called, opening a java file initializes the plugin
69+
with defaults.
70+
71+
==============================================================================
72+
4. COMMANDS *jc-commands*
73+
74+
:JCimportsOrganizeSmart organize imports, auto-pick remembered
75+
candidates
76+
:JCimportsOrganize organize imports with manual selection
77+
:JCgenerateToString generate toString() with field selection
78+
:JCgenerateHashCodeAndEquals generate hashCode() and equals()
79+
:JCgenerateAccessors choose fields for accessors generation
80+
:JCgenerateAccessorGetter generate getter for a field
81+
:JCgenerateAccessorSetter generate setter for a field
82+
:JCgenerateAccessorSetterGetter generate getter and setter
83+
:JCgenerateConstructorDefault generate no-arg constructor
84+
:JCgenerateConstructor choose fields for constructor
85+
:JCgenerateAbstractMethods generate unimplemented methods
86+
:JCgenerateClass start class generation prompt
87+
:JCtoggleAutoformat toggle autoformat on save
88+
:JCdebugAttach attach debugger (dap or vimspector)
89+
:JCdebugLaunch launch debug session
90+
:JCdapAttach attach via nvim-dap explicitly
91+
:JCvimspectorAttach attach via vimspector explicitly
92+
:JCdebugWithConfig choose a vimspector configuration
93+
94+
With nvim-jdtls installed:
95+
96+
:JCrefactorExtractVar extract variable
97+
:JCrefactorExtractMethod extract method
98+
:JCutilJshell run java shell
99+
:JCutilBytecode show bytecode for current class
100+
:JCutilJol analyze object layout (jol)
101+
:JCutilUpdateConfig update project configuration
102+
103+
==============================================================================
104+
5. MAPPINGS *jc-mappings*
105+
106+
Installed on jdtls attach when `default_mappings` is enabled. `<p>` is
107+
`keys_prefix` (default `<leader>j`).
108+
109+
n <p>i organize imports (smart)
110+
n <p>I organize imports (manual selection)
111+
i <C-j>i organize imports
112+
n <p>ts generate toString()
113+
n <p>eq generate hashCode() and equals()
114+
n <p>A generate accessors (field selection)
115+
n <p>s generate setter
116+
n <p>g generate getter
117+
n <leader>ja generate getter and setter
118+
i <C-j>s / <C-j>g / <C-j>a accessor generation
119+
n <p>c generate constructor (field selection)
120+
n <p>cc generate default constructor
121+
n <p>m generate abstract methods
122+
i <C-j>m generate abstract methods
123+
n <p>n new class prompt
124+
n <p>da debug attach
125+
n <p>dl debug launch
126+
127+
With nvim-jdtls:
128+
129+
v <p>re extract variable
130+
n <leader>jre extract variable
131+
v <p>rm extract method
132+
133+
==============================================================================
134+
6. DEBUGGING *jc-debug*
135+
136+
`JCdebugAttach`/`JCdebugLaunch` route to a backend:
137+
138+
1. `debug_backend` option / `g:jc_debug_backend` if set
139+
("dap" or "vimspector");
140+
2. auto: nvim-dap installed and vimspector absent -> dap;
141+
3. fallback: vimspector.
142+
143+
Attach asks for host and port (defaults remembered per project under
144+
the data dir). The adapter port is resolved from jdtls via
145+
`vscode.java.startDebugSession`, which requires the java-debug bundle.
146+
147+
==============================================================================
148+
7. CLASS CREATION *jc-class-creation*
149+
150+
Prompt scheme: >
151+
152+
template:[subdir]:/package.ClassName extends Super implements If(String s, public Integer i):constructor:toString:equals
153+
<
154+
- template (optional): junit, interface, exception, servlet, ...;
155+
- subdir (optional): e.g. test, androidTest;
156+
- class name and package; with `/` parent package backsearch is used;
157+
- extends/implements classes are imported automatically;
158+
- field list: `private` by default, modifiers can be given;
159+
- trailing flags: constructor, toString, equals, hashCode.
160+
161+
==============================================================================
162+
8. HEALTH *jc-health*
163+
164+
Run `:checkhealth jc` to verify: neovim version, attached jdtls client,
165+
organize-imports and java-debug availability, optional integrations
166+
(nvim-jdtls, nvim-dap/vimspector), treesitter java parser and data dir
167+
permissions.
168+
169+
vim:tw=78:ts=8:noet:ft=help:norl:

0 commit comments

Comments
 (0)