Skip to content

This is a refactor and test case fix #52

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 28 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
c5375c7
chore: update Gradle
GaoYushanTw Nov 27, 2020
e1702e3
refactor: rename
GaoYushanTw Nov 27, 2020
957302b
refactor: move mainInternalTypeName to context
GaoYushanTw Nov 27, 2020
04396b8
refactor: use field configuration
GaoYushanTw Nov 27, 2020
6e2bf53
Refactor: move load into context as field
GaoYushanTw Nov 27, 2020
8214afb
refactor: move printer into context as field
GaoYushanTw Nov 27, 2020
15035c6
refactor: move typeMaker into context as field
GaoYushanTw Nov 27, 2020
9a716db
refactor: move majorVersion into context as field
GaoYushanTw Nov 27, 2020
da4fdcb
refactor: move minorVersion into context as field
GaoYushanTw Nov 27, 2020
e60518f
refactor: move maxLineNumber into context as field
GaoYushanTw Nov 27, 2020
4dcf3e6
fix: fix test case for mainInternalTypeName
GaoYushanTw Nov 27, 2020
5fd4b0f
refactor: move last two info into context as field
GaoYushanTw Nov 27, 2020
f368466
chore: remove head in context
GaoYushanTw Nov 27, 2020
8b1e1db
chore: change permission for gradlew
GaoYushanTw Nov 27, 2020
e49cf0c
fix: fix test case
GaoYushanTw Nov 27, 2020
b683d1a
refactor: remove unused interface Processor
GaoYushanTw Nov 27, 2020
7a3799b
refactor: delete unused DeserializeClassFileProcessor
GaoYushanTw Nov 27, 2020
24bc8d6
refactor: move test stub out
GaoYushanTw Nov 28, 2020
24a27eb
refactor: move test stub out
GaoYushanTw Nov 28, 2020
3393c2b
refactor: move some stubs out
GaoYushanTw Nov 28, 2020
615196e
refactor: create AbstrctJdTest to make test easy
GaoYushanTw Nov 28, 2020
d3fbda7
refactor: apply AbstractJdTest to some test
GaoYushanTw Nov 28, 2020
837bf22
refactor: apply AbstractJdTest to test case
GaoYushanTw Nov 28, 2020
cc8d957
refactor: split body to real field
GaoYushanTw Nov 28, 2020
93586ef
refactor: JavaFragment must be Fragment
GaoYushanTw Nov 28, 2020
a33952c
refactor: make process more readable
GaoYushanTw Nov 28, 2020
744e1b3
refactor: more readable
GaoYushanTw Nov 28, 2020
73bf433
chore: cache TypeMaker in Context
GaoYushanTw Nov 28, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ apply plugin: 'maven-publish'
apply plugin: 'com.jfrog.bintray'

