18
18
import java .util .Iterator ;
19
19
import java .util .List ;
20
20
import java .util .Set ;
21
-
22
21
import org .eclipse .jdt .core .dom .ASTNode ;
23
22
import org .eclipse .jdt .core .dom .ASTVisitor ;
24
23
import org .eclipse .jdt .core .dom .AbstractTypeDeclaration ;
@@ -58,6 +57,8 @@ public class DependencyASTVisitor extends ASTVisitor {
58
57
59
58
protected Set classNameSet = new HashSet ();
60
59
60
+ protected Set classBindingSet = new HashSet ();
61
+
61
62
protected Set musts = new HashSet ();
62
63
63
64
protected Set requires = new HashSet ();
@@ -94,6 +95,7 @@ public String[] getClassName() {
94
95
return (String []) classNameSet .toArray (new String [0 ]);
95
96
}
96
97
98
+ /*
97
99
public String getMusts() {
98
100
StringBuffer buf = new StringBuffer();
99
101
buf.append("musts=");
@@ -132,11 +134,49 @@ public String getOptionals() {
132
134
}
133
135
return buf.toString();
134
136
}
137
+ */
135
138
139
+ protected void checkSuperType (Set set ) {
140
+ Set removed = new HashSet ();
141
+ Set reseted = new HashSet ();
142
+ for (Iterator iter = set .iterator (); iter .hasNext ();) {
143
+ Object n = iter .next ();
144
+ if (n instanceof QNTypeBinding ) {
145
+ QNTypeBinding qn = (QNTypeBinding ) n ;
146
+ boolean isRemoved = false ;
147
+ for (Iterator iterator = classBindingSet .iterator (); iterator
148
+ .hasNext ();) {
149
+ ITypeBinding binding = (ITypeBinding ) iterator .next ();
150
+ if (Bindings .isSuperType (binding , qn .binding )) {
151
+ removed .add (qn );
152
+ //set.remove(qn);
153
+ isRemoved = true ;
154
+ break ;
155
+ }
156
+ }
157
+ if (!isRemoved ) {
158
+ reseted .add (qn );
159
+ //set.remove(qn);
160
+ //set.add(qn.qualifiedName);
161
+ }
162
+ }
163
+ }
164
+ set .removeAll (removed );
165
+ set .removeAll (reseted );
166
+ for (Iterator i = reseted .iterator (); i .hasNext ();) {
167
+ QNTypeBinding qn = (QNTypeBinding ) i .next ();
168
+ set .add (qn .qualifiedName );
169
+ }
170
+ }
136
171
public String getDependencyScript (StringBuffer mainJS ) {
172
+ checkSuperType (musts );
173
+ checkSuperType (requires );
174
+ checkSuperType (optionals );
175
+
137
176
musts .remove ("" );
138
177
requires .remove ("" );
139
178
optionals .remove ("" );
179
+
140
180
for (Iterator iter = ignores .iterator (); iter .hasNext ();) {
141
181
String s = (String ) iter .next ();
142
182
if (musts .contains (s )) {
@@ -164,6 +204,7 @@ public String getDependencyScript(StringBuffer mainJS) {
164
204
optionals .remove (s );
165
205
}
166
206
}
207
+
167
208
String js = mainJS .toString ();
168
209
if (musts .size () == 0 && requires .size () == 0 && optionals .size () == 0 ) {
169
210
return js ;
@@ -383,6 +424,7 @@ public boolean visit(TypeDeclaration node) {
383
424
if (resolveBinding .isTopLevel ()) {
384
425
String thisClassName = resolveBinding .getQualifiedName ();
385
426
classNameSet .add (thisClassName );
427
+ classBindingSet .add (resolveBinding );
386
428
}
387
429
Javadoc javadoc = node .getJavadoc ();
388
430
if (javadoc != null ) {
@@ -416,6 +458,7 @@ public boolean visit(EnumDeclaration node) {
416
458
if (resolveBinding .isTopLevel ()) {
417
459
String thisClassName = resolveBinding .getQualifiedName ();
418
460
classNameSet .add (thisClassName );
461
+ classBindingSet .add (resolveBinding );
419
462
}
420
463
Javadoc javadoc = node .getJavadoc ();
421
464
if (javadoc != null ) {
@@ -478,16 +521,20 @@ protected void visitForMusts(AbstractTypeDeclaration node) {
478
521
if (superclassType != null ) {
479
522
ITypeBinding superBinding = superclassType .resolveBinding ();
480
523
if (superBinding != null ) {
524
+ QNTypeBinding qn = new QNTypeBinding ();
481
525
String qualifiedName ;
482
526
ITypeBinding declaringClass = superBinding .getDeclaringClass ();
483
527
if (declaringClass != null ) {
484
528
qualifiedName = declaringClass .getQualifiedName ();
529
+ qn .binding = declaringClass ;
485
530
} else {
486
531
qualifiedName = superBinding .getQualifiedName ();
532
+ qn .binding = superBinding ;
487
533
}
488
534
qualifiedName = JavaLangUtil .ripGeneric (qualifiedName );
535
+ qn .qualifiedName = qualifiedName ;
489
536
if (isQualifiedNameOK (qualifiedName , node )) {
490
- musts .add (qualifiedName );
537
+ musts .add (qn );
491
538
}
492
539
//musts.add(superBinding.getQualifiedName());
493
540
}
@@ -503,20 +550,26 @@ protected void visitForMusts(AbstractTypeDeclaration node) {
503
550
for (Iterator iter = superInterfaces .iterator (); iter .hasNext ();) {
504
551
ASTNode element = (ASTNode ) iter .next ();
505
552
ITypeBinding binding = ((Type ) element ).resolveBinding ();
553
+ QNTypeBinding qn = new QNTypeBinding ();
506
554
if (binding != null ) {
507
555
String qualifiedName ;
508
556
ITypeBinding declaringClass = binding .getDeclaringClass ();
509
557
if (declaringClass != null ) {
510
558
qualifiedName = declaringClass .getQualifiedName ();
559
+ qn .binding = declaringClass ;
511
560
} else {
512
561
qualifiedName = binding .getQualifiedName ();
562
+ qn .binding = binding ;
513
563
}
514
564
qualifiedName = JavaLangUtil .ripGeneric (qualifiedName );
565
+ qn .qualifiedName = qualifiedName ;
515
566
if (isQualifiedNameOK (qualifiedName , node )) {
516
- musts .add (qualifiedName );
567
+ musts .add (qn );
517
568
}
518
569
} else {
519
- musts .add (element .toString ());
570
+ qn .qualifiedName = element .toString ();
571
+ qn .binding = binding ;
572
+ musts .add (qn );
520
573
}
521
574
}
522
575
}
@@ -640,22 +693,27 @@ public boolean visit(SimpleName node) {
640
693
*/
641
694
public boolean visit (ClassInstanceCreation node ) {
642
695
ITypeBinding resolveTypeBinding = node .resolveTypeBinding ();
696
+ QNTypeBinding qn = new QNTypeBinding ();
643
697
String qualifiedName = null ;
644
698
if (resolveTypeBinding .isAnonymous ()) {
645
699
qualifiedName = node .getType ().resolveBinding ().getQualifiedName ();
700
+ qn .binding = node .getType ().resolveBinding ();
646
701
} else {
647
702
ITypeBinding declaringClass = resolveTypeBinding .getDeclaringClass ();
648
703
if (declaringClass != null ) {
649
704
qualifiedName = declaringClass .getQualifiedName ();
705
+ qn .binding = declaringClass ;
650
706
} else {
651
707
qualifiedName = resolveTypeBinding .getQualifiedName ();
708
+ qn .binding = resolveTypeBinding ;
652
709
}
653
710
}
654
711
qualifiedName = JavaLangUtil .ripGeneric (qualifiedName );
712
+ qn .qualifiedName = qualifiedName ;
655
713
if (isQualifiedNameOK (qualifiedName , node )
656
- && !musts .contains (qualifiedName )
657
- && !requires .contains (qualifiedName )) {
658
- optionals .add (qualifiedName );
714
+ && !musts .contains (qn )
715
+ && !requires .contains (qn )) {
716
+ optionals .add (qn );
659
717
}
660
718
return super .visit (node );
661
719
}
@@ -669,17 +727,21 @@ public boolean visit(ArrayCreation node) {
669
727
if (!elementType .isPrimitiveType ()) {
670
728
ITypeBinding resolveTypeBinding = elementType .resolveBinding ();
671
729
ITypeBinding declaringClass = resolveTypeBinding .getDeclaringClass ();
730
+ QNTypeBinding qn = new QNTypeBinding ();
672
731
String qualifiedName = null ;
673
732
if (declaringClass != null ) {
674
733
qualifiedName = declaringClass .getQualifiedName ();
734
+ qn .binding = declaringClass ;
675
735
} else {
676
736
qualifiedName = resolveTypeBinding .getQualifiedName ();
737
+ qn .binding = resolveTypeBinding ;
677
738
}
678
739
qualifiedName = JavaLangUtil .ripGeneric (qualifiedName );
740
+ qn .qualifiedName = qualifiedName ;
679
741
if (isQualifiedNameOK (qualifiedName , node )
680
- && !musts .contains (qualifiedName )
681
- && !requires .contains (qualifiedName )) {
682
- optionals .add (qualifiedName );
742
+ && !musts .contains (qn )
743
+ && !requires .contains (qn )) {
744
+ optionals .add (qn );
683
745
}
684
746
}
685
747
return super .visit (node );
@@ -696,17 +758,21 @@ public boolean visit(MethodInvocation node) {
696
758
Name name = (Name ) expression ;
697
759
ITypeBinding resolveTypeBinding = name .resolveTypeBinding ();
698
760
ITypeBinding declaringClass = resolveTypeBinding .getDeclaringClass ();
761
+ QNTypeBinding qn = new QNTypeBinding ();
699
762
String qualifiedName = null ;
700
763
if (declaringClass != null ) {
701
764
qualifiedName = declaringClass .getQualifiedName ();
765
+ qn .binding = declaringClass ;
702
766
} else {
703
767
qualifiedName = resolveTypeBinding .getQualifiedName ();
768
+ qn .binding = resolveTypeBinding ;
704
769
}
705
770
qualifiedName = JavaLangUtil .ripGeneric (qualifiedName );
771
+ qn .qualifiedName = qualifiedName ;
706
772
if (isQualifiedNameOK (qualifiedName , node )
707
- && !musts .contains (qualifiedName )
708
- && !requires .contains (qualifiedName )) {
709
- optionals .add (qualifiedName );
773
+ && !musts .contains (qn )
774
+ && !requires .contains (qn )) {
775
+ optionals .add (qn );
710
776
}
711
777
}
712
778
}
@@ -725,20 +791,48 @@ public boolean visit(FieldAccess node) {
725
791
Name name = (Name ) expression ;
726
792
ITypeBinding resolveTypeBinding = name .resolveTypeBinding ();
727
793
ITypeBinding declaringClass = resolveTypeBinding .getDeclaringClass ();
794
+ QNTypeBinding qn = new QNTypeBinding ();
728
795
String qualifiedName = null ;
729
796
if (declaringClass != null ) {
730
797
qualifiedName = declaringClass .getQualifiedName ();
798
+ qn .binding = declaringClass ;
731
799
} else {
732
800
qualifiedName = resolveTypeBinding .getQualifiedName ();
801
+ qn .binding = resolveTypeBinding ;
733
802
}
734
803
qualifiedName = JavaLangUtil .ripGeneric (qualifiedName );
804
+ qn .qualifiedName = qualifiedName ;
735
805
if (isQualifiedNameOK (qualifiedName , node )
736
- && !musts .contains (qualifiedName )
737
- && !requires .contains (qualifiedName )) {
738
- optionals .add (qualifiedName );
806
+ && !musts .contains (qn )
807
+ && !requires .contains (qn )) {
808
+ optionals .add (qn );
739
809
}
740
810
}
741
811
}
742
812
return super .visit (node );
743
813
}
744
814
}
815
+
816
+ class QNTypeBinding {
817
+ String qualifiedName ;
818
+ ITypeBinding binding ;
819
+
820
+ public boolean equals (Object obj ) {
821
+ if (obj == null /* || !(obj instanceof QNTypeBinding)*/ ) {
822
+ return false ;
823
+ }
824
+ if (obj instanceof String ) {
825
+ return qualifiedName .equals (obj );
826
+ } else if (obj instanceof QNTypeBinding ) {
827
+ QNTypeBinding b = (QNTypeBinding ) obj ;
828
+ return /*binding == b.binding &&*/ qualifiedName .equals (b .qualifiedName );
829
+ } else {
830
+ return false ;
831
+ }
832
+ }
833
+
834
+ public int hashCode () {
835
+ return qualifiedName .hashCode ();
836
+ }
837
+
838
+ }
0 commit comments