summaryrefslogtreecommitdiffstats
path: root/src/org/jetbrains/java/decompiler/main/Fernflower.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/org/jetbrains/java/decompiler/main/Fernflower.java')
-rw-r--r--src/org/jetbrains/java/decompiler/main/Fernflower.java110
1 files changed, 110 insertions, 0 deletions
diff --git a/src/org/jetbrains/java/decompiler/main/Fernflower.java b/src/org/jetbrains/java/decompiler/main/Fernflower.java
new file mode 100644
index 0000000..021ab1a
--- /dev/null
+++ b/src/org/jetbrains/java/decompiler/main/Fernflower.java
@@ -0,0 +1,110 @@
+/*
+ * Fernflower - The Analytical Java Decompiler
+ * http://www.reversed-java.com
+ *
+ * (C) 2008 - 2010, Stiver
+ *
+ * This software is NEITHER public domain NOR free software
+ * as per GNU License. See license.txt for more details.
+ *
+ * This software is distributed WITHOUT ANY WARRANTY; without
+ * even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ * A PARTICULAR PURPOSE.
+ */
+
+package org.jetbrains.java.decompiler.main;
+
+import java.io.BufferedWriter;
+import java.io.StringWriter;
+import java.util.HashMap;
+
+import org.jetbrains.java.decompiler.main.ClassesProcessor.ClassNode;
+import org.jetbrains.java.decompiler.main.collectors.CounterContainer;
+import org.jetbrains.java.decompiler.main.extern.IBytecodeProvider;
+import org.jetbrains.java.decompiler.main.extern.IDecompilatSaver;
+import org.jetbrains.java.decompiler.main.extern.IFernflowerPreferences;
+import org.jetbrains.java.decompiler.modules.renamer.IdentifierConverter;
+import org.jetbrains.java.decompiler.struct.IDecompiledData;
+import org.jetbrains.java.decompiler.struct.StructClass;
+import org.jetbrains.java.decompiler.struct.StructContext;
+import org.jetbrains.java.decompiler.struct.lazy.LazyLoader;
+
+
+public class Fernflower implements IDecompiledData {
+
+ public static final String version = "v0.8.4";
+
+ private StructContext structcontext;
+
+ private ClassesProcessor clprocessor;
+
+ public Fernflower(IBytecodeProvider provider, IDecompilatSaver saver,
+ HashMap<String, Object> propertiesCustom) {
+
+ StructContext context = new StructContext(saver, this, new LazyLoader(provider));
+
+ structcontext = context;
+
+ DecompilerContext.initContext(propertiesCustom);
+ DecompilerContext.setCountercontainer(new CounterContainer());
+
+ }
+
+ public void decompileContext() {
+
+ if(DecompilerContext.getOption(IFernflowerPreferences.RENAME_ENTITIES)) {
+ IdentifierConverter ren = new IdentifierConverter();
+ ren.rename(structcontext);
+ ren = null;
+ }
+
+ clprocessor = new ClassesProcessor(structcontext);
+
+ DecompilerContext.setClassprocessor(clprocessor);
+ DecompilerContext.setStructcontext(structcontext);
+
+ structcontext.saveContext();
+ }
+
+ public void clearContext() {
+ DecompilerContext.setCurrentContext(null);
+ }
+
+ public String getClassEntryName(StructClass cl, String entryname) {
+
+ ClassNode node = clprocessor.getMapRootClasses().get(cl.qualifiedName);
+ if(node.type != ClassNode.CLASS_ROOT) {
+ return null;
+ } else {
+ if(DecompilerContext.getOption(IFernflowerPreferences.RENAME_ENTITIES)) {
+ String simple_classname = cl.qualifiedName.substring(cl.qualifiedName.lastIndexOf('/')+1);
+ return entryname.substring(0, entryname.lastIndexOf('/')+1)+simple_classname+".java";
+ } else {
+ return entryname.substring(0, entryname.lastIndexOf(".class"))+".java";
+ }
+ }
+ }
+
+ public StructContext getStructcontext() {
+ return structcontext;
+ }
+
+ public String getClassContent(StructClass cl) {
+
+ String res = null;
+
+ try {
+ StringWriter strwriter = new StringWriter();
+ clprocessor.writeClass(structcontext, cl, new BufferedWriter(strwriter));
+
+ res = strwriter.toString();
+ } catch(ThreadDeath ex) {
+ throw ex;
+ } catch(Throwable ex) {
+ DecompilerContext.getLogger().writeMessage("Class "+cl.qualifiedName+" couldn't be fully decompiled.", ex);
+ }
+
+ return res;
+ }
+
+}