Skip to content

Commit 3bc1912

Browse files
committed
transformer
1 parent e5b11f5 commit 3bc1912

File tree

10 files changed

+102
-272
lines changed

10 files changed

+102
-272
lines changed

build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ dependencies {
5757
implementation 'org.tinylog:tinylog-impl:2.7.0'
5858
implementation 'net.fabricmc:mapping-io:0.7.1'
5959
implementation 'zone.rong:imaginebreaker:2.1'
60+
implementation 'com.fifesoft:languagesupport:3.4.0'
61+
implementation 'com.fifesoft:autocomplete:3.3.2'
6062
}
6163

6264
test {
@@ -77,6 +79,7 @@ shadowJar {
7779
include(dependency('org.vineflower:vineflower'))
7880
include(dependency('net.fabricmc:mapping-io'))
7981
include(dependency('zone.rong:imaginebreaker'))
82+
include(dependency('com.fifesoft:.*'))
8083
}
8184
archiveClassifier.set('')
8285
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package cn.enaium.joe.api.transformer;
2+
3+
import org.objectweb.asm.tree.ClassNode;
4+
5+
@FunctionalInterface
6+
public interface IClassTransformer {
7+
boolean transform(ClassNode classNode);
8+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package cn.enaium.joe.dialog;
2+
3+
import cn.enaium.joe.JavaOctetEditor;
4+
import cn.enaium.joe.api.transformer.IClassTransformer;
5+
import cn.enaium.joe.gui.panel.CodeAreaPanel;
6+
import cn.enaium.joe.util.LangUtil;
7+
import cn.enaium.joe.util.MessageUtil;
8+
import cn.enaium.joe.util.classes.ASMClassLoader;
9+
import cn.enaium.joe.util.compiler.Compiler;
10+
import cn.enaium.joe.util.event.events.EditSaveSuccessEvent;
11+
import org.fife.ui.rsyntaxtextarea.SyntaxConstants;
12+
13+
import java.awt.*;
14+
import java.awt.event.MouseAdapter;
15+
import java.awt.event.MouseEvent;
16+
import java.io.StringWriter;
17+
import java.lang.reflect.InvocationTargetException;
18+
19+
public class TransformClassDialog extends Dialog {
20+
protected CodeAreaPanel codeAreaPanel = new CodeAreaPanel();
21+
protected Button button;
22+
public TransformClassDialog() {
23+
super(LangUtil.i18n("menu.attach.transform"));
24+
setLayout(new BorderLayout());
25+
setSize(700, 400);
26+
add(codeAreaPanel, BorderLayout.CENTER);
27+
codeAreaPanel.getTextArea().setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);
28+
codeAreaPanel.getTextArea().setEditable(true);
29+
String hex = Long.toHexString(System.nanoTime());
30+
String className = "Transformer" + hex.substring(Math.max(0, hex.length() - 12));
31+
String stringBuilder =
32+
"import org.objectweb.asm.*;\n" +
33+
"import org.objectweb.asm.tree.*;\n" +
34+
"public class " + className + " implements Opcodes, cn.enaium.joe.api.transformer.IClassTransformer{\n" +
35+
" public boolean transform(ClassNode classNode) {\n" +
36+
" return false;\n" +
37+
" }\n" +
38+
"}";
39+
codeAreaPanel.getTextArea().setText(stringBuilder);
40+
add(button = new Button(LangUtil.i18n("button.edit")), BorderLayout.SOUTH);
41+
button.addMouseListener(new MouseAdapter() {
42+
@Override
43+
public void mouseClicked(MouseEvent e) {
44+
StringWriter errorTracer = new StringWriter();
45+
byte[] dumpClazz = Compiler.compileSingle(className, codeAreaPanel.getTextArea().getText(), errorTracer);
46+
if (dumpClazz == null) {
47+
MessageUtil.error(errorTracer.toString());
48+
}
49+
try {
50+
final IClassTransformer iClassTransformer = (IClassTransformer) new ASMClassLoader().defineClass(className, dumpClazz).getConstructor().newInstance();
51+
JavaOctetEditor.getInstance().getJar().getClasses()
52+
.forEach(classNode -> {
53+
if (iClassTransformer.transform(classNode.getNodeInternal())) {
54+
classNode.mkdir();
55+
EditSaveSuccessEvent.trigger(classNode.getInternalName());
56+
}
57+
});
58+
} catch (InstantiationException | IllegalAccessException | InvocationTargetException |
59+
NoSuchMethodException ex) {
60+
MessageUtil.error("Error at transform", ex);
61+
}
62+
MessageUtil.info(LangUtil.i18n("success"));
63+
}
64+
});
65+
}
66+
}

src/main/java/cn/enaium/joe/gui/panel/file/tabbed/tab/classes/ASMifierTablePanel.java

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -46,27 +46,11 @@ public ASMifierTablePanel(ClassNode classNode) {
4646
try {
4747
String className = "ASMifier" + Integer.toHexString(classNode.getInternalName().hashCode()) + Integer.toHexString(getTextArea().getText().hashCode());
4848
String stringBuilder =
49-
"import org.objectweb.asm.AnnotationVisitor;" +
50-
"import org.objectweb.asm.Attribute;" +
51-
"import org.objectweb.asm.ClassReader;" +
52-
"import org.objectweb.asm.ClassWriter;" +
53-
"import org.objectweb.asm.ConstantDynamic;" +
54-
"import org.objectweb.asm.FieldVisitor;" +
55-
"import org.objectweb.asm.Handle;" +
56-
"import org.objectweb.asm.Label;" +
57-
"import org.objectweb.asm.MethodVisitor;" +
58-
"import org.objectweb.asm.Opcodes;" +
59-
"import org.objectweb.asm.RecordComponentVisitor;" +
60-
"import org.objectweb.asm.ModuleVisitor;" +
61-
"import org.objectweb.asm.Type;" +
62-
"import org.objectweb.asm.TypePath;" +
63-
"public class " + className + " implements Opcodes" +
64-
"{" +
49+
"import org.objectweb.asm.*;" +
50+
"public class " + className + " implements Opcodes {" +
6551
"public static byte[] dump() throws Exception {" +
66-
getTextArea().getText() +
67-
"return classWriter.toByteArray();" +
68-
"}" +
69-
"}";
52+
getTextArea().getText() +
53+
"return classWriter.toByteArray();}} ";
7054

7155
StringWriter errorTracer = new StringWriter();
7256
byte[] dumpClazz = Compiler.compileSingle(className, stringBuilder, errorTracer);
@@ -83,6 +67,8 @@ public ASMifierTablePanel(ClassNode classNode) {
8367
}
8468
});
8569
}};
70+
codeAreaPanel.getTextArea().setCodeFoldingEnabled(true);
71+
LanguageSupportFactory.get().register(codeAreaPanel.getTextArea());
8672
codeAreaPanel.getTextArea().setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);
8773
codeAreaPanel.getTextArea().setEditable(true);
8874
update();