dependencies {
compileOnly 'org.projectlombok:lombok:1.18.12'
annotationProcessor 'org.projectlombok:lombok:1.18.12'

testCompile 'commons-codec:commons-codec:1.13'
testCompile 'org.apache.commons:commons-collections4:4.1'
testCompile 'org.apache.commons:commons-imaging:1.0-alpha1'
Expand Down
3 changes: 2 additions & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.2.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.4.1-bin.zip
# distributionUrl=https\://services.gradle.org/distributions/gradle-5.2.1-bin.zip
Empty file modified gradlew
100644 → 100755
Empty file.
50 changes: 29 additions & 21 deletions src/main/java/org/jd/core/v1/ClassFileToJavaSourceDecompiler.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,51 +10,59 @@
import org.jd.core.v1.api.Decompiler;
import org.jd.core.v1.api.loader.Loader;
import org.jd.core.v1.api.printer.Printer;
import org.jd.core.v1.model.message.Message;
import org.jd.core.v1.model.classfile.ClassFile;
import org.jd.core.v1.model.javasyntax.CompilationUnit;
import org.jd.core.v1.model.message.DecompileContext;
import org.jd.core.v1.model.token.Token;
import org.jd.core.v1.service.converter.classfiletojavasyntax.ClassFileToJavaSyntaxProcessor;
import org.jd.core.v1.service.deserializer.classfile.DeserializeClassFileProcessor;
import org.jd.core.v1.service.deserializer.classfile.ClassFileDeserializer;
import org.jd.core.v1.service.fragmenter.javasyntaxtojavafragment.JavaSyntaxToJavaFragmentProcessor;
import org.jd.core.v1.service.layouter.LayoutFragmentProcessor;
import org.jd.core.v1.service.tokenizer.javafragmenttotoken.JavaFragmentToTokenProcessor;
import org.jd.core.v1.service.writer.WriteTokenProcessor;
import org.jd.core.v1.util.DefaultList;

import java.util.Map;

public class ClassFileToJavaSourceDecompiler implements Decompiler {
protected DeserializeClassFileProcessor deserializer = new DeserializeClassFileProcessor();
protected ClassFileDeserializer deserializer = new ClassFileDeserializer();
protected ClassFileToJavaSyntaxProcessor converter = new ClassFileToJavaSyntaxProcessor();
protected JavaSyntaxToJavaFragmentProcessor fragmenter = new JavaSyntaxToJavaFragmentProcessor();
protected LayoutFragmentProcessor layouter = new LayoutFragmentProcessor();
protected JavaFragmentToTokenProcessor tokenizer = new JavaFragmentToTokenProcessor();
protected WriteTokenProcessor writer = new WriteTokenProcessor();

public void decompile(Loader loader, Printer printer, String internalName) throws Exception {
Message message = new Message();
DecompileContext decompileContext = new DecompileContext();

message.setHeader("mainInternalTypeName", internalName);
message.setHeader("loader", loader);
message.setHeader("printer", printer);
decompileContext.setMainInternalTypeName(internalName);
decompileContext.setLoader(loader);
decompileContext.setPrinter(printer);

decompile(message);
decompile(decompileContext);
}

public void decompile(Loader loader, Printer printer, String internalName, Map<String, Object> configuration) throws Exception {
Message message = new Message();
DecompileContext decompileContext = new DecompileContext();

message.setHeader("mainInternalTypeName", internalName);
message.setHeader("configuration", configuration);
message.setHeader("loader", loader);
message.setHeader("printer", printer);
decompileContext.setMainInternalTypeName(internalName);
decompileContext.setConfiguration(configuration);
decompileContext.setLoader(loader);
decompileContext.setPrinter(printer);

decompile(message);
decompile(decompileContext);
}

protected void decompile(Message message) throws Exception {
this.deserializer.process(message);
this.converter.process(message);
this.fragmenter.process(message);
this.layouter.process(message);
this.tokenizer.process(message);
this.writer.process(message);
protected void decompile(DecompileContext decompileContext) throws Exception {
ClassFile classFile = this.deserializer.loadClassFile(decompileContext.getLoader(),
decompileContext.getMainInternalTypeName());
decompileContext.setClassFile(classFile);

CompilationUnit compilationUnit = this.converter.process(decompileContext);
this.fragmenter.process(compilationUnit, decompileContext);
this.layouter.process(decompileContext);
DefaultList<Token> tokens = this.tokenizer.process(decompileContext.getBody());
decompileContext.setTokens(tokens);
this.writer.process(decompileContext);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@

package org.jd.core.v1.model.javafragment;

public interface JavaFragment {
import org.jd.core.v1.model.fragment.Fragment;

public interface JavaFragment extends Fragment {
void accept(JavaFragmentVisitor visitor);
}
63 changes: 63 additions & 0 deletions src/main/java/org/jd/core/v1/model/message/DecompileContext.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
/*
* Copyright (c) 2008-2019 Emmanuel Dupuy.
* This project is distributed under the GPLv3 license.
* This is a Copyleft license that gives the user the right to use,
* copy and modify the code freely for non-commercial purposes.
*/

package org.jd.core.v1.model.message;

import lombok.Getter;
import lombok.Setter;
import org.jd.core.v1.api.loader.Loader;
import org.jd.core.v1.api.printer.Printer;
import org.jd.core.v1.model.classfile.ClassFile;
import org.jd.core.v1.model.fragment.Fragment;
import org.jd.core.v1.model.javasyntax.CompilationUnit;
import org.jd.core.v1.model.token.Token;
import org.jd.core.v1.service.converter.classfiletojavasyntax.util.TypeMaker;
import org.jd.core.v1.util.DefaultList;

import java.util.HashMap;
import java.util.Map;

@Getter
@Setter
public class DecompileContext {
protected String mainInternalTypeName;
protected Map<String, Object> configuration = new HashMap<>();
protected Loader loader;
protected Printer printer;

protected TypeMaker typeMaker;
protected int majorVersion;
protected int minorVersion;
protected int maxLineNumber = Printer.UNKNOWN_LINE_NUMBER;
protected boolean containsByteCode;
protected boolean showBridgeAndSynthetic;

protected ClassFile classFile;
protected CompilationUnit compilationUnit;
protected DefaultList<Token> tokens;

@Deprecated
protected Object body;

public DecompileContext() {}

@Deprecated
public DecompileContext(DefaultList<Fragment> fragments) {
this.body = fragments;
}

@SuppressWarnings("unchecked")
@Deprecated
public <T> T getBody() {
return (T)body;
}

@Deprecated
public void setBody(Object body) {
this.body = body;
}
}
54 changes: 0 additions & 54 deletions src/main/java/org/jd/core/v1/model/message/Message.java

This file was deleted.

14 changes: 0 additions & 14 deletions src/main/java/org/jd/core/v1/model/processor/Processor.java

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,12 @@
package org.jd.core.v1.service.converter.classfiletojavasyntax;

import org.jd.core.v1.api.loader.Loader;
import org.jd.core.v1.model.message.Message;
import org.jd.core.v1.model.processor.Processor;
import org.jd.core.v1.model.javasyntax.CompilationUnit;
import org.jd.core.v1.model.message.DecompileContext;
import org.jd.core.v1.service.converter.classfiletojavasyntax.processor.ConvertClassFileProcessor;
import org.jd.core.v1.service.converter.classfiletojavasyntax.processor.UpdateJavaSyntaxTreeProcessor;
import org.jd.core.v1.service.converter.classfiletojavasyntax.util.TypeMaker;

import java.util.Map;

/**
* Convert ClassFile model to Java syntax model.<br><br>
*
Expand All @@ -24,36 +22,23 @@
*
* @see ConvertClassFileProcessor
*/
public class ClassFileToJavaSyntaxProcessor implements Processor {
public class ClassFileToJavaSyntaxProcessor {
protected static final ConvertClassFileProcessor CONVERT_CLASS_FILE_PROCESSOR = new ConvertClassFileProcessor();
protected static final UpdateJavaSyntaxTreeProcessor UPDATE_JAVA_SYNTAX_TREE_PROCESSOR = new UpdateJavaSyntaxTreeProcessor();

public void process(Message message) throws Exception {
Loader loader = message.getHeader("loader");
Map<String, Object> configuration = message.getHeader("configuration");

if (configuration == null) {
message.setHeader("typeMaker", new TypeMaker(loader));
} else {
TypeMaker typeMaker = null;

try {
typeMaker = (TypeMaker)configuration.get("typeMaker");
public CompilationUnit process(DecompileContext decompileContext) throws Exception {
Loader loader = decompileContext.getLoader();

if (typeMaker == null) {
// Store the heavy weight object 'typeMaker' in 'configuration' to reuse it
configuration.put("typeMaker", typeMaker=new TypeMaker(loader));
}
} catch (Exception e) {
if (typeMaker == null) {
typeMaker = new TypeMaker(loader);
}
}

message.setHeader("typeMaker", typeMaker);
TypeMaker typeMaker = decompileContext.getTypeMaker();
if (typeMaker == null) {
typeMaker = new TypeMaker(loader);
decompileContext.setTypeMaker(typeMaker);
}

CONVERT_CLASS_FILE_PROCESSOR.process(message);
UPDATE_JAVA_SYNTAX_TREE_PROCESSOR.process(message);
CompilationUnit compilationUnit = CONVERT_CLASS_FILE_PROCESSOR.process(decompileContext.getClassFile(), typeMaker, decompileContext);
decompileContext.setCompilationUnit(compilationUnit);

UPDATE_JAVA_SYNTAX_TREE_PROCESSOR.process(compilationUnit, typeMaker);
return compilationUnit;
}
}
Loading