Skip to content

Commit 0bc6929

Browse files
committed
Add new commands for deobfuscating and much more
2 parents 30c3d58 + 2c318d0 commit 0bc6929

6 files changed

Lines changed: 889 additions & 213 deletions

File tree

README.md

Lines changed: 85 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,39 @@
22

33
A lightweight Neovim plugin written in Lua for quickly navigating printed Java stack traces and creating new Java files (Classes, Interfaces, Enums, Records, etc.) with the correct package declaration automatically determined from the current buffer or file explorer context.
44

5-
## **✨ Features**
5+
<!-- toc -->
6+
7+
- [Features](#features)
8+
* [Java Stack Trace Navigation](#java-stack-trace-navigation)
9+
* [New File Creation](#new-file-creation)
10+
- [Demos](#demos)
11+
* [Selecting a line from a stack trace using Snacks picker](#selecting-a-line-from-a-stack-trace-using-snacks-picker)
12+
* [Deobfuscate a stack trace in place in a log file](#deobfuscate-a-stack-trace-in-place-in-a-log-file)
13+
* [Create a new Java class in same package as current Java file](#create-a-new-java-class-in-same-package-as-current-java-file)
14+
* [Create a new type in the same package as current Java file](#create-a-new-type-in-the-same-package-as-current-java-file)
15+
- [Installation and Configuration](#installation-and-configuration)
16+
* [lazy.nvim](#lazynvim)
17+
- [Usage](#usage)
18+
* [**1\. Interactive File Creation**](#1-interactive-file-creation)
19+
* [**2\. Direct File Creation (Using Arguments)**](#2-direct-file-creation-using-arguments)
20+
- [**🔧 Configuration**](#%F0%9F%94%A7-configuration)
21+
* [**Template Placeholders**](#template-placeholders)
22+
23+
<!-- tocstop -->
24+
25+
## Features
626

727
### Java Stack Trace Navigation
828

929
* Ability to jump to any line in a stack trace
10-
* Supports nested Java exceptions
30+
* Supports nested Java exceptions so that navigation works in actual call order (not printed order)
1131
* Use Snacks picker to select a line from stack trace
1232
* All commands can get stack trace from current buffer (default) or a vim register (e.g '+' for system clipboard) if provided as extra argument to command
1333
* Commands to quickly navigate up and down or to the top or bottom of the stack trace
34+
* Commands to go to next and previous stack trace (e.g when viewing a log file)
1435
* Send stack trace to quickfix list
1536
* Supports jdtls or java_language_server LSP in order to look up file path from class name
16-
17-
![Java Stack Picker](https://github.com/NickJAllen/resources/blob/main/java-helpers/java-stack-picker.gif)
37+
* Quickly and easily deobfuscate stack traces (in place, on the clipboard, or just directly use the obfuscated one and it's deobfuscated automatically for you)
1838

1939
### New File Creation
2040

@@ -24,18 +44,43 @@ A lightweight Neovim plugin written in Lua for quickly navigating printed Java s
2444
* **Customizable:** Easily override built-in templates or define your own custom templates.
2545
* **LSP Formatting:** Automatically formats the newly created file using the attached Language Server (via vim.lsp.buf.format()) if configured.
2646

27-
## **⚙️ Installation**
47+
## Demos
48+
49+
### Selecting a line from a stack trace using Snacks picker
50+
51+
Demonstation of the ":JavaHelpersPickStackTraceLine" command:
52+
53+
![Java Stack Picker](https://github.com/NickJAllen/resources/blob/main/java-helpers/java-stack-picker.gif)
54+
55+
### Deobfuscate a stack trace in place in a log file
56+
57+
Demonstation of the ":JavaHelpersDeobfuscate" command:
58+
59+
![Inplace Stack Deobfuscation](https://github.com/NickJAllen/resources/blob/main/java-helpers/inplace-stack-deobfuscation.gif)
60+
61+
### Create a new Java class in same package as current Java file
62+
63+
Demonstation of the ":JavaHelpersNewFile Class"
64+
65+
![New Class Creation](https://github.com/NickJAllen/resources/blob/main/java-helpers/new-class-creation.gif)
66+
67+
### Create a new type in the same package as current Java file
68+
69+
Demonstation of the ":JavaHelpersNewFile"
70+
71+
![Java Stack Picker](https://github.com/NickJAllen/resources/blob/main/java-helpers/new-type-creation.gif)
72+
73+
## Installation and Configuration
2874

2975
Use your favorite package manager.
3076

31-
### **lazy.nvim**
77+
### lazy.nvim
3278

3379
An example for lazy.nvim with some quick key bindings to navigate Java stack traces and to create Java files:
3480

3581
```
36-
{
82+
{
3783
'NickJAllen/java-helpers.nvim',
38-
3984
cmd = {
4085
'JavaHelpersNewFile',
4186
'JavaHelpersPickStackTraceLine',
@@ -44,58 +89,74 @@ An example for lazy.nvim with some quick key bindings to navigate Java stack tra
4489
'JavaHelpersGoDownStackTrace',
4590
'JavaHelpersGoToBottomOfStackTrace',
4691
'JavaHelpersGoToTopOfStackTrace',
92+
'JavaHelpersGoToNextStackTrace',
93+
'JavaHelpersGoToPrevStackTrace',
4794
'JavaHelpersSendStackTraceToQuickfix',
95+
'JavaHelpersDeobfuscate',
96+
'JavaHelpersSelectObfuscationFile',
97+
'JavaHelpersForgetObfuscationFile',
4898
},
4999
50-
-- Default options are shown here. If opts is missing or left empty then these defaults will be used.
100+
---@type JavaHelpers.Config
51101
opts = {
52-
102+
new_file = {
53103
---Each template has a name and some template source code.
54104
---${package_decl} and ${name} will be replaced with the package declaration and name for the Java type being created.
55105
---If ${pos} is provided then the cursor will be positioned there ready to type.
56-
---@type TemplateDefinition[]
57106
templates = {},
58107
59108
---Defines patters to recognize Java source directories in order to determine the package name.
60-
---@type string[]
61-
java_source_dirs = { "src/main/java", "src/test/java", "src" },
109+
java_source_dirs = { 'src/main/java', 'src/test/java', 'src' },
62110
63111
---If true then newly created Java files will be formatted
64-
---@type boolean
65112
should_format = true,
66-
},
113+
},
67114
68-
-- Example keys - change these as you like
115+
stack_trace = {
116+
--Command that is used to deobfuscate stack traces
117+
deobfuscate_command = 'retrace',
118+
119+
--Directory that will be used to select an obfuscation mapping file, if nil or empty the current directory will be used
120+
obfuscation_mappings_dir = vim.uv.os_homedir() .. '/.obfuscation',
121+
},
122+
},
69123
keys = {
124+
-- New file creation
70125
{ '<leader>jn', ':JavaHelpersNewFile<cr>', desc = 'New Java Type' },
71126
{ '<leader>jc', ':JavaHelpersNewFile Class<cr>', desc = 'New Java Class' },
72127
{ '<leader>ji', ':JavaHelpersNewFile Interface<cr>', desc = 'New Java Interface' },
73128
{ '<leader>ja', ':JavaHelpersNewFile Abstract Class<cr>', desc = 'New Abstract Java Class' },
74129
{ '<leader>jr', ':JavaHelpersNewFile Record<cr>', desc = 'New Java Record' },
75130
{ '<leader>je', ':JavaHelpersNewFile Enum<cr>', desc = 'New Java Enum' },
76-
{ '<leader>jp', ':JavaHelpersPickStackTraceLine<cr>', desc = 'Pick Java stack trace line' },
77-
{ '<leader>jP', ':JavaHelpersPickStackTraceLine +<cr>', desc = 'Pick Java stack trace line from clipboard' },
131+
132+
-- Stack trace navigation
78133
{ '<leader>jg', ':JavaHelpersGoToStackTraceLine<cr>', desc = 'Go to Java stack trace line' },
79-
{ '<leader>jG', ':JavaHelpersGoToStackTraceLine +<cr>', desc = 'Go to Java stack trace line on clipboard' },
134+
{ '<leader>jG', ':JavaHelpersGoToStackTraceLine +<cr>', desc = 'Go to Java stack trace line on Clipboard' },
135+
{ '<leader>jp', ':JavaHelpersPickStackTraceLine<cr>', desc = 'Pick Java stack trace line' },
136+
{ '<leader>jP', ':JavaHelpersPickStackTraceLine +<cr>', desc = 'Pick Java stack trace line from Clipboard' },
80137
{ '[j', ':JavaHelpersGoUpStackTrace<cr>', desc = 'Go up Java stack trace' },
81138
{ ']j', ':JavaHelpersGoDownStackTrace<cr>', desc = 'Go down Java stack trace' },
139+
{ '[J', ':JavaHelpersGoToPrevStackTrace<cr>', desc = 'Go to previous Java stack trace' },
140+
{ ']J', ':JavaHelpersGoToNextStackTrace<cr>', desc = 'Go to next Java stack trace' },
82141
{ '<leader>jt', ':JavaHelpersGoToTopOfStackTrace<cr>', desc = 'Go to top of Java stack trace' },
83142
{ '<leader>jb', ':JavaHelpersGoToBottomOfStackTrace<cr>', desc = 'Go to bottom of Java stack trace' },
84143
{ '<leader>jq', ':JavaHelpersSendStackTraceToQuickfix<cr>', desc = 'Send Java stack trace to quickfix list' },
85-
{ '<leader>jQ', ':JavaHelpersSendStackTraceToQuickfix +<cr>', desc = 'Send Java stack trace on clipboard to quickfix list' },
144+
{ '<leader>jd', ':JavaHelpersDeobfuscate<cr>', desc = 'Deofuscate Java stack trace' },
145+
{ '<leader>jD', ':JavaHelpersDeobfuscate +<cr>', desc = 'Deofuscate Java stack trace on Clipboard' },
146+
{ '<leader>jo', ':JavaHelpersSelectObfuscationFile<cr>', desc = 'Select obfuscation file' },
86147
},
87-
88148
dependencies = {
89149
'nvim-lua/plenary.nvim',
90150
91-
-- This is only needed if you want to use the JavaHelpersPickStackTraceLine command (but highly recommended)
151+
-- This is only needed if you want to use the JavaHelpersPickStackTraceLine or JavaHelpersSelectObfuscationFile commands (but highly recommended)
92152
'folke/snacks.nvim',
93153
},
94-
},
154+
}
155+
95156
96157
```
97158

98-
## **🚀 Usage**
159+
## Usage
99160

100161
The plugin exposes the following user commands:
101162

lua/java-helpers/init.lua

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
local M = {}
22

3+
---@class JavaHelpers.Config
4+
---@field new_file JavaHelpers.NewFileConfig?
5+
---@field stack_trace JavaHelpers.StackTraceConfig?
6+
37
local new_file = require("java-helpers.new-file")
48
local stack_trace = require("java-helpers.stack-trace")
59

610
---Should be called to initialize this plug-in
7-
---@param opts table|nil User-provided configuration to override defaults.
11+
---@param opts JavaHelpers.Config? User-provided configuration to override defaults.
812
function M.setup(opts)
9-
new_file.setup(opts)
10-
stack_trace.setup(opts)
13+
new_file.setup(opts and opts.new_file or {})
14+
stack_trace.setup(opts and opts.stack_trace or {})
1115
end
1216

1317
M.create_java_file = new_file.create_java_file

lua/java-helpers/new-file.lua

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ local M = {}
33
local utils = require("java-helpers.utils")
44
local log = utils.log
55

6-
---@class TemplateDefinition
6+
---@class JavaHelpers.TemplateDefinition
77
---@field name string The name of the template
88
---@field template string The source of the template
99

1010
---Bult-in templates - these can't be deleted but they can be overridden
11-
---@type TemplateDefinition[]
11+
---@type JavaHelpers.TemplateDefinition[]
1212
local builtin_templates = {
1313
{
1414
name = "Class",
@@ -48,27 +48,31 @@ local builtin_templates = {
4848
},
4949
}
5050

51+
---@class JavaHelpers.NewFileConfig
52+
---@field templates JavaHelpers.TemplateDefinition[]
53+
---@field java_source_dirs string[]
54+
---@field should_format boolean
55+
---
5156
-- Default configuration
57+
---@type JavaHelpers.NewFileConfig
5258
local default_config = {
5359
---Each template has a name and some template source code.
5460
---${package_decl} and ${name} will be replaced with the package declaration and name for the Java type being created.
5561
---If ${pos} is provided then the cursor will be positioned there ready to type.
56-
---@type TemplateDefinition[]
5762
templates = {},
5863

5964
---Defines patters to recognize Java source directories in order to determine the package name.
60-
---@type string[]
6165
java_source_dirs = { "src/main/java", "src/test/java", "src" },
6266

6367
---If true then newly created Java files will be formatted
64-
---@type boolean
6568
should_format = true,
6669
}
6770

71+
---@type JavaHelpers.NewFileConfig
6872
local config = {}
6973

7074
---All defined templates with name as the key and the template source as the value
71-
---@type table<string, TemplateDefinition>
75+
---@type table<string, JavaHelpers.TemplateDefinition>
7276
local all_templates = {}
7377

7478
---All template names defined in order
@@ -192,7 +196,7 @@ end
192196

193197
---Given the name of a template, looks up the template source or nil if not found
194198
---@param template_name string
195-
---@return TemplateDefinition|nil template_definition The template source or nil if not found
199+
---@return JavaHelpers.TemplateDefinition|nil template_definition The template source or nil if not found
196200
local function get_template(template_name)
197201
local name_lower = string.lower(template_name)
198202

@@ -264,7 +268,7 @@ local function create_java_file(template, name, source_dir, package_name)
264268
end
265269

266270
---Adds a new template with the supplied definition
267-
---@param template_definition TemplateDefinition
271+
---@param template_definition JavaHelpers.TemplateDefinition
268272
local function add_template(template_definition)
269273
local name_lower = string.lower(template_definition.name)
270274
local is_new_template = all_templates[name_lower] == nil
@@ -277,7 +281,7 @@ local function add_template(template_definition)
277281
end
278282

279283
---Adds a template from a template definition (a lua table with name and template keys)
280-
---@param template_definition TemplateDefinition
284+
---@param template_definition JavaHelpers.TemplateDefinition
281285
function M.add_template(template_definition)
282286
local name = template_definition.name
283287

@@ -297,7 +301,7 @@ function M.add_template(template_definition)
297301
end
298302

299303
---Adds some new templates.
300-
---@param templates TemplateDefinition[] Template definitions to add
304+
---@param templates JavaHelpers.TemplateDefinition[] Template definitions to add
301305
function M.add_templates(templates)
302306
for _, template_definition in ipairs(templates) do
303307
M.add_template(template_definition)
@@ -414,7 +418,7 @@ function M.create_java_file(template_name, type_name)
414418
end
415419

416420
---Should be called to initialize this plug-in
417-
---@param opts table|nil User-provided configuration to override defaults.
421+
---@param opts JavaHelpers.NewFileConfig? User-provided configuration to override defaults.
418422
function M.setup(opts)
419423
config = vim.tbl_deep_extend("force", default_config, opts or {})
420424

0 commit comments

Comments
 (0)