Skip to content

Commit 10c46fd

Browse files
author
emmanue1
committed
Fix syntax errors in decompiled sources
1 parent df30945 commit 10c46fd

File tree

5 files changed

+187
-75
lines changed

5 files changed

+187
-75
lines changed

src/main/java/org/jd/core/v1/service/converter/classfiletojavasyntax/model/javasyntax/declaration/ClassFileStaticInitializerDeclaration.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public class ClassFileStaticInitializerDeclaration extends StaticInitializerDecl
2525
protected Method method;
2626
protected Map<String, TypeArgument> bindings;
2727
protected Map<String, BaseType> typeBounds;
28-
protected int firstLineNumber = 0;
28+
protected int firstLineNumber;
2929

3030
public ClassFileStaticInitializerDeclaration(
3131
ClassFileBodyDeclaration bodyDeclaration, ClassFile classFile, Method method, Map<String, TypeArgument> bindings,
@@ -39,6 +39,18 @@ public ClassFileStaticInitializerDeclaration(
3939
this.firstLineNumber = firstLineNumber;
4040
}
4141

42+
public ClassFileStaticInitializerDeclaration(
43+
ClassFileBodyDeclaration bodyDeclaration, ClassFile classFile, Method method, Map<String, TypeArgument> bindings,
44+
Map<String, BaseType> typeBounds, int firstLineNumber, BaseStatement statements) {
45+
super(method.getDescriptor(), statements);
46+
this.bodyDeclaration = bodyDeclaration;
47+
this.classFile = classFile;
48+
this.method = method;
49+
this.bindings = bindings;
50+
this.typeBounds = typeBounds;
51+
this.firstLineNumber = firstLineNumber;
52+
}
53+
4254
@Override
4355
public int getFlags() { return 0; }
4456

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -511,7 +511,7 @@ protected static Statement makeForEachArray(
511511
statements.removeLast();
512512
statements.removeLast();
513513

514-
subStatements.remove(0);
514+
subStatements.removeFirst();
515515
subStatements.removeLast();
516516

517517
item.setDeclared(true);
@@ -632,7 +632,9 @@ protected static Statement makeForEachList(
632632
}
633633

634634
// Check if 'i$' is not used in sub-statements
635-
SearchLocalVariableReferenceVisitor visitor1 = new SearchLocalVariableReferenceVisitor(syntheticIterator);
635+
SearchLocalVariableReferenceVisitor visitor1 = new SearchLocalVariableReferenceVisitor();
636+
637+
visitor1.init(syntheticIterator.getIndex());
636638

637639
for (int i=1, len=subStatements.size(); i<len; i++) {
638640
subStatements.get(i).accept(visitor1);

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

Lines changed: 162 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -15,26 +15,32 @@
1515
import org.jd.core.v1.model.javasyntax.statement.BaseStatement;
1616
import org.jd.core.v1.model.javasyntax.statement.ExpressionStatement;
1717
import org.jd.core.v1.model.javasyntax.statement.Statement;
18+
import org.jd.core.v1.model.javasyntax.statement.Statements;
1819
import org.jd.core.v1.model.javasyntax.type.PrimitiveType;
1920
import org.jd.core.v1.service.converter.classfiletojavasyntax.model.javasyntax.declaration.ClassFileBodyDeclaration;
21+
import org.jd.core.v1.service.converter.classfiletojavasyntax.model.javasyntax.declaration.ClassFileConstructorOrMethodDeclaration;
2022
import org.jd.core.v1.service.converter.classfiletojavasyntax.model.javasyntax.declaration.ClassFileFieldDeclaration;
2123
import org.jd.core.v1.service.converter.classfiletojavasyntax.model.javasyntax.declaration.ClassFileStaticInitializerDeclaration;
2224
import org.jd.core.v1.util.DefaultList;
2325

2426
import java.util.Iterator;
27+
import java.util.List;
2528

2629
public class InitStaticFieldVisitor extends AbstractJavaSyntaxVisitor {
2730
protected SearchFirstLineNumberVisitor searchFirstLineNumberVisitor = new SearchFirstLineNumberVisitor();
31+
protected SearchLocalVariableReferenceVisitor searchLocalVariableReferenceVisitor = new SearchLocalVariableReferenceVisitor();
2832
protected String internalTypeName;
2933
protected DefaultList<FieldDeclarator> fields = new DefaultList<>();
30-
protected ClassFileStaticInitializerDeclaration staticDeclaration;
34+
protected List<ClassFileConstructorOrMethodDeclaration> methods;
35+
protected Boolean deleteStaticDeclaration;
3136

3237
public void setInternalTypeName(String internalTypeName) {
3338
this.internalTypeName = internalTypeName;
3439
}
3540

3641
@Override
3742
public void visit(AnnotationDeclaration declaration) {
43+
this.internalTypeName = declaration.getInternalTypeName();
3844
safeAccept(declaration.getBodyDeclaration());
3945
}
4046

@@ -59,19 +65,36 @@ public void visit(InterfaceDeclaration declaration) {
5965
@Override
6066
public void visit(BodyDeclaration declaration) {
6167
ClassFileBodyDeclaration bodyDeclaration = (ClassFileBodyDeclaration)declaration;
68+
6269
// Store field declarations
6370
fields.clear();
64-
staticDeclaration = null;
6571
safeAcceptListDeclaration(bodyDeclaration.getFieldDeclarations());
6672

6773
if (!fields.isEmpty()) {
68-
// Visit methods
69-
safeAcceptListDeclaration(bodyDeclaration.getMethodDeclarations());
70-
}
74+
methods = bodyDeclaration.getMethodDeclarations();
75+
76+
if (methods != null) {
77+
deleteStaticDeclaration = null;
7178

72-
if ((staticDeclaration != null) && (staticDeclaration.getStatements() == null)) {
73-
bodyDeclaration.getMethodDeclarations().remove(staticDeclaration);
79+
for (int i=0, len=methods.size(); i<len; i++) {
80+
methods.get(i).accept(this);
81+
82+
if (deleteStaticDeclaration != null) {
83+
if (deleteStaticDeclaration.booleanValue()) {
84+
methods.remove(i);
85+
}
86+
break;
87+
}
88+
}
89+
}
7490
}
91+
92+
safeAcceptListDeclaration(bodyDeclaration.getInnerTypeDeclarations());
93+
}
94+
95+
@Override
96+
public void visit(FieldDeclarator declaration) {
97+
fields.add(declaration);
7598
}
7699

77100
@Override
@@ -80,101 +103,173 @@ public void visit(ConstructorDeclaration declaration) {}
80103
@Override
81104
public void visit(MethodDeclaration declaration) {}
82105

106+
@Override
107+
public void visit(InstanceInitializerDeclaration declaration) {}
108+
83109
@Override
84110
@SuppressWarnings("unchecked")
85111
public void visit(StaticInitializerDeclaration declaration) {
86-
staticDeclaration = (ClassFileStaticInitializerDeclaration) declaration;
112+
ClassFileStaticInitializerDeclaration sid = (ClassFileStaticInitializerDeclaration) declaration;
87113

88-
BaseStatement statements = staticDeclaration.getStatements();
114+
BaseStatement statements = sid.getStatements();
89115

90-
if ((statements != null) && (statements.size() > 0)) {
116+
if (statements != null) {
91117
if (statements.isList()) {
92-
Statement statement = statements.getFirst();
118+
// Multiple statements
119+
if ((statements.size() > 0) && isAssertionsDisabled(statements.getFirst())) {
120+
// Remove assert initialization statement
121+
statements.getList().removeFirst();
122+
}
123+
124+
if (statements.size() > 0) {
125+
DefaultList<Statement> list = statements.getList();
126+
Iterator<FieldDeclarator> fieldDeclaratorIterator = fields.iterator();
127+
// int lastLineNumber = 0;
128+
129+
for (int i=0, len=list.size(); i<len; i++) {
130+
Statement statement = list.get(i);
93131

94-
if ((statement.getClass() == ExpressionStatement.class)) {
95-
ExpressionStatement cdes = (ExpressionStatement) statement;
132+
if (setStaticFieldInitializer(statement, fieldDeclaratorIterator)) {
133+
if (i > 0) {
134+
// Split 'static' block
135+
BaseStatement newStatements;
96136

97-
if (cdes.getExpression().getClass() == BinaryOperatorExpression.class) {
98-
BinaryOperatorExpression cfboe = (BinaryOperatorExpression) cdes.getExpression();
137+
if (i == 1) {
138+
newStatements = list.removeFirst();
139+
} else {
140+
List<Statement> subList = list.subList(0, i);
141+
newStatements = new Statements(subList);
142+
subList.clear();
143+
}
99144

100-
if (cfboe.getLeftExpression().getClass() == FieldReferenceExpression.class) {
101-
FieldReferenceExpression fre = (FieldReferenceExpression) cfboe.getLeftExpression();
145+
// Removes statements from original list
146+
len -= newStatements.size();
147+
i = 0;
102148

103-
if ((fre.getType() == PrimitiveType.TYPE_BOOLEAN) && fre.getInternalTypeName().equals(internalTypeName) && fre.getName().equals("$assertionsDisabled")) {
104-
// Remove assert initialization statement
105-
statements.getList().removeFirst();
149+
addStaticInitializerDeclaration(sid, getFirstLineNumber(newStatements), newStatements);
106150
}
151+
152+
// Remove field initialization statement
153+
list.remove(i--);
154+
len--;
155+
// TODO Fix problem with local variable declarations before split static block
156+
// lastLineNumber = 0;
157+
// } else {
158+
// int newLineNumber = getFirstLineNumber(statement);
159+
//
160+
// if ((lastLineNumber > 0) && (newLineNumber > 0) && (lastLineNumber + 3 < newLineNumber)) {
161+
// // Split 'static' block
162+
// BaseStatement newStatements;
163+
//
164+
// if (i == 1) {
165+
// newStatements = list.removeFirst();
166+
// } else {
167+
// List<Statement> subList = list.subList(0, i);
168+
// newStatements = new Statements(subList);
169+
// subList.clear();
170+
// }
171+
//
172+
// // Removes statements from original list
173+
// len -= newStatements.size();
174+
// i = 0;
175+
//
176+
// addStaticInitializerDeclaration(sid, newLineNumber, newStatements);
177+
// }
178+
//
179+
// lastLineNumber = newLineNumber;
107180
}
108181
}
109182
}
183+
} else {
184+
// Single statement
185+
if (isAssertionsDisabled(statements.getFirst())) {
186+
// Remove assert initialization statement
187+
statements = null;
188+
}
189+
if ((statements != null) && setStaticFieldInitializer(statements.getFirst(), fields.iterator())) {
190+
// Remove field initialization statement
191+
statements = null;
192+
}
193+
}
194+
195+
if ((statements == null) || (statements.size() == 0)) {
196+
deleteStaticDeclaration = Boolean.TRUE;
197+
} else {
198+
int firstLineNumber = getFirstLineNumber(statements);
199+
sid.setFirstLineNumber((firstLineNumber==-1) ? 0 : firstLineNumber);
200+
deleteStaticDeclaration = Boolean.FALSE;
110201
}
202+
}
203+
}
111204

112-
Iterator<Statement> statementIterator = statements.iterator();
113-
Iterator<FieldDeclarator> fieldDeclaratorIterator = fields.iterator();
205+
protected boolean isAssertionsDisabled(Statement statement) {
206+
if ((statement.getClass() == ExpressionStatement.class)) {
207+
ExpressionStatement cdes = (ExpressionStatement) statement;
114208

115-
while (statementIterator.hasNext()) {
116-
Statement statement = statementIterator.next();
209+
if (cdes.getExpression().getClass() == BinaryOperatorExpression.class) {
210+
BinaryOperatorExpression cfboe = (BinaryOperatorExpression) cdes.getExpression();
117211

118-
if (statement.getClass() != ExpressionStatement.class) {
119-
break;
212+
if (cfboe.getLeftExpression().getClass() == FieldReferenceExpression.class) {
213+
FieldReferenceExpression fre = (FieldReferenceExpression) cfboe.getLeftExpression();
214+
215+
if ((fre.getType() == PrimitiveType.TYPE_BOOLEAN) && fre.getInternalTypeName().equals(internalTypeName) && fre.getName().equals("$assertionsDisabled")) {
216+
return true;
217+
}
120218
}
219+
}
220+
}
121221

122-
ExpressionStatement cdes = (ExpressionStatement) statement;
222+
return false;
223+
}
123224

124-
if (cdes.getExpression().getClass() != BinaryOperatorExpression.class) {
125-
break;
126-
}
225+
protected boolean setStaticFieldInitializer(Statement statement, Iterator<FieldDeclarator> fieldDeclaratorIterator) {
226+
if (statement.getClass() == ExpressionStatement.class) {
227+
ExpressionStatement cdes = (ExpressionStatement) statement;
127228

229+
if (cdes.getExpression().getClass() == BinaryOperatorExpression.class) {
128230
BinaryOperatorExpression cfboe = (BinaryOperatorExpression) cdes.getExpression();
129231

130-
if (cfboe.getLeftExpression().getClass() != FieldReferenceExpression.class) {
131-
break;
132-
}
232+
if (cfboe.getLeftExpression().getClass() == FieldReferenceExpression.class) {
233+
FieldReferenceExpression fre = (FieldReferenceExpression) cfboe.getLeftExpression();
133234

134-
FieldReferenceExpression fre = (FieldReferenceExpression) cfboe.getLeftExpression();
235+
if (fre.getInternalTypeName().equals(internalTypeName)) {
236+
while (fieldDeclaratorIterator.hasNext()) {
237+
FieldDeclarator fdr = fieldDeclaratorIterator.next();
238+
FieldDeclaration fdn = fdr.getFieldDeclaration();
135239

136-
if (!fre.getInternalTypeName().equals(internalTypeName)) {
137-
break;
138-
}
240+
if (((fdn.getFlags() & Declaration.FLAG_STATIC) != 0) && fdr.getName().equals(fre.getName()) && fdn.getType().getDescriptor().equals(fre.getDescriptor())) {
241+
Expression expression = cfboe.getRightExpression();
139242

140-
FieldDeclarator fieldDeclarator = null;
243+
searchLocalVariableReferenceVisitor.init(-1);
244+
expression.accept(searchLocalVariableReferenceVisitor);
141245

142-
while (fieldDeclaratorIterator.hasNext()) {
143-
FieldDeclarator fdr = fieldDeclaratorIterator.next();
144-
FieldDeclaration fdn = fdr.getFieldDeclaration();
246+
if (searchLocalVariableReferenceVisitor.containsReference()) {
247+
return false;
248+
}
145249

146-
if (((fdn.getFlags() & Declaration.FLAG_STATIC) != 0) && fdr.getName().equals(fre.getName()) && fdn.getType().getDescriptor().equals(fre.getDescriptor())) {
147-
fieldDeclarator = fdr;
148-
break;
149-
}
150-
}
151-
152-
if (fieldDeclarator == null) {
153-
break;
154-
} else {
155-
Expression expression = cfboe.getRightExpression();
250+
fdr.setVariableInitializer(new ExpressionVariableInitializer(expression));
251+
((ClassFileFieldDeclaration)fdr.getFieldDeclaration()).setFirstLineNumber(expression.getLineNumber());
156252

157-
fieldDeclarator.setVariableInitializer(new ExpressionVariableInitializer(expression));
158-
((ClassFileFieldDeclaration)fieldDeclarator.getFieldDeclaration()).setFirstLineNumber(expression.getLineNumber());
159-
statementIterator.remove();
253+
return true;
254+
}
255+
}
256+
}
160257
}
161258
}
259+
}
162260

163-
if (statements.size() == 0) {
164-
staticDeclaration.setStatements(null);
165-
staticDeclaration.setFirstLineNumber(0);
166-
} else {
167-
searchFirstLineNumberVisitor.init();
168-
staticDeclaration.getStatements().accept(searchFirstLineNumberVisitor);
169-
int firstLineNumber = searchFirstLineNumberVisitor.getLineNumber();
261+
return false;
262+
}
170263

171-
staticDeclaration.setFirstLineNumber((firstLineNumber==-1) ? 0 : firstLineNumber);
172-
}
173-
}
264+
protected int getFirstLineNumber(BaseStatement baseStatement) {
265+
searchFirstLineNumberVisitor.init();
266+
baseStatement.accept(searchFirstLineNumberVisitor);
267+
return searchFirstLineNumberVisitor.getLineNumber();
174268
}
175269

176-
@Override
177-
public void visit(FieldDeclarator declaration) {
178-
fields.add(declaration);
270+
protected void addStaticInitializerDeclaration(ClassFileStaticInitializerDeclaration sid, int lineNumber, BaseStatement statements) {
271+
methods.add(new ClassFileStaticInitializerDeclaration(
272+
sid.getBodyDeclaration(), sid.getClassFile(), sid.getMethod(), sid.getBindings(),
273+
sid.getTypeBounds(), lineNumber, statements));
179274
}
180275
}

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

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ public class SearchLocalVariableReferenceVisitor extends AbstractJavaSyntaxVisit
1616
protected int index;
1717
protected boolean found;
1818

19-
public SearchLocalVariableReferenceVisitor(AbstractLocalVariable alv) {
20-
this.index = alv.getIndex();
19+
public void init(int index) {
20+
this.index = index;
2121
this.found = false;
2222
}
2323

@@ -27,7 +27,11 @@ public boolean containsReference() {
2727

2828
@Override
2929
public void visit(LocalVariableReferenceExpression expression) {
30-
ClassFileLocalVariableReferenceExpression referenceExpression = (ClassFileLocalVariableReferenceExpression)expression;
31-
found |= referenceExpression.getLocalVariable().getIndex() == index;
30+
if (index < 0) {
31+
found = true;
32+
} else {
33+
ClassFileLocalVariableReferenceExpression referenceExpression = (ClassFileLocalVariableReferenceExpression) expression;
34+
found |= referenceExpression.getLocalVariable().getIndex() == index;
35+
}
3236
}
3337
}

src/main/java/org/jd/core/v1/service/fragmenter/javasyntaxtojavafragment/visitor/CompilationUnitVisitor.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1206,7 +1206,6 @@ public void visit(StaticInitializerDeclaration declaration) {
12061206

12071207
tokens = new Tokens();
12081208
tokens.add(STATIC);
1209-
tokens.add(TextToken.SPACE);
12101209
fragments.addTokensFragment(tokens);
12111210

12121211
StartBodyFragment start = JavaFragmentFactory.addStartMethodBody(fragments);

0 commit comments

Comments
 (0)