Skip to content

Commit 051de3a

Browse files
author
jossonsmith
committed
Merging /trunk to [198]
Fixed bug of cyclic dependency on generating Clazz.load (...) Filter those check... methods
1 parent 318a774 commit 051de3a

File tree

3 files changed

+199
-23
lines changed

3 files changed

+199
-23
lines changed

src/net/sf/j2s/core/astvisitors/DependencyASTVisitor.java

Lines changed: 110 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import java.util.Iterator;
1919
import java.util.List;
2020
import java.util.Set;
21-
2221
import org.eclipse.jdt.core.dom.ASTNode;
2322
import org.eclipse.jdt.core.dom.ASTVisitor;
2423
import 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

Comments
 (0)