Skip to content

Commit a94f5b9

Browse files
author
emmanue1
committed
Remove some outer local variable references
1 parent 73f08cf commit a94f5b9

File tree

2 files changed

+58
-56
lines changed

2 files changed

+58
-56
lines changed

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

Lines changed: 50 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -133,11 +133,13 @@ public void visit(ConstructorDeclaration declaration) {
133133
int size = list.size();
134134
list.subList(size - count, size).clear();
135135
}
136-
} else if (outerType != null) {
136+
} else if ((outerType != null) || !outerLocalVariableNames.isEmpty()) {
137+
// Remove outer this and outer local variable reference
137138
cfcd.setFormalParameters(null);
138139
}
139140
}
140141

142+
// Hide anonymous class constructor
141143
ClassFile outerClassFile = cfcd.getClassFile().getOuterClassFile();
142144

143145
if (outerClassFile != null) {
@@ -170,65 +172,56 @@ public void visit(ConstructorDeclaration declaration) {
170172
}
171173
}
172174

173-
@Override
174-
public void visit(MethodDeclaration declaration) {}
175-
176-
@Override
177-
public void visit(StaticInitializerDeclaration declaration) {}
175+
@Override public void visit(MethodDeclaration declaration) {}
176+
@Override public void visit(StaticInitializerDeclaration declaration) {}
178177