src/main/java/cn/enaium/joe/gui/panel/menu/AttachMenu.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package cn.enaium.joe.gui.panel.menu;
1818

1919
import cn.enaium.joe.gui.panel.menu.attach.ProcessMenuItem;
20+
import cn.enaium.joe.gui.panel.menu.attach.TransformMenuItem;
2021
import cn.enaium.joe.util.LangUtil;
2122

2223
import javax.swing.*;
@@ -29,5 +30,6 @@ public class AttachMenu extends JMenu {
2930
public AttachMenu() {
3031
super(LangUtil.i18n("menu.attach"));
3132
add(new ProcessMenuItem());
33+
add(new TransformMenuItem());
3234
}
3335
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package cn.enaium.joe.gui.panel.menu.attach;
2+
3+
import cn.enaium.joe.dialog.TransformClassDialog;
4+
import cn.enaium.joe.util.LangUtil;
5+
6+
import javax.swing.*;
7+
8+
public class TransformMenuItem extends JMenuItem {
9+
public TransformMenuItem() {
10+
super(LangUtil.i18n("menu.attach.transform"));
11+
addActionListener(e -> {
12+
new TransformClassDialog().setVisible(true);
13+
});
14+
}
15+
}

src/main/resources/i18n/en_US.json

Lines changed: 0 additions & 126 deletions
This file was deleted.

0 commit comments

Comments
 (0)