Skip to content

Commit 6968f99

Browse files
author
emmanue1
committed
Fix syntax errors in decompiled sources
1 parent 0bc5912 commit 6968f99

File tree

3 files changed

+115
-43
lines changed

3 files changed

+115
-43
lines changed

build.gradle

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ apply plugin: 'maven-publish'
55
apply plugin: 'com.jfrog.bintray'
66

77
dependencies {
8-
testCompile 'junit:junit:4.12'
9-
testCompile 'org.apache.commons:commons-lang3:3.9'
10-
testCompile 'org.apache.commons:commons-collections4:4.1'
118
testCompile 'commons-codec:commons-codec:1.13'
9+
testCompile 'org.apache.commons:commons-collections4:4.1'
10+
testCompile 'org.apache.commons:commons-lang3:3.9'
11+
testCompile 'junit:junit:4.12'
1212
}
1313

1414
version='1.1.2'

src/main/java/org/jd/core/v1/service/converter/classfiletojavasyntax/util/TypeMaker.java

Lines changed: 61 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ public class TypeMaker {
5555
private HashMap<String, ObjectType> descriptorToObjectType = new HashMap<>(1024);
5656
private HashMap<String, ObjectType> internalTypeNameToObjectType = new HashMap<>(1024);
5757
private HashMap<String, TypeTypes> internalTypeNameToTypeTypes = new HashMap<>(1024);
58+
private HashMap<String, Boolean> internalTypeNameMethodNameParameterCountToBoolean = new HashMap<>(1024);
5859
private HashMap<String, MethodTypes> internalTypeNameMethodNameDescriptorToMethodTypes = new HashMap<>(1024);
5960
private HashMap<String, MethodTypes> signatureToMethodTypes = new HashMap<>(1024);
6061

@@ -1550,11 +1551,23 @@ private void loadFieldsAndMethods(String internalTypeName, byte[] data) throws E
15501551
String name = (String)constants[nameIndex];
15511552
String descriptor = (String)constants[descriptorIndex];
15521553
String key = internalTypeName + ':' + name + descriptor;
1554+
MethodTypes methodTypes;
15531555

15541556
if (signature == null) {
1555-
internalTypeNameMethodNameDescriptorToMethodTypes.put(key, parseMethodSignature(descriptor, exceptionTypeNames));
1557+
methodTypes = parseMethodSignature(descriptor, exceptionTypeNames);
15561558
} else {
1557-
internalTypeNameMethodNameDescriptorToMethodTypes.put(key, parseMethodSignature(descriptor, signature, exceptionTypeNames));
1559+
methodTypes = parseMethodSignature(descriptor, signature, exceptionTypeNames);
1560+
}
1561+
1562+
internalTypeNameMethodNameDescriptorToMethodTypes.put(key, methodTypes);
1563+
1564+
int parameterCount = (methodTypes.parameterTypes == null) ? 0 : methodTypes.parameterTypes.size();
1565+
key = internalTypeName + ':' + name + ':' + parameterCount;
1566+
1567+
if (internalTypeNameMethodNameParameterCountToBoolean.containsKey(key)) {
1568+
internalTypeNameMethodNameParameterCountToBoolean.put(key, Boolean.TRUE);
1569+
} else {
1570+
internalTypeNameMethodNameParameterCountToBoolean.put(key, Boolean.FALSE);
15581571
}
15591572
}
15601573
}
@@ -1763,6 +1776,52 @@ public String toString() {
17631776
}
17641777
}
17651778

