1818import java .util .Iterator ;
1919import java .util .List ;
2020import java .util .Set ;
21-
2221import org .eclipse .jdt .core .dom .ASTNode ;
2322import org .eclipse .jdt .core .dom .ASTVisitor ;
2423import org .eclipse .jdt .core .dom .AbstractTypeDeclaration ;
@@ -58,6 +57,8 @@ public class DependencyASTVisitor extends ASTVisitor {
5857
5958 protected Set classNameSet = new HashSet ();
6059
60+ protected Set classBindingSet = new HashSet ();
61+
6162 protected Set musts = new HashSet ();
6263
6364 protected Set requires = new HashSet ();
@@ -94,6 +95,7 @@ public String[] getClassName() {
9495 return (String []) classNameSet .toArray (new String [0 ]);
9596 }
9697
98+ /*
9799 public String getMusts() {
98100 StringBuffer buf = new StringBuffer();
99101 buf.append("musts=");
@@ -132,11 +134,49 @@ public String getOptionals() {
132134 }
133135 return buf.toString();
134136 }
137+ */
135138
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+ }
136171 public String getDependencyScript (StringBuffer mainJS ) {
172+ checkSuperType (musts );
173+ checkSuperType (requires );
174+ checkSuperType (optionals );
175+
137176 musts .remove ("" );
138177 requires .remove ("" );
139178 optionals .remove ("" );
179+
140180 for (Iterator iter = ignores .iterator (); iter .hasNext ();) {
141181 String s = (String ) iter .next ();
142182 if (musts .contains (s )) {
@@ -164,6 +204,7 @@ public String getDependencyScript(StringBuffer mainJS) {
164204 optionals .remove (s );
165205 }
166206 }
207+
167208 String js = mainJS .toString ();
168209 if (musts .size () == 0 && requires .size () == 0 && optionals .size () == 0 ) {
169210 return js ;
@@ -383,6 +424,7 @@ public boolean visit(TypeDeclaration node) {
383424 if (resolveBinding .isTopLevel ()) {
384425 String thisClassName = resolveBinding .getQualifiedName ();
385426 classNameSet .add (thisClassName );
427+ classBindingSet .add (resolveBinding );
386428 }
387429 Javadoc javadoc = node .getJavadoc ();
388430 if (javadoc != null ) {
@@ -416,6 +458,7 @@ public boolean visit(EnumDeclaration node) {
416458 if (resolveBinding .isTopLevel ()) {
417459 String thisClassName = resolveBinding .getQualifiedName ();
418460 classNameSet .add (thisClassName );
461+ classBindingSet .add (resolveBinding );
419462 }
420463 Javadoc javadoc = node .getJavadoc ();
421464 if (javadoc != null ) {
@@ -478,16 +521,20 @@ protected void visitForMusts(AbstractTypeDeclaration node) {
478521 if (superclassType != null ) {
479522 ITypeBinding superBinding = superclassType .resolveBinding ();
480523 if (superBinding != null ) {
524+ QNTypeBinding qn = new QNTypeBinding ();
481525 String qualifiedName ;
482526 ITypeBinding declaringClass = superBinding .getDeclaringClass ();
483527 if (declaringClass != null ) {
484528 qualifiedName = declaringClass .getQualifiedName ();
529+ qn .binding = declaringClass ;
485530 } else {
486531 qualifiedName = superBinding .getQualifiedName ();
532+ qn .binding = superBinding ;
487533 }
488534 qualifiedName = JavaLangUtil .ripGeneric (qualifiedName );
535+ qn .qualifiedName = qualifiedName ;
489536 if (isQualifiedNameOK (qualifiedName , node )) {
490- musts .add (qualifiedName );
537+ musts .add (qn );
491538 }
492539 //musts.add(superBinding.getQualifiedName());
493540 }
@@ -503,20 +550,26 @@ protected void visitForMusts(AbstractTypeDeclaration node) {
503550 for (Iterator iter = superInterfaces .iterator (); iter .hasNext ();) {
504551 ASTNode element = (ASTNode ) iter .next ();
505552 ITypeBinding binding = ((Type ) element ).resolveBinding ();
553+ QNTypeBinding qn = new QNTypeBinding ();
506554 if (binding != null ) {
507555 String qualifiedName ;
508556 ITypeBinding declaringClass = binding .getDeclaringClass ();
509557 if (declaringClass != null ) {
510558 qualifiedName = declaringClass .getQualifiedName ();
559+ qn .binding = declaringClass ;
511560 } else {
512561 qualifiedName = binding .getQualifiedName ();
562+ qn .binding = binding ;
513563 }
514564 qualifiedName = JavaLangUtil .ripGeneric (qualifiedName );
565+ qn .qualifiedName = qualifiedName ;
515566 if (isQualifiedNameOK (qualifiedName , node )) {
516- musts .add (qualifiedName );
567+ musts .add (qn );
517568 }
518569 } else {
519- musts .add (element .toString ());
570+ qn .qualifiedName = element .toString ();
571+ qn .binding = binding ;
572+ musts .add (qn );
520573 }
521574 }
522575 }
@@ -640,22 +693,27 @@ public boolean visit(SimpleName node) {
640693 */
641694 public boolean visit (ClassInstanceCreation node ) {
642695 ITypeBinding resolveTypeBinding = node .resolveTypeBinding ();
696+ QNTypeBinding qn = new QNTypeBinding ();
643697 String qualifiedName = null ;
644698 if (resolveTypeBinding .isAnonymous ()) {
645699 qualifiedName = node .getType ().resolveBinding ().getQualifiedName ();
700+ qn .binding = node .getType ().resolveBinding ();
646701 } else {
647702 ITypeBinding declaringClass = resolveTypeBinding .getDeclaringClass ();
648703 if (declaringClass != null ) {
649704 qualifiedName = declaringClass .getQualifiedName ();
705+ qn .binding = declaringClass ;
650706 } else {
651707 qualifiedName = resolveTypeBinding .getQualifiedName ();
708+ qn .binding = resolveTypeBinding ;
652709 }
653710 }
654711 qualifiedName = JavaLangUtil .ripGeneric (qualifiedName );
712+ qn .qualifiedName = qualifiedName ;
655713 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 );
659717 }
660718 return super .visit (node );
661719 }
@@ -669,17 +727,21 @@ public boolean visit(ArrayCreation node) {
669727 if (!elementType .isPrimitiveType ()) {
670728 ITypeBinding resolveTypeBinding = elementType .resolveBinding ();
671729 ITypeBinding declaringClass = resolveTypeBinding .getDeclaringClass ();
730+ QNTypeBinding qn = new QNTypeBinding ();
672731 String qualifiedName = null ;
673732 if (declaringClass != null ) {
674733 qualifiedName = declaringClass .getQualifiedName ();
734+ qn .binding = declaringClass ;
675735 } else {
676736 qualifiedName = resolveTypeBinding .getQualifiedName ();
737+ qn .binding = resolveTypeBinding ;
677738 }
678739 qualifiedName = JavaLangUtil .ripGeneric (qualifiedName );
740+ qn .qualifiedName = qualifiedName ;
679741 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 );
683745 }
684746 }
685747 return super .visit (node );
@@ -696,17 +758,21 @@ public boolean visit(MethodInvocation node) {
696758 Name name = (Name ) expression ;
697759 ITypeBinding resolveTypeBinding = name .resolveTypeBinding ();
698760 ITypeBinding declaringClass = resolveTypeBinding .getDeclaringClass ();
761+ QNTypeBinding qn = new QNTypeBinding ();
699762 String qualifiedName = null ;
700763 if (declaringClass != null ) {
701764 qualifiedName = declaringClass .getQualifiedName ();
765+ qn .binding = declaringClass ;
702766 } else {
703767 qualifiedName = resolveTypeBinding .getQualifiedName ();
768+ qn .binding = resolveTypeBinding ;
704769 }
705770 qualifiedName = JavaLangUtil .ripGeneric (qualifiedName );
771+ qn .qualifiedName = qualifiedName ;
706772 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 );
710776 }
711777 }
712778 }
@@ -725,20 +791,48 @@ public boolean visit(FieldAccess node) {
725791 Name name = (Name ) expression ;
726792 ITypeBinding resolveTypeBinding = name .resolveTypeBinding ();
727793 ITypeBinding declaringClass = resolveTypeBinding .getDeclaringClass ();
794+ QNTypeBinding qn = new QNTypeBinding ();
728795 String qualifiedName = null ;
729796 if (declaringClass != null ) {
730797 qualifiedName = declaringClass .getQualifiedName ();
798+ qn .binding = declaringClass ;
731799 } else {
732800 qualifiedName = resolveTypeBinding .getQualifiedName ();
801+ qn .binding = resolveTypeBinding ;
733802 }
734803 qualifiedName = JavaLangUtil .ripGeneric (qualifiedName );
804+ qn .qualifiedName = qualifiedName ;
735805 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 );
739809 }
740810 }
741811 }
742812 return super .visit (node );
743813 }
744814}
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