Skip to content

Commit aac3a97

Browse files
committed
fix vineflower decompiler
1 parent 26515e0 commit aac3a97

File tree

5 files changed

+104
-32
lines changed

5 files changed

+104
-32
lines changed

build.gradle

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ version project.version
1212
java.toolchain.languageVersion = JavaLanguageVersion.of(21)
1313

1414
jar {
15-
1615
manifest.attributes(
1716
'Manifest-Version': 1.0,
1817
'Main-Class': 'cn.enaium.joe.Main',

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
version = 1.4.6
1+
version = 1.4.7

src/main/java/cn/enaium/joe/JavaOctetEditor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public class JavaOctetEditor {
4848

4949
public static final String TITLE = "JavaOctetEditor";
5050

51-
public static final String VERSION = "1.4.6";
51+
public static final String VERSION = "1.4.7";
5252

5353
public JFrame window;
5454

src/main/java/cn/enaium/joe/jar/Jar.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
* @author Enaium
2525
*/
2626
public class Jar {
27-
// internal name + ".class" -> ClassNode
27+
// internal name -> ClassNode
2828
private Map<String, ClassNode> classes = new LinkedHashMap<>();
2929
private Map<String, byte[]> resources = new LinkedHashMap<>();
3030

src/main/java/cn/enaium/joe/service/decompiler/VineFlowerDecompiler.java

Lines changed: 101 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package cn.enaium.joe.service.decompiler;
1818

1919
import cn.enaium.joe.JavaOctetEditor;
20+
import cn.enaium.joe.jar.Jar;
2021
import cn.enaium.joe.util.MessageUtil;
2122
import cn.enaium.joe.util.classes.ClassNode;
2223
import cn.enaium.joe.util.classes.JarHelper;
@@ -29,6 +30,7 @@
2930

3031

3132
import java.io.ByteArrayInputStream;
33+
import java.io.IOException;
3234
import java.io.InputStream;
3335
import java.util.*;
3436
import java.util.jar.Manifest;
@@ -39,11 +41,13 @@
3941
*/
4042
public class VineFlowerDecompiler extends IFernflowerLogger implements IDecompiler, IResultSaver, IContextSource, IContextSource.IOutputSink {
4143
private String returned;
42-
private HashMap<String, ClassNode> activeClass;
44+
private ClassNode toDecompileClass;
45+
private HashMap<String, ClassNode> classNodeHashMap;
46+
4347
public static final CachedGlobalValue<Map<String, Object>> customProperties = new CachedGlobalValue<>(config -> {
4448
Map<String, String> map = JavaOctetEditor.getInstance().CONFIG.getConfigMapStrings(config);
4549
HashMap<String, Object> hashMap = new HashMap<>(map.size());
46-
for(Map.Entry<String, String> entry : map.entrySet()){
50+
for (Map.Entry<String, String> entry : map.entrySet()) {
4751
String v = entry.getValue();
4852
if (v.equals("true")) {
4953
v = "1";
@@ -52,21 +56,24 @@ public class VineFlowerDecompiler extends IFernflowerLogger implements IDecompil
5256
}
5357
hashMap.put(entry.getKey(), v);
5458
}
55-
return Collections.unmodifiableMap(hashMap);});
59+
return Collections.unmodifiableMap(hashMap);
60+
});
5661

5762
@Override
5863
public String decompile(final ClassNode classNode) {
64+
toDecompileClass = classNode;
65+
classNodeHashMap = JarHelper.getAllNodes(classNode);
5966
returned = null;
60-
activeClass = JarHelper.getAllNodes(classNode);
6167
BaseDecompiler baseDecompiler = new BaseDecompiler(this, customProperties.getValue(), this);
6268
baseDecompiler.addSource(this);
69+
baseDecompiler.addLibrary(new JarLibrary(JavaOctetEditor.getInstance().getJar()));
6370
baseDecompiler.decompileContext();
6471
return returned;
6572
}
6673

6774
@Override
6875
public void saveClassFile(String path, String qualifiedName, String entryName, String content, int[] mapping) {
69-
if (returned == null){
76+
if (returned == null && toDecompileClass.getInternalName().equals(qualifiedName)) {
7077
returned = content;
7178
}
7279
}
@@ -78,21 +85,21 @@ public void writeMessage(String message, Throwable t) {
7885

7986
@Override
8087
public void writeMessage(String message, Severity severity) {
81-
switch (severity){
88+
switch (severity) {
8289
case INFO -> Logger.info(message);
8390
case WARN -> Logger.warn(message);
84-
case TRACE -> Logger.trace(message);
85-
case ERROR -> MessageUtil.error(message);
91+
//case TRACE -> Logger.trace(message);
92+
case ERROR -> Logger.error(message);
8693
}
8794
}
8895

8996
@Override
9097
public void writeMessage(String message, Severity severity, Throwable t) {
91-
switch (severity){
98+
switch (severity) {
9299
case INFO -> Logger.info(t, message);
93100
case WARN -> Logger.warn(t, message);
94101
case TRACE -> Logger.trace(t, message);
95-
case ERROR -> MessageUtil.error(message, t);
102+
case ERROR -> Logger.error(message, t);
96103
}
97104
}
98105

@@ -103,7 +110,7 @@ public String getName() {
103110

104111
@Override
105112
public Entries getEntries() {
106-
return new Entries(activeClass.keySet().stream().map(Entry::atBase).toList(), List.of(), List.of());
113+
return new Entries(classNodeHashMap.keySet().stream().map(Entry::atBase).toList(), List.of(), List.of());
107114
}
108115

109116
@Override
@@ -113,19 +120,18 @@ public boolean isLazy() {
113120

114121
@Override
115122
public InputStream getInputStream(String resource) {
116-
if (activeClass.containsKey(resource)) return new ByteArrayInputStream(activeClass.get(resource).getClassBytes());
117123
return null;
118124
}
119125

120126
@Override
121127
public byte[] getClassBytes(String className) {
122-
if (activeClass.containsKey(className)) return activeClass.get(className).getClassBytes();
128+
if (hasClass(className)) return classNodeHashMap.get(className).getClassBytes();
123129
return null;
124130
}
125131

126132
@Override
127133
public boolean hasClass(String className) {
128-
return activeClass.containsKey(className);
134+
return classNodeHashMap.containsKey(className);
129135
}
130136

131137
@Override
@@ -135,18 +141,85 @@ public IOutputSink createOutputSink(IResultSaver saver) {
135141

136142
@Override
137143
public void acceptClass(String qualifiedName, String fileName, String content, int[] mapping) {
138-
this.saveClassFile(null, null, null, content, mapping);
139-
}
140-
141-
@Override public void begin() {}
142-
@Override public void close() {}
143-
@Override public void acceptDirectory(String s) {}
144-
@Override public void acceptOther(String s) {}
145-
@Override public void saveFolder(String path) {}
146-
@Override public void copyFile(String source, String path, String entryName) {}
147-
@Override public void createArchive(String path, String archiveName, Manifest manifest) {}
148-
@Override public void saveDirEntry(String path, String archiveName, String entryName) {}
149-
@Override public void copyEntry(String source, String path, String archiveName, String entry) {}
150-
@Override public void saveClassEntry(String path, String archiveName, String qualifiedName, String entryName, String content) {}
151-
@Override public void closeArchive(String path, String archiveName) {}
144+
this.saveClassFile(null, qualifiedName, null, content, mapping);
145+
}
146+
147+
@Override
148+
public void begin() {
149+
}
150+
151+
@Override
152+
public void close() {
153+
}
154+
155+
@Override
156+
public void acceptDirectory(String s) {
157+
}
158+
159+
@Override
160+
public void acceptOther(String s) {
161+
}
162+
163+
@Override
164+
public void saveFolder(String path) {
165+
}
166+
167+
@Override
168+
public void copyFile(String source, String path, String entryName) {
169+
}
170+
171+
@Override
172+
public void createArchive(String path, String archiveName, Manifest manifest) {
173+
}
174+
175+
@Override
176+
public void saveDirEntry(String path, String archiveName, String entryName) {
177+
}
178+
179+
@Override
180+
public void copyEntry(String source, String path, String archiveName, String entry) {
181+
}
182+
183+
@Override
184+
public void saveClassEntry(String path, String archiveName, String qualifiedName, String entryName, String content) {
185+
}
186+
187+
@Override
188+
public void closeArchive(String path, String archiveName) {
189+
}
190+
191+
public static class JarLibrary implements IContextSource {
192+
protected Jar jar;
193+
194+
public JarLibrary(Jar jar) {
195+
this.jar = jar;
196+
}
197+
198+
@Override
199+
public String getName() {
200+
return "JavaOctetEditor Jar Library";
201+
}
202+
203+
@Override
204+
public Entries getEntries() {
205+
return new Entries(jar.getClasses().stream().map(ClassNode::getInternalName).map(Entry::atBase).toList(), List.of(), List.of());
206+
}
207+
208+
@Override
209+
public InputStream getInputStream(String resource) {
210+
return null;
211+
}
212+
213+
@Override
214+
public byte[] getClassBytes(String className) {
215+
if (jar.hasClass(className)) jar.getClassNode(className).getClassBytes();
216+
return null;
217+
}
218+
219+
@Override
220+
public boolean hasClass(String className) throws IOException {
221+
Logger.error("has class? " + className);
222+
return jar.hasClass(className);
223+
}
224+
}
152225
}

0 commit comments

Comments
 (0)