179-
protected class UpdateFieldReferencesVisitor extends AbstractJavaSyntaxVisitor {
178+
protected class UpdateFieldReferencesVisitor extends AbstractUpdateExpressionVisitor {
180179
@Override
181180
public void visit(BodyDeclaration declaration) {
182-
ClassFileBodyDeclaration bodyDeclaration = (ClassFileBodyDeclaration)declaration;
183-
safeAcceptListDeclaration(bodyDeclaration.getMethodDeclarations());
181+
safeAcceptListDeclaration(((ClassFileBodyDeclaration)declaration).getMethodDeclarations());
184182
}
185183

184+
@Override public void visit(StaticInitializerDeclaration declaration) {}
185+
186186
@Override
187187
public void visit(MethodDeclaration declaration) {
188188
safeAccept(declaration.getStatements());
189189
}
190190

191191
@Override
192-
public void visit(FieldReferenceExpression expression) {
193-
FieldReferenceExpression cffre = expression;
194-
195-
if (outerLocalVariableNames.contains(expression.getName())) {
196-
cffre.setName(cffre.getName().substring(4));
197-
cffre.setExpression(null);
198-
} else if (cffre.getExpression() != null) {
199-
Class clazz = cffre.getExpression().getClass();
200-
201-
if (clazz == FieldReferenceExpression.class) {
202-
FieldReferenceExpression cffre2 = (FieldReferenceExpression) cffre.getExpression();
203-
204-
if (cffre2.getName().startsWith("this$") && cffre2.getDescriptor().equals(outerType.getDescriptor())) {
205-
cffre.setExpression(new FieldReferenceExpression(outerType, new ObjectTypeReferenceExpression(cffre2.getLineNumber(), outerType), outerType.getInternalName(), "this", outerType.getDescriptor()));
206-
}
207-
} else if (clazz == ClassFileLocalVariableReferenceExpression.class) {
208-
ClassFileLocalVariableReferenceExpression cdlvre = (ClassFileLocalVariableReferenceExpression) cffre.getExpression();
192+
public void visit(NewExpression expression) {
193+
if (expression.getParameters() != null) {
194+
expression.setParameters(updateBaseExpression(expression.getParameters()));
195+
expression.getParameters().accept(this);
196+
}
197+
safeAccept(expression.getBodyDeclaration());
198+
}
209199

210-
if ((cdlvre.getName() != null) && cdlvre.getName().startsWith("this$") && cdlvre.getType().getDescriptor().equals(outerType.getDescriptor())) {
211-
cffre.setExpression(new FieldReferenceExpression(outerType, new ObjectTypeReferenceExpression(cdlvre.getLineNumber(), outerType), outerType.getInternalName(), "this", outerType.getDescriptor()));
212-
}
213-
} else if (clazz == ThisExpression.class) {
214-
if (cffre.getName().startsWith("this$") && cffre.getType().getDescriptor().equals(outerType.getDescriptor())) {
215-
cffre.setExpression(new ObjectTypeReferenceExpression(cffre.getExpression().getLineNumber(), outerType));
216-
cffre.setName("this");
217-
}
218-
}
200+
@Override
201+
public void visit(FieldReferenceExpression expression) {
202+
if (expression.getName().startsWith("this$") && expression.getType().getDescriptor().equals(outerType.getDescriptor())) {
203+
Expression exp = (expression.getExpression() == null) ? expression : expression.getExpression();
204+
expression.setExpression(new ObjectTypeReferenceExpression(exp.getLineNumber(), outerType));
205+
expression.setName("this");
206+
} else if (outerLocalVariableNames.contains(expression.getName())) {
207+
expression.setName(expression.getName().substring(4));
208+
expression.setExpression(null);
209+
} else {
210+
super.visit(expression);
219211
}
220212
}
221213

222214
@Override
223-
public void visit(NewExpression expression) {
224-
safeAccept(expression.getParameters());
225-
if (expression.getBodyDeclaration() != null) {
226-
ClassFileBodyDeclaration bodyDeclaration = (ClassFileBodyDeclaration)expression.getBodyDeclaration();
215+
protected Expression updateExpression(Expression expression) {
216+
if (expression.getClass() == ClassFileLocalVariableReferenceExpression.class) {
217+
ClassFileLocalVariableReferenceExpression cdlvre = (ClassFileLocalVariableReferenceExpression) expression;
227218

228-
for (ClassFileConstructorOrMethodDeclaration comd : bodyDeclaration.getMethodDeclarations()) {
229-
safeAccept(comd.getStatements());
219+
if ((cdlvre.getName() != null) && cdlvre.getName().startsWith("this$") && cdlvre.getType().getDescriptor().equals(outerType.getDescriptor())) {
220+
return new FieldReferenceExpression(outerType, new ObjectTypeReferenceExpression(cdlvre.getLineNumber(), outerType), outerType.getInternalName(), "this", outerType.getDescriptor());
230221
}
231222
}
223+
224+
return expression;
232225
}
233226
}
234227

@@ -447,24 +440,30 @@ public void visit(NewExpression expression) {
447440

448441
@Override
449442
public void visit(SuperConstructorInvocationExpression expression) {
450-
ClassFileMemberDeclaration memberDeclaration = bodyDeclaration.getInnerTypeDeclaration(superTypeName);
443+
BaseExpression parameters = expression.getParameters();
444+
445+
if ((parameters != null) && (parameters.size() > 0)) {
446+
ClassFileMemberDeclaration memberDeclaration = bodyDeclaration.getInnerTypeDeclaration(superTypeName);
451447

452-
if ((memberDeclaration != null) && (memberDeclaration.getClass() == ClassFileClassDeclaration.class)) {
453-
ClassFileClassDeclaration cfcd = (ClassFileClassDeclaration) memberDeclaration;
454-
ClassFileBodyDeclaration cfbd = (ClassFileBodyDeclaration) cfcd.getBodyDeclaration();
448+
if ((memberDeclaration != null) && (memberDeclaration.getClass() == ClassFileClassDeclaration.class)) {
449+
ClassFileClassDeclaration cfcd = (ClassFileClassDeclaration) memberDeclaration;
450+
ClassFileBodyDeclaration cfbd = (ClassFileBodyDeclaration) cfcd.getBodyDeclaration();
455451

456-
if (cfbd.getOuterType() != null) {
457-
assert expression.getParameters().getFirst().getType().equals(cfbd.getOuterType());
458-
expression.setParameters(removeOuterThisParameter(expression.getParameters()));
452+
if (parameters.getFirst().getType().equals(cfbd.getOuterType())) {
453+
expression.setParameters(removeOuterThisParameter(parameters));
454+
}
459455
}
460456
}
461457
}
462458

463459
@Override
464460
public void visit(ConstructorInvocationExpression expression) {
465-
if (bodyDeclaration.getOuterType() != null) {
466-
assert expression.getParameters().getFirst().getType().equals(bodyDeclaration.getOuterType());
467-
expression.setParameters(removeOuterThisParameter(expression.getParameters()));
461+
BaseExpression parameters = expression.getParameters();
462+
463+
if ((parameters != null) && (parameters.size() > 0)) {
464+
if (parameters.getFirst().getType().equals(bodyDeclaration.getOuterType())) {
465+
expression.setParameters(removeOuterThisParameter(parameters));
466+
}
468467
}
469468
}
470469

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

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,11 @@ protected Expression updateExpression(Expression expression) {
152152
protected class BodyDeclarationsVisitor extends AbstractJavaSyntaxVisitor {
153153
protected HashMap<String, ClassFileMethodDeclaration> map = null;
154154

155+
@Override public void visit(ClassDeclaration declaration) { safeAccept(declaration.getBodyDeclaration()); }
156+
@Override public void visit(EnumDeclaration declaration) { safeAccept(declaration.getBodyDeclaration()); }
157+
@Override public void visit(InterfaceDeclaration declaration) {}
158+
@Override public void visit(AnnotationDeclaration declaration) {}
159+
155160
@Override
156161
public void visit(BodyDeclaration declaration) {
157162
ClassFileBodyDeclaration bodyDeclaration = (ClassFileBodyDeclaration)declaration;
@@ -174,6 +179,9 @@ public void visit(BodyDeclaration declaration) {
174179
safeAcceptListDeclaration(bodyDeclaration.getInnerTypeDeclarations());
175180
}
176181

182+
@Override public void visit(StaticInitializerDeclaration declaration) {}
183+
@Override public void visit(ConstructorDeclaration declaration) {}
184+
177185
@Override
178186
public void visit(MethodDeclaration declaration) {
179187
if ((declaration.getFlags() & FLAG_STATIC) == 0) {
@@ -201,11 +209,6 @@ public void visit(MethodDeclaration declaration) {
201209
map.put(name + declaration.getDescriptor(), bridgeMethodDeclaration);
202210
}
203211

204-
@Override public void visit(ClassDeclaration declaration) { safeAccept(declaration.getBodyDeclaration()); }
205-
@Override public void visit(EnumDeclaration declaration) { safeAccept(declaration.getBodyDeclaration()); }
206-
@Override public void visit(InterfaceDeclaration declaration) {}
207-
@Override public void visit(AnnotationDeclaration declaration) {}
208-
209212
private boolean checkBridgeMethodDeclaration(ClassFileMethodDeclaration bridgeMethodDeclaration) {
210213
Statement statement = bridgeMethodDeclaration.getStatements().getFirst();
211214
Class statementClass = statement.getClass();

0 commit comments

Comments
 (0)