@@ -189,7 +189,6 @@ public boolean visit(AnonymousClassDeclaration node) {
189
189
//
190
190
String fullClassName = anonClassName ;
191
191
// String fullClassName = null;
192
- String packageName = ((ASTPackageVisitor ) getAdaptable (ASTPackageVisitor .class )).getPackageName ();
193
192
// if (packageName != null && packageName.length() != 0) {
194
193
// fullClassName = packageName + '.' + anonymousName;
195
194
// } else {
@@ -202,9 +201,9 @@ public boolean visit(AnonymousClassDeclaration node) {
202
201
// fullClassName = anonymousName;
203
202
// }
204
203
205
- buffer .append ("(Clazz.isClassDefined (\" " );
206
- buffer .append (fullClassName );
207
- buffer .append ("\" ) ? 0 : " );
204
+ // buffer.append("(Clazz.isClassDefined (\"");
205
+ // buffer.append(fullClassName);
206
+ // buffer.append("\") ? 0 : ");
208
207
209
208
StringBuffer tmpBuffer = buffer ;
210
209
buffer = methodBuffer ;
@@ -213,6 +212,7 @@ public boolean visit(AnonymousClassDeclaration node) {
213
212
buffer .append ("cla$$.$" );
214
213
buffer .append (shortClassName );
215
214
buffer .append ("$ = function () {\r \n " );
215
+ buffer .append ("if (Clazz.isClassDefined (\" " ).append (fullClassName ).append ("\" )) " ).append ("return " ).append (fullClassName ).append (";\r \n " );
216
216
217
217
buffer .append ("Clazz.pu$h ();\r \n " );
218
218
buffer .append ("cla$$ = " );
@@ -401,31 +401,46 @@ public boolean visit(AnonymousClassDeclaration node) {
401
401
}
402
402
}
403
403
404
+ buffer .append ("var rc = cla$$;\r \n " );
404
405
buffer .append ("cla$$ = Clazz.p0p ();\r \n " );
405
406
406
407
typeVisitor .setClassName (oldClassName );
407
408
408
409
buffer .append (laterBuffer );
409
410
laterBuffer = oldLaterBuffer ;
410
411
412
+ buffer .append ("return rc;\r \n " );
411
413
buffer .append ("};\r \n " );
412
414
413
415
String methods = methodBuffer .toString ();
414
416
methodBuffer = buffer ;
415
417
methodBuffer .append (methods );
416
418
buffer = tmpBuffer ;
417
419
418
- buffer .append (packageName );
419
- buffer .append ("." );
420
- idx = className .indexOf ('$' );
421
- if (idx != -1 ) {
422
- buffer .append (className .substring (0 , idx ));
423
- } else {
424
- buffer .append (className );
420
+ ITypeBinding declareClass = binding ;
421
+ boolean prefixed = false ;
422
+ while (declareClass != null ) {
423
+ if (!declareClass .isAnonymous ()) {
424
+ buffer .append (declareClass .getQualifiedName ());
425
+ prefixed = true ;
426
+ break ;
427
+ }
428
+ declareClass = declareClass .getDeclaringClass ();
429
+ }
430
+ if (!prefixed ) {
431
+ String packageName = ((ASTPackageVisitor ) getAdaptable (ASTPackageVisitor .class )).getPackageName ();
432
+ buffer .append (packageName );
433
+ buffer .append ("." );
434
+ idx = className .indexOf ('$' );
435
+ if (idx != -1 ) {
436
+ buffer .append (className .substring (0 , idx ));
437
+ } else {
438
+ buffer .append (className );
439
+ }
425
440
}
426
441
buffer .append (".$" );
427
442
buffer .append (shortClassName );
428
- buffer .append ("$ ()) " );
443
+ buffer .append ("$ ()" );
429
444
/*
430
445
* Anonymouse class won't have static members and methods and initializers
431
446
*/
@@ -625,7 +640,9 @@ public boolean visit(ClassInstanceCreation node) {
625
640
// StringBuffer tmpBuffer = buffer;
626
641
// buffer = methodBuffer;
627
642
628
- buffer .append ("(" );
643
+ // buffer.append("(");
644
+ buffer .append ("Clazz.innerTypeInstance (" );
645
+ // buffer.append(anonClassName);
629
646
// buffer.append(baseClassName);
630
647
// buffer.append(".$");
631
648
// buffer.append(shortClassName);
@@ -651,10 +668,8 @@ public boolean visit(ClassInstanceCreation node) {
651
668
methodDeclareStack .push (binding .getKey ());
652
669
anonDeclare .accept (this );
653
670
methodDeclareStack .pop ();
654
- buffer .append (", " );
671
+ // buffer.append(", ");
655
672
656
- buffer .append ("Clazz.innerTypeInstance (" );
657
- buffer .append (anonClassName );
658
673
buffer .append (", this, " );
659
674
String scope = null ;
660
675
if (methodDeclareStack .size () != 0 ) {
@@ -689,7 +704,7 @@ public boolean visit(ClassInstanceCreation node) {
689
704
currentBlockForVisit = lastCurrentBlock ;
690
705
//buffer.append("};\r\n");
691
706
buffer .append (")" ); // Clazz.innerTypeInstance
692
- buffer .append (")" ); // end of line (..., ...)
707
+ // buffer.append(")"); // end of line (..., ...)
693
708
694
709
// methodBuffer = buffer;
695
710
// buffer = tmpBuffer;
@@ -2406,10 +2421,14 @@ private void appendFieldName(ASTNode parent, ITypeBinding declaringClass) {
2406
2421
String name = declaringClass .getQualifiedName ();
2407
2422
boolean isThis = false ;
2408
2423
int superLevel = 0 ;
2424
+ ITypeBinding originalType = null ;
2409
2425
while (parent != null ) {
2410
2426
if (parent instanceof AbstractTypeDeclaration ) {
2411
2427
AbstractTypeDeclaration type = (AbstractTypeDeclaration ) parent ;
2412
2428
ITypeBinding typeBinding = type .resolveBinding ();
2429
+ if (typeBinding != null && originalType == null ) {
2430
+ originalType = typeBinding ;
2431
+ }
2413
2432
superLevel ++;
2414
2433
if (Bindings .isSuperType (declaringClass , typeBinding )) {
2415
2434
if (superLevel == 1 ) {
@@ -2423,6 +2442,9 @@ private void appendFieldName(ASTNode parent, ITypeBinding declaringClass) {
2423
2442
} else if (parent instanceof AnonymousClassDeclaration ) {
2424
2443
AnonymousClassDeclaration type = (AnonymousClassDeclaration ) parent ;
2425
2444
ITypeBinding typeBinding = type .resolveBinding ();
2445
+ if (typeBinding != null && originalType == null ) {
2446
+ originalType = typeBinding ;
2447
+ }
2426
2448
superLevel ++;
2427
2449
if (Bindings .isSuperType (declaringClass , typeBinding )) {
2428
2450
if (superLevel == 1 ) {
@@ -2465,7 +2487,23 @@ private void appendFieldName(ASTNode parent, ITypeBinding declaringClass) {
2465
2487
}
2466
2488
if (!isThis ) {
2467
2489
buffer .append ("this.callbacks[\" " );
2468
- buffer .append (shortenQualifiedName (name ));
2490
+ //buffer.append(shortenQualifiedName(name));
2491
+ StringBuilder dollarBuilder = new StringBuilder ();
2492
+ if (originalType != null ) {
2493
+ ITypeBinding thisDeclaringClass = originalType .getDeclaringClass ();
2494
+ while (thisDeclaringClass != null ) {
2495
+ dollarBuilder .append ("$" );
2496
+ thisDeclaringClass = thisDeclaringClass .getDeclaringClass ();
2497
+ }
2498
+ }
2499
+ declaringClass = declaringClass .getDeclaringClass ();
2500
+ while (declaringClass != null ) {
2501
+ if (dollarBuilder .length () > 0 ) {
2502
+ dollarBuilder .deleteCharAt (0 );
2503
+ }
2504
+ declaringClass = declaringClass .getDeclaringClass ();
2505
+ }
2506
+ buffer .append (dollarBuilder );
2469
2507
buffer .append ("\" ]." );
2470
2508
}
2471
2509
}
@@ -2583,8 +2621,57 @@ public boolean visit(SuperFieldAccess node) {
2583
2621
}
2584
2622
2585
2623
public boolean visit (SuperMethodInvocation node ) {
2586
- buffer .append ("Clazz.superCall (this, " );
2587
- buffer .append (assureQualifiedName (shortenQualifiedName (getFullClassName ())));
2624
+ boolean extraSuper = false ;
2625
+ Name qualifier = node .getQualifier ();
2626
+ if (qualifier != null ) {
2627
+ String fullyQualifiedName = null ;
2628
+ ITypeBinding typeBinding = qualifier .resolveTypeBinding ();
2629
+ if (typeBinding != null ) {
2630
+ fullyQualifiedName = typeBinding .getQualifiedName ();
2631
+ }
2632
+ if (fullyQualifiedName != null && !fullyQualifiedName .equals (getFullClassName ())) {
2633
+ ITypeBinding originalType = null ;
2634
+ ASTNode parent = node .getParent ();
2635
+ while (parent != null ) {
2636
+ if (parent instanceof AbstractTypeDeclaration ) {
2637
+ AbstractTypeDeclaration type = (AbstractTypeDeclaration ) parent ;
2638
+ ITypeBinding parentTypeBinding = type .resolveBinding ();
2639
+ if (parentTypeBinding != null && originalType == null ) {
2640
+ originalType = parentTypeBinding ;
2641
+ }
2642
+ } else if (parent instanceof AnonymousClassDeclaration ) {
2643
+ AnonymousClassDeclaration type = (AnonymousClassDeclaration ) parent ;
2644
+ ITypeBinding parentTypeBinding = type .resolveBinding ();
2645
+ if (parentTypeBinding != null && originalType == null ) {
2646
+ originalType = parentTypeBinding ;
2647
+ }
2648
+ }
2649
+ parent = parent .getParent ();
2650
+ }
2651
+ StringBuilder dollarBuilder = new StringBuilder ();
2652
+ if (originalType != null ) {
2653
+ ITypeBinding thisDeclaringClass = originalType .getDeclaringClass ();
2654
+ while (thisDeclaringClass != null ) {
2655
+ dollarBuilder .append ("$" );
2656
+ thisDeclaringClass = thisDeclaringClass .getDeclaringClass ();
2657
+ }
2658
+ }
2659
+ ITypeBinding declaringClass = typeBinding .getDeclaringClass ();
2660
+ while (declaringClass != null ) {
2661
+ if (dollarBuilder .length () > 0 ) {
2662
+ dollarBuilder .deleteCharAt (0 );
2663
+ }
2664
+ declaringClass = declaringClass .getDeclaringClass ();
2665
+ }
2666
+ buffer .append ("Clazz.superCall (this.callbacks[\" " ).append (dollarBuilder ).append ("\" ], " );
2667
+ buffer .append (assureQualifiedName (shortenQualifiedName (fullyQualifiedName )));
2668
+ extraSuper = true ;
2669
+ }
2670
+ }
2671
+ if (!extraSuper ) {
2672
+ buffer .append ("Clazz.superCall (this, " );
2673
+ buffer .append (assureQualifiedName (shortenQualifiedName (getFullClassName ())));
2674
+ }
2588
2675
buffer .append (", \" " );
2589
2676
String name = getJ2SName (node .getName ());
2590
2677
buffer .append (name );
@@ -2614,7 +2701,44 @@ public boolean visit(ThisExpression node) {
2614
2701
* or anonymous classes.
2615
2702
*/
2616
2703
buffer .append ("this.callbacks[\" " );
2617
- qualifier .accept (this );
2704
+ //qualifier.accept(this);
2705
+ ITypeBinding originalType = null ;
2706
+ ASTNode parent = node .getParent ();
2707
+ while (parent != null ) {
2708
+ if (parent instanceof AbstractTypeDeclaration ) {
2709
+ AbstractTypeDeclaration type = (AbstractTypeDeclaration ) parent ;
2710
+ ITypeBinding parentTypeBinding = type .resolveBinding ();
2711
+ if (parentTypeBinding != null && originalType == null ) {
2712
+ originalType = parentTypeBinding ;
2713
+ }
2714
+ } else if (parent instanceof AnonymousClassDeclaration ) {
2715
+ AnonymousClassDeclaration type = (AnonymousClassDeclaration ) parent ;
2716
+ ITypeBinding parentTypeBinding = type .resolveBinding ();
2717
+ if (parentTypeBinding != null && originalType == null ) {
2718
+ originalType = parentTypeBinding ;
2719
+ }
2720
+ }
2721
+ parent = parent .getParent ();
2722
+ }
2723
+ StringBuilder dollarBuilder = new StringBuilder ();
2724
+ if (originalType != null ) {
2725
+ ITypeBinding thisDeclaringClass = originalType .getDeclaringClass ();
2726
+ while (thisDeclaringClass != null ) {
2727
+ dollarBuilder .append ("$" );
2728
+ thisDeclaringClass = thisDeclaringClass .getDeclaringClass ();
2729
+ }
2730
+ }
2731
+ ITypeBinding typeBinding = qualifier .resolveTypeBinding ();
2732
+ if (typeBinding != null ) { // always true
2733
+ ITypeBinding declaringClass = typeBinding .getDeclaringClass ();
2734
+ while (declaringClass != null ) {
2735
+ if (dollarBuilder .length () > 0 ) {
2736
+ dollarBuilder .deleteCharAt (0 );
2737
+ }
2738
+ declaringClass = declaringClass .getDeclaringClass ();
2739
+ }
2740
+ }
2741
+ buffer .append (dollarBuilder );
2618
2742
buffer .append ("\" ]" );
2619
2743
}
2620
2744
} else {
0 commit comments