1313
1414package net .sf .j2s .core .astvisitors ;
1515
16+ import java .lang .reflect .InvocationTargetException ;
1617import java .util .ArrayList ;
1718import java .util .Arrays ;
1819import java .util .HashSet ;
3334import org .eclipse .jdt .core .dom .Expression ;
3435import org .eclipse .jdt .core .dom .FieldAccess ;
3536import org .eclipse .jdt .core .dom .FieldDeclaration ;
37+ import org .eclipse .jdt .core .dom .IBinding ;
3638import org .eclipse .jdt .core .dom .IMethodBinding ;
3739import org .eclipse .jdt .core .dom .ITypeBinding ;
3840import org .eclipse .jdt .core .dom .IVariableBinding ;
4648import org .eclipse .jdt .core .dom .PackageDeclaration ;
4749import org .eclipse .jdt .core .dom .QualifiedName ;
4850import org .eclipse .jdt .core .dom .SimpleName ;
51+ import org .eclipse .jdt .core .dom .SimpleType ;
4952import org .eclipse .jdt .core .dom .Statement ;
5053import org .eclipse .jdt .core .dom .TagElement ;
5154import org .eclipse .jdt .core .dom .TextElement ;
@@ -646,14 +649,14 @@ protected void visitForRequires(AbstractTypeDeclaration node) {
646649 isInteface = false ;
647650 }
648651 if (isInteface || (node .getModifiers () & Modifier .STATIC ) != 0 ) {
649- DependencyASTVisitor visitor = new DependencyASTVisitor ();
652+ DependencyASTVisitor visitor = getSelfVisitor ();
650653 element .accept (visitor );
651654 requires .addAll (visitor .musts );
652655 requires .addAll (visitor .requires );
653656 requires .addAll (visitor .optionals );
654657 }
655658 } else if (element instanceof Initializer ) {
656- DependencyASTVisitor visitor = new DependencyASTVisitor ();
659+ DependencyASTVisitor visitor = getSelfVisitor ();
657660 element .accept (this );
658661 requires .addAll (visitor .musts );
659662 requires .addAll (visitor .requires );
@@ -666,7 +669,7 @@ protected void visitForRequires(AbstractTypeDeclaration node) {
666669 VariableDeclarationFragment vdf = (VariableDeclarationFragment ) fragments
667670 .get (j );
668671 Expression initializer = vdf .getInitializer ();
669- DependencyASTVisitor visitor = new DependencyASTVisitor ();
672+ DependencyASTVisitor visitor = getSelfVisitor ();
670673 if (initializer != null ) {
671674 initializer .accept (visitor );
672675 }
@@ -680,7 +683,7 @@ protected void visitForRequires(AbstractTypeDeclaration node) {
680683// VariableDeclarationFragment vdf = (VariableDeclarationFragment) fragments
681684// .get(j);
682685// Expression initializer = vdf.getInitializer();
683- // DependencyASTVisitor visitor = new DependencyASTVisitor ();
686+ // DependencyASTVisitor visitor = getSelfVisitor ();
684687// if (initializer != null) {
685688// initializer.accept(visitor);
686689// }
@@ -693,6 +696,26 @@ protected void visitForRequires(AbstractTypeDeclaration node) {
693696 }
694697 }
695698
699+ private DependencyASTVisitor getSelfVisitor () {
700+ try {
701+ Object obj = this .getClass ().getConstructor (new Class [0 ]).newInstance (new Object [0 ]);
702+ return (DependencyASTVisitor ) obj ;
703+ } catch (IllegalArgumentException e ) {
704+ e .printStackTrace ();
705+ } catch (SecurityException e ) {
706+ e .printStackTrace ();
707+ } catch (InstantiationException e ) {
708+ e .printStackTrace ();
709+ } catch (IllegalAccessException e ) {
710+ e .printStackTrace ();
711+ } catch (InvocationTargetException e ) {
712+ e .printStackTrace ();
713+ } catch (NoSuchMethodException e ) {
714+ e .printStackTrace ();
715+ }
716+ return null ;
717+ }
718+
696719 protected void visitForOptionals (AbstractTypeDeclaration node ) {
697720
698721 }
@@ -713,6 +736,7 @@ protected boolean isSimpleQualified(QualifiedName node) {
713736 public boolean visit (QualifiedName node ) {
714737 Object constValue = node .resolveConstantExpressionValue ();
715738 if (constValue != null && (constValue instanceof Number
739+ || constValue instanceof Character
716740 || constValue instanceof Boolean )
717741 && isSimpleQualified (node )) {
718742 //buffer.append(constValue);
@@ -726,12 +750,25 @@ && isSimpleQualified(node)) {
726750 public boolean visit (SimpleName node ) {
727751 Object constValue = node .resolveConstantExpressionValue ();
728752 if (constValue != null && (constValue instanceof Number
753+ || constValue instanceof Character
729754 || constValue instanceof Boolean )) {
730755 return false ;
731756 }
732- /*
733757 ITypeBinding typeBinding = node .resolveTypeBinding ();
734- if (typeBinding != null) {
758+ IBinding binding = node .resolveBinding ();
759+ boolean isCasting = false ;
760+ boolean isQualified = false ;
761+ ASTNode nodeParent = node .getParent ();
762+ while (nodeParent != null && nodeParent instanceof QualifiedName ) {
763+ isQualified = true ;
764+ nodeParent = nodeParent .getParent ();
765+ }
766+ if (nodeParent != null && nodeParent instanceof SimpleType ) {
767+ isCasting = true ;
768+ }
769+ if (typeBinding != null && !isCasting && isQualified
770+ && !(binding instanceof IVariableBinding )) {
771+ QNTypeBinding qn = new QNTypeBinding ();
735772 String qualifiedName = null ;
736773 if (!typeBinding .isPrimitive ()) {
737774 if (typeBinding .isArray ()) {
@@ -743,26 +780,28 @@ public boolean visit(SimpleName node) {
743780 ITypeBinding declaringClass = elementType .getDeclaringClass ();
744781 if (declaringClass != null ) {
745782 qualifiedName = declaringClass .getQualifiedName ();
783+ qn .binding = declaringClass ;
746784 } else {
747785 qualifiedName = elementType .getQualifiedName ();
786+ qn .binding = elementType ;
748787 }
749788 }
750789 } else {
751790 ITypeBinding declaringClass = typeBinding .getDeclaringClass ();
752791 if (declaringClass != null ) {
753792 qualifiedName = declaringClass .getQualifiedName ();
793+ qn .binding = declaringClass ;
754794 } else {
755795 qualifiedName = typeBinding .getQualifiedName ();
796+ qn .binding = typeBinding ;
756797 }
757798 }
758799 }
759- if ("byte".equals(qualifiedName)) {
760- System.out.println("fds");
761- }
762800 if (isQualifiedNameOK (qualifiedName , node )
763801 && !musts .contains (qualifiedName )
764802 && !requires .contains (qualifiedName )) {
765- optionals.add(qualifiedName);
803+ qn .qualifiedName = qualifiedName ;
804+ optionals .add (qn );
766805 }
767806 }
768807// ASTNode parent = node.getParent();
@@ -772,7 +811,6 @@ public boolean visit(SimpleName node) {
772811//
773812// }
774813// }
775- */
776814 return super .visit (node );
777815 }
778816
@@ -970,6 +1008,7 @@ public boolean visit(FieldAccess node) {
9701008 }
9711009 }
9721010 } else if (constValue != null && (constValue instanceof Number
1011+ || constValue instanceof Character
9731012 || constValue instanceof Boolean )) {
9741013 if ((exp instanceof QualifiedName )
9751014 || (exp instanceof QualifiedName && isSimpleQualified ((QualifiedName ) exp ))) {
0 commit comments