1779+
public boolean multipleMethods(String internalTypeName, String name, int parameterCount) {
1780+
String suffixKey = ":" + name + ':' + parameterCount;
1781+
Boolean bool = multipleMethods(internalTypeName, suffixKey);
1782+
return (bool == null) ? false : bool.booleanValue();
1783+
}
1784+
1785+
private Boolean multipleMethods(String internalTypeName, String suffixKey) {
1786+
String key = internalTypeName + suffixKey;
1787+
Boolean bool = internalTypeNameMethodNameParameterCountToBoolean.get(key);
1788+
1789+
if (bool == null) {
1790+
// Load methods
1791+
if (loadFieldsAndMethods(internalTypeName)) {
1792+
bool = internalTypeNameMethodNameParameterCountToBoolean.get(key);
1793+
1794+
if (bool == null) {
1795+
TypeTypes typeTypes = makeTypeTypes(internalTypeName);
1796+
1797+
if (typeTypes != null) {
1798+
if (typeTypes.superType != null) {
1799+
bool = multipleMethods(typeTypes.superType.getInternalName(), suffixKey);
1800+
}
1801+
1802+
if ((bool == null) && (typeTypes.interfaces != null)) {
1803+
if (typeTypes.interfaces.isList()) {
1804+
for (Type interfaze : typeTypes.interfaces) {
1805+
bool = multipleMethods(((ObjectType)interfaze).getInternalName(), suffixKey);
1806+
if (bool != null)
1807+
break;
1808+
}
1809+
} else {
1810+
bool = multipleMethods(((ObjectType)typeTypes.interfaces.getFirst()).getInternalName(), suffixKey);
1811+
}
1812+
}
1813+
}
1814+
}
1815+
1816+
if (bool != null) {
1817+
internalTypeNameMethodNameParameterCountToBoolean.put(key, bool);
1818+
}
1819+
}
1820+
}
1821+
1822+
return bool;
1823+
}
1824+
17661825
public static class TypeTypes {
17671826
public ObjectType thisType;
17681827
public BaseTypeParameter typeParameters;

src/main/java/org/jd/core/v1/service/converter/classfiletojavasyntax/visitor/AddCastExpressionVisitor.java

Lines changed: 51 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ public void visit(LambdaIdentifiersExpression expression) {
144144

145145
@Override
146146
public void visit(ReturnExpressionStatement statement) {
147-
statement.setExpression(updateExpression(returnedType, statement.getExpression()));
147+
statement.setExpression(updateExpression(returnedType, statement.getExpression(), false));
148148
}
149149

150150
@Override
@@ -211,7 +211,7 @@ public void visit(ExpressionVariableInitializer declaration) {
211211
nia.getArrayInitializer().accept(this);
212212
type = t;
213213
} else {
214-
declaration.setExpression(updateExpression(type, expression));
214+
declaration.setExpression(updateExpression(type, expression, false));
215215
}
216216
}
217217

@@ -220,7 +220,8 @@ public void visit(SuperConstructorInvocationExpression expression) {
220220
BaseExpression parameters = expression.getParameters();
221221

222222
if (parameters != null) {
223-
expression.setParameters(updateExpressions(((ClassFileSuperConstructorInvocationExpression)expression).getParameterTypes(), parameters));
223+
boolean force = containsNullExpression(parameters) && typeMaker.multipleMethods(expression.getObjectType().getInternalName(), "<init>", parameters.size());
224+
expression.setParameters(updateExpressions(((ClassFileSuperConstructorInvocationExpression)expression).getParameterTypes(), parameters, force));
224225
}
225226
}
226227

@@ -229,7 +230,8 @@ public void visit(ConstructorInvocationExpression expression) {
229230
BaseExpression parameters = expression.getParameters();
230231

231232
if (parameters != null) {
232-
expression.setParameters(updateExpressions(((ClassFileConstructorInvocationExpression)expression).getParameterTypes(), parameters));
233+
boolean force = containsNullExpression(parameters) && typeMaker.multipleMethods(expression.getObjectType().getInternalName(), "<init>", parameters.size());
234+
expression.setParameters(updateExpressions(((ClassFileConstructorInvocationExpression)expression).getParameterTypes(), parameters, force));
233235
}
234236
}
235237

@@ -238,21 +240,35 @@ public void visit(MethodInvocationExpression expression) {
238240
BaseExpression parameters = expression.getParameters();
239241

240242
if (parameters != null) {
241-
ClassFileMethodInvocationExpression mie = (ClassFileMethodInvocationExpression)expression;
242-
243-
parameters.accept(this);
244-
expression.setParameters(updateExpressions(mie.getParameterTypes(), parameters));
243+
boolean force = containsNullExpression(parameters) && typeMaker.multipleMethods(expression.getInternalTypeName(), expression.getName(), parameters.size());
244+
expression.setParameters(updateExpressions(((ClassFileMethodInvocationExpression)expression).getParameterTypes(), parameters, force));
245245
}
246246

247247
expression.getExpression().accept(this);
248248
}
249249

250+
protected boolean containsNullExpression(BaseExpression parameters) {
251+
switch (parameters.size()) {
252+
case 0:
253+
return false;
254+
case 1:
255+
return parameters.getFirst().getClass() == NullExpression.class;
256+
default:
257+
for (Expression parameter : parameters) {
258+
if (parameter.getClass() == NullExpression.class) {
259+
return true;
260+
}
261+
}
262+
return false;
263+
}
264+
}
265+
250266
@Override
251267
public void visit(NewExpression expression) {
252268
BaseExpression parameters = expression.getParameters();
253269

254270
if (parameters != null) {
255-
expression.setParameters(updateExpressions(((ClassFileNewExpression)expression).getParameterTypes(), parameters));
271+
expression.setParameters(updateExpressions(((ClassFileNewExpression)expression).getParameterTypes(), parameters, false));
256272
}
257273
}
258274

@@ -277,7 +293,7 @@ public void visit(FieldReferenceExpression expression) {
277293
Type type = typeMaker.makeFromInternalTypeName(expression.getInternalTypeName());
278294

279295
if (type.getName() != null) {
280-
expression.setExpression(updateExpression(type, exp));
296+
expression.setExpression(updateExpression(type, exp, false));
281297
}
282298
}
283299
}
@@ -299,7 +315,7 @@ public void visit(BinaryOperatorExpression expression) {
299315
}
300316
}
301317

