package org.incha.core.jswingripples.eig; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IField; import org.eclipse.jdt.core.IInitializer; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IMember; import org.eclipse.jdt.core.IMethod; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.JavaModelException; /** * A set of useful utilities for different evaluations of <code>org.eclipse.jdt.core.IMember</code> objects. * @see org.eclipse.jdt.core.IMember * @author Maksym Petrenko * */ public class JSwingRipplesIMemberServices { /** * Compares two IMember objects to find out if they are similar (i.e. have the same names, signatures etc.). * @param mem1 * First IMember object to compare * @param mem2 * Second IMember object to compare * @return * <code>true</code> if objects are similar,<br> <code>false</code> otherwise */ public static boolean areSimilar(final IMember mem1, final IMember mem2) { if ((IType.class.isInstance(mem1)) && (IType.class.isInstance(mem2))) { if ( ((IType)mem1).getFullyQualifiedName().compareTo( ((IType)mem2).getFullyQualifiedName() )==0) return true; return false; } else if ((IMethod.class.isInstance(mem1)) && (IMethod.class.isInstance(mem2))) { if (areSimilar(mem1.getDeclaringType(),mem2.getDeclaringType())) return ((IMethod) mem1).isSimilar((IMethod) mem2); return false; } else if ((IField.class.isInstance(mem1)) && (IField.class.isInstance(mem2))) { if (areSimilar(mem1.getDeclaringType(),mem2.getDeclaringType())) if (((IField) mem1).getElementName().compareTo(((IField) mem2).getElementName())==0) return true; return false; } else if ((IInitializer.class.isInstance(mem1)) && (IInitializer.class.isInstance(mem2))) { if (areSimilar(mem1.getDeclaringType(),mem2.getDeclaringType())) if (((IInitializer) mem1).getElementName().compareTo(((IInitializer) mem2).getElementName())==0) if (((IInitializer) mem1).getOccurrenceCount()==((IInitializer) mem1).getOccurrenceCount()) return true; return false; } return false; } /** * Returns top declaring type of the IMember object by recursivly walking through the types that declare the object. * @param member * IMember object to evaluate * @return * Top declaring type of this object, or object itself if is top in the nesting hierarchy */ public static IType getTopDeclaringType(final IMember member) { if (member==null) return null; if ((member.getDeclaringType()==null) && (member instanceof IType)) return (IType) member; IType type=member.getDeclaringType(); while (type.getDeclaringType()!=null) { type=type.getDeclaringType(); } return type; } /** * Evaluates degree of nesting of a given IMember object. Done thorugh recursive calls of getParent() function of IJavaElement that this object represents. * @param member * IMember object to evaluate * @return * Degree of nesting of the object relatively to it's compilation unit */ public static int getMemberNestingLevel(final IMember member) { int level=0; if (member instanceof ICompilationUnit) return level; if (member.getParent()==null) return level; IJavaElement element=member; while (element.getParent()!=null) { if (element instanceof IMember) level++; element=element.getParent(); if (member instanceof ICompilationUnit) return level; if (member.getParent()==null) return level; } return level; } public static IMember getMemberParentAtNestingLevelOne(final IMember member) { if (member instanceof ICompilationUnit) return null; if (member.getParent()==null) return null; try { IJavaElement element=member; IJavaElement oldElement=member; boolean flag=true; while (flag) { oldElement=element; element=element.getParent(); if (element instanceof IType) try { if (! ((IType) element).isMember()) return (IMember) oldElement; } catch (final JavaModelException e) { // JRipplesLog.logError(e); } if (element instanceof ICompilationUnit) flag=false; if (element.getParent()==null) flag=false; } } catch (final Exception e) { //JRipplesLog.logError(e); } return null; } public static IMember getMemberParent(final IMember member) { if (member instanceof ICompilationUnit) return null; if (member.getParent()==null) return null; try { IJavaElement element=member; boolean flag=true; while (flag) { element=element.getParent(); if (element instanceof IMember) return (IMember) element; if (element instanceof ICompilationUnit) flag=false; if (element.getParent()==null) flag=false; } } catch (final Exception e) { //JRipplesLog.logError(e); } return null; } }