2525import java .util .*;
2626
2727public class InitInnerClassVisitor extends AbstractJavaSyntaxVisitor {
28- protected UpdateReferencesVisitor updateReferencesVisitor = new UpdateReferencesVisitor ();
28+ protected UpdateFieldReferencesVisitor updateFieldReferencesVisitor = new UpdateFieldReferencesVisitor ();
2929 protected ObjectType outerType ;
3030 protected DefaultList <String > outerLocalVariableNames = new DefaultList <>();
3131
@@ -63,7 +63,7 @@ public void visit(BodyDeclaration declaration) {
6363 bodyDeclaration .setOuterLocalVariableNames (outerLocalVariableNames .isEmpty () ? null : new DefaultList <>(outerLocalVariableNames ));
6464
6565 if ((outerType != null ) || !outerLocalVariableNames .isEmpty ()) {
66- updateReferencesVisitor .visit (bodyDeclaration );
66+ updateFieldReferencesVisitor .visit (bodyDeclaration );
6767 }
6868 }
6969
@@ -176,7 +176,7 @@ public void visit(MethodDeclaration declaration) {}
176176 @ Override
177177 public void visit (StaticInitializerDeclaration declaration ) {}
178178
179- protected class UpdateReferencesVisitor extends AbstractJavaSyntaxVisitor {
179+ protected class UpdateFieldReferencesVisitor extends AbstractJavaSyntaxVisitor {
180180 @ Override
181181 public void visit (BodyDeclaration declaration ) {
182182 ClassFileBodyDeclaration bodyDeclaration = (ClassFileBodyDeclaration )declaration ;
@@ -188,71 +188,6 @@ public void visit(MethodDeclaration declaration) {
188188 safeAccept (declaration .getStatements ());
189189 }
190190
191- @ Override
192- public void visit (StaticInitializerDeclaration declaration ) {
193- safeAccept (declaration .getStatements ());
194- }
195-
196- @ Override
197- public void visit (SuperConstructorInvocationExpression expression ) {
198- SuperConstructorInvocationExpression cfscie = expression ;
199-
200- if (cfscie .getParameters () != null ) {
201- if (cfscie .getParameters ().isList ()) {
202- visitParameters (cfscie .getParameters ().getList ());
203- } else {
204- cfscie .setParameters (visitParameter (cfscie .getParameters ().getFirst ()));
205- }
206- }
207- }
208-
209- @ Override
210- public void visit (ConstructorInvocationExpression expression ) {
211- ConstructorInvocationExpression cie = expression ;
212-
213- assert cie .getParameters () != null ;
214-
215- if (cie .getParameters ().isList ()) {
216- DefaultList <Expression > parameters = cie .getParameters ().getList ();
217-
218- parameters .remove (0 );
219- assert parameters .size () > 0 ;
220-
221- if (parameters .size () == 1 ) {
222- cie .setParameters (visitParameter (parameters .getFirst ()));
223- } else {
224- visitParameters (parameters );
225- }
226- } else {
227- cie .setParameters (null );
228- }
229- }
230-
231- @ SuppressWarnings ("unchecked" )
232- protected void visitParameters (DefaultList <Expression > list ) {
233- ListIterator <Expression > iterator = list .listIterator ();
234-
235- while (iterator .hasNext ()) {
236- iterator .set (visitParameter (iterator .next ()));
237- }
238- }
239-
240- protected Expression visitParameter (Expression expression ) {
241- if (expression .getClass () == ClassFileLocalVariableReferenceExpression .class ) {
242- ClassFileLocalVariableReferenceExpression cflvre = (ClassFileLocalVariableReferenceExpression )expression ;
243-
244- if (outerLocalVariableNames .contains (cflvre .getName ())) {
245- return new FieldReferenceExpression (cflvre .getType (), new ObjectTypeReferenceExpression (cflvre .getLineNumber (), outerType ), outerType .getInternalName (), cflvre .getName ().substring (4 ), cflvre .getType ().getDescriptor ());
246- } else if ((cflvre .getName () != null ) && cflvre .getName ().startsWith ("this$" ) && cflvre .getType ().getDescriptor ().equals (outerType .getDescriptor ())) {
247- return new FieldReferenceExpression (outerType , new ObjectTypeReferenceExpression (cflvre .getLineNumber (), outerType ), outerType .getInternalName (), "this" , outerType .getDescriptor ());
248- }
249- } else if (expression .getClass () == FieldReferenceExpression .class ) {
250- expression .accept (this );
251- }
252-
253- return expression ;
254- }
255-
256191 @ Override
257192 public void visit (FieldReferenceExpression expression ) {
258193 FieldReferenceExpression cffre = expression ;
@@ -299,6 +234,7 @@ public void visit(NewExpression expression) {
299234
300235 public static class UpdateNewExpressionVisitor extends AbstractJavaSyntaxVisitor {
301236 protected ClassFileBodyDeclaration bodyDeclaration ;
237+ protected String superTypeName ;
302238 protected HashMap <String , String > finalLocalVariableNameMap = new HashMap <>();
303239 protected DefaultList <ClassFileClassDeclaration > localClassDeclarations = new DefaultList <>();
304240 protected HashSet <NewExpression > newExpressions = new HashSet <>();
@@ -312,8 +248,10 @@ public void visit(BodyDeclaration declaration) {
312248
313249 @ Override
314250 public void visit (ConstructorDeclaration declaration ) {
251+ superTypeName = ((ClassFileConstructorDeclaration )declaration ).getClassFile ().getSuperTypeName ();
315252 finalLocalVariableNameMap .clear ();
316253 localClassDeclarations .clear ();
254+
317255 safeAccept (declaration .getStatements ());
318256
319257 if (! finalLocalVariableNameMap .isEmpty ()) {
@@ -507,6 +445,40 @@ public void visit(NewExpression expression) {
507445 }
508446 }
509447
448+ @ Override
449+ public void visit (SuperConstructorInvocationExpression expression ) {
450+ ClassFileMemberDeclaration memberDeclaration = bodyDeclaration .getInnerTypeDeclaration (superTypeName );
451+
452+ if ((memberDeclaration != null ) && (memberDeclaration .getClass () == ClassFileClassDeclaration .class )) {
453+ ClassFileClassDeclaration cfcd = (ClassFileClassDeclaration ) memberDeclaration ;
454+ ClassFileBodyDeclaration cfbd = (ClassFileBodyDeclaration ) cfcd .getBodyDeclaration ();
455+
456+ if (cfbd .getOuterType () != null ) {
457+ assert expression .getParameters ().getFirst ().getType ().equals (cfbd .getOuterType ());
458+ expression .setParameters (removeOuterThisParameter (expression .getParameters ()));
459+ }
460+ }
461+ }
462+
463+ @ Override
464+ 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 ()));
468+ }
469+ }
470+
471+ protected BaseExpression removeOuterThisParameter (BaseExpression parameters ) {
472+ // Remove outer this
473+ if (parameters .isList ()) {
474+ parameters .getList ().removeFirst ();
475+ } else {
476+ parameters = null ;
477+ }
478+
479+ return parameters ;
480+ }
481+
510482 protected class UpdateFinalFieldReferenceVisitor extends AbstractJavaSyntaxVisitor {
511483 protected boolean fina1 ;
512484
0 commit comments