302-
expression.setRightExpression(updateExpression(expression.getLeftExpression().getType(), rightExpression));
318+
expression.setRightExpression(updateExpression(expression.getLeftExpression().getType(), rightExpression, false));
303319
return;
304320
}
305321

@@ -312,30 +328,38 @@ public void visit(TernaryOperatorExpression expression) {
312328

313329
expression.getCondition().accept(this);
314330

315-
expression.setExpressionTrue(updateExpression(expressionType, expression.getExpressionTrue()));
316-
expression.setExpressionFalse(updateExpression(expressionType, expression.getExpressionFalse()));
331+
expression.setExpressionTrue(updateExpression(expressionType, expression.getExpressionTrue(), false));
332+
expression.setExpressionFalse(updateExpression(expressionType, expression.getExpressionFalse(), false));
317333
}
318334

319335
@SuppressWarnings("unchecked")
320-
protected BaseExpression updateExpressions(BaseType types, BaseExpression expressions) {
336+
protected BaseExpression updateExpressions(BaseType types, BaseExpression expressions, boolean force) {
321337
if (expressions != null) {
322338
if (expressions.isList()) {
323339
DefaultList<Type> t = types.getList();
324340
DefaultList<Expression> e = expressions.getList();
325341

326342
for (int i = e.size() - 1; i >= 0; i--) {
327-
e.set(i, updateExpression(t.get(i), e.get(i)));
343+
e.set(i, updateExpression(t.get(i), e.get(i), force));
328344
}
329345
} else {
330-
expressions = updateExpression(types.getFirst(), (Expression) expressions);
346+
expressions = updateExpression(types.getFirst(), (Expression) expressions, force);
331347
}
332348
}
333349

334350
return expressions;
335351
}
336352

337-
private Expression updateExpression(Type type, Expression expression) {
338-
if (match(expression)) {
353+
private Expression updateExpression(Type type, Expression expression, boolean force) {
354+
Class expressionClass = expression.getClass();
355+
356+
if (expressionClass == NullExpression.class) {
357+
if (force) {
358+
searchFirstLineNumberVisitor.init();
359+
expression.accept(searchFirstLineNumberVisitor);
360+
expression = new CastExpression(searchFirstLineNumberVisitor.getLineNumber(), type, expression);
361+
}
362+
} else {
339363
Type expressionType = expression.getType();
340364

341365
if (!expressionType.equals(type) && !TYPE_OBJECT.equals(type)) {
@@ -364,32 +388,21 @@ private Expression updateExpression(Type type, Expression expression) {
364388
}
365389
}
366390
}
367-
}
368391

369-
if (expression.getClass() == CastExpression.class) {
370-
CastExpression ce = (CastExpression)expression;
371-
Type ceExpressionType = ce.getExpression().getType();
392+
if (expression.getClass() == CastExpression.class) {
393+
CastExpression ce = (CastExpression)expression;
394+
Type ceExpressionType = ce.getExpression().getType();
372395

373-
if (type.isObject() && ceExpressionType.isObject() && typeMaker.isAssignable(typeBounds, (ObjectType)type, (ObjectType)ceExpressionType)) {
374-
// Remove cast expression
375-
expression = ce.getExpression();
396+
if (type.isObject() && ceExpressionType.isObject() && typeMaker.isAssignable(typeBounds, (ObjectType)type, (ObjectType)ceExpressionType)) {
397+
// Remove cast expression
398+
expression = ce.getExpression();
399+
}
376400
}
377-
}
378-
379-
expression.accept(this);
380-
381-
return expression;
382-
}
383-
384-
private static final boolean match(Expression expression) {
385-
Class expressionClass = expression.getClass();
386401

387-
if (expressionClass == NullExpression.class) {
388-
// Do not add a cast before a null value
389-
return false;
402+
expression.accept(this);
390403
}
391404

392-
return true;
405+
return expression;
393406
}
394407

395408
private Expression addCastExpression(Type type, Expression expression) {

0 commit comments

Comments
 (0)