@@ -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
0 commit comments