Skip to content

Commit bcf976b

Browse files
author
emmanue1
committed
Fix bug in enum constant declarations
1 parent f1a57ed commit bcf976b

File tree

3 files changed

+37
-22
lines changed

3 files changed

+37
-22
lines changed

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
package org.jd.core.v1.service.converter.classfiletojavasyntax.model.javasyntax.declaration;
99

10+
import org.jd.core.v1.model.javasyntax.declaration.BodyDeclaration;
1011
import org.jd.core.v1.model.javasyntax.declaration.EnumDeclaration;
1112
import org.jd.core.v1.model.javasyntax.expression.BaseExpression;
1213
import org.jd.core.v1.model.javasyntax.reference.BaseAnnotationReference;
@@ -43,8 +44,8 @@ public String toString() {
4344
public static class ClassFileConstant extends Constant {
4445
protected int index;
4546

46-
public ClassFileConstant(int lineNumber, String name, int index, BaseExpression arguments) {
47-
super(lineNumber, name, arguments);
47+
public ClassFileConstant(int lineNumber, String name, int index, BaseExpression arguments, BodyDeclaration bodyDeclaration) {
48+
super(lineNumber, name, arguments, bodyDeclaration);
4849
this.index = index;
4950
}
5051

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

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020

2121

2222
public class InitEnumVisitor extends AbstractJavaSyntaxVisitor {
23+
protected ClassFileBodyDeclaration bodyDeclaration = null;
24+
protected BodyDeclaration constantBodyDeclaration = null;
2325
protected DefaultList<ClassFileEnumDeclaration.ClassFileConstant> constants = new DefaultList<>();
2426
protected int lineNumber;
2527
protected int index;
@@ -36,10 +38,13 @@ public DefaultList<EnumDeclaration.Constant> getConstants() {
3638

3739
@Override
3840
public void visit(BodyDeclaration declaration) {
39-
ClassFileBodyDeclaration bodyDeclaration = (ClassFileBodyDeclaration)declaration;
41+
ClassFileBodyDeclaration bd = bodyDeclaration;
42+
43+
bodyDeclaration = (ClassFileBodyDeclaration)declaration;
4044
constants.clear();
4145
safeAcceptListDeclaration(bodyDeclaration.getFieldDeclarations());
4246
safeAcceptListDeclaration(bodyDeclaration.getMethodDeclarations());
47+
bodyDeclaration = bd;
4348
}
4449

4550
@Override
@@ -89,8 +94,9 @@ public void visit(FieldDeclaration declaration) {
8994

9095
@Override
9196
public void visit(FieldDeclarator declaration) {
97+
constantBodyDeclaration = null;
9298
safeAccept(declaration.getVariableInitializer());
93-
constants.add(new ClassFileEnumDeclaration.ClassFileConstant(lineNumber, declaration.getName(), index, arguments));
99+
constants.add(new ClassFileEnumDeclaration.ClassFileConstant(lineNumber, declaration.getName(), index, arguments, constantBodyDeclaration));
94100
}
95101

96102
@Override
@@ -115,6 +121,15 @@ public void visit(NewExpression expression) {
115121
parameters.subList(0, 2).clear();
116122
arguments = parameters;
117123
}
124+
125+
String enumInternalTypeName = expression.getObjectType().getInternalName();
126+
127+
if (!enumInternalTypeName.equals(bodyDeclaration.getInternalTypeName())) {
128+
ClassFileMemberDeclaration md = bodyDeclaration.getInnerTypeDeclaration(enumInternalTypeName);
129+
if (md != null) {
130+
constantBodyDeclaration = ((ClassFileEnumDeclaration)md).getBodyDeclaration();
131+
}
132+
}
118133
}
119134

120135
protected static class EnumConstantComparator implements Comparator<ClassFileEnumDeclaration.ClassFileConstant> {

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

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.jd.core.v1.model.javasyntax.expression.BinaryOperatorExpression;
1313
import org.jd.core.v1.model.javasyntax.expression.Expression;
1414
import org.jd.core.v1.model.javasyntax.expression.FieldReferenceExpression;
15+
import org.jd.core.v1.model.javasyntax.statement.BaseStatement;
1516
import org.jd.core.v1.model.javasyntax.statement.ExpressionStatement;
1617
import org.jd.core.v1.model.javasyntax.statement.Statement;
1718
import org.jd.core.v1.model.javasyntax.type.PrimitiveType;
@@ -84,27 +85,25 @@ public void visit(MethodDeclaration declaration) {}
8485
public void visit(StaticInitializerDeclaration declaration) {
8586
staticDeclaration = (ClassFileStaticInitializerDeclaration) declaration;
8687

87-
if (!staticDeclaration.getStatements().isList()) {
88-
return;
89-
}
90-
91-
DefaultList<Statement> statements = staticDeclaration.getStatements().getList();
88+
BaseStatement statements = staticDeclaration.getStatements();
9289

93-
if ((statements != null) && !statements.isEmpty()) {
94-
Statement statement = statements.getFirst();
90+
if ((statements != null) && (statements.size() > 0)) {
91+
if (statements.isList()) {
92+
Statement statement = statements.getFirst();
9593

96-
if (statement.getClass() == ExpressionStatement.class) {
97-
ExpressionStatement cdes = (ExpressionStatement) statement;
94+
if ((statement.getClass() == ExpressionStatement.class)) {
95+
ExpressionStatement cdes = (ExpressionStatement) statement;
9896

99-
if (cdes.getExpression().getClass() == BinaryOperatorExpression.class) {
100-
BinaryOperatorExpression cfboe = (BinaryOperatorExpression) cdes.getExpression();
97+
if (cdes.getExpression().getClass() == BinaryOperatorExpression.class) {
98+
BinaryOperatorExpression cfboe = (BinaryOperatorExpression) cdes.getExpression();
10199

102-
if (cfboe.getLeftExpression().getClass() == FieldReferenceExpression.class) {
103-
FieldReferenceExpression fre = (FieldReferenceExpression) cfboe.getLeftExpression();
100+
if (cfboe.getLeftExpression().getClass() == FieldReferenceExpression.class) {
101+
FieldReferenceExpression fre = (FieldReferenceExpression) cfboe.getLeftExpression();
104102

105-
if ((fre.getType() == PrimitiveType.TYPE_BOOLEAN) && fre.getInternalTypeName().equals(internalTypeName) && fre.getName().equals("$assertionsDisabled")) {
106-
// Remove assert initialization statement
107-
statements.remove(0);
103+
if ((fre.getType() == PrimitiveType.TYPE_BOOLEAN) && fre.getInternalTypeName().equals(internalTypeName) && fre.getName().equals("$assertionsDisabled")) {
104+
// Remove assert initialization statement
105+
statements.getList().removeFirst();
106+
}
108107
}
109108
}
110109
}
@@ -114,7 +113,7 @@ public void visit(StaticInitializerDeclaration declaration) {
114113
Iterator<FieldDeclarator> fieldDeclaratorIterator = fields.iterator();
115114

116115
while (statementIterator.hasNext()) {
117-
statement = statementIterator.next();
116+
Statement statement = statementIterator.next();
118117

119118
if (statement.getClass() != ExpressionStatement.class) {
120119
break;
@@ -161,7 +160,7 @@ public void visit(StaticInitializerDeclaration declaration) {
161160
}
162161
}
163162

164-
if (statements.isEmpty()) {
163+
if (statements.size() == 0) {
165164
staticDeclaration.setStatements(null);
166165
staticDeclaration.setFirstLineNumber(0);
167166
} else {

0 commit comments

Comments
 (0)