diff options
Diffstat (limited to 'jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/JavaModelUtil.java')
-rw-r--r-- | jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/JavaModelUtil.java | 1032 |
1 files changed, 0 insertions, 1032 deletions
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/JavaModelUtil.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/JavaModelUtil.java deleted file mode 100644 index c4086ed7f..000000000 --- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/JavaModelUtil.java +++ /dev/null @@ -1,1032 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006 Sybase, Inc. and others. - * - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Sybase, Inc. - initial API and implementation - *******************************************************************************/ -package org.eclipse.jst.jsf.common.ui.internal.utils; - -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; - -import org.eclipse.core.resources.IProject; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.Path; -import org.eclipse.jdt.core.ClasspathContainerInitializer; -import org.eclipse.jdt.core.Flags; -import org.eclipse.jdt.core.IClasspathContainer; -import org.eclipse.jdt.core.IClasspathEntry; -import org.eclipse.jdt.core.ICompilationUnit; -import org.eclipse.jdt.core.IField; -import org.eclipse.jdt.core.IImportDeclaration; -import org.eclipse.jdt.core.IJavaElement; -import org.eclipse.jdt.core.IJavaProject; -import org.eclipse.jdt.core.IMember; -import org.eclipse.jdt.core.IMethod; -import org.eclipse.jdt.core.IPackageFragment; -import org.eclipse.jdt.core.IPackageFragmentRoot; -import org.eclipse.jdt.core.IType; -import org.eclipse.jdt.core.ITypeHierarchy; -import org.eclipse.jdt.core.JavaCore; -import org.eclipse.jdt.core.JavaModelException; -import org.eclipse.jdt.core.Signature; -import org.eclipse.jdt.core.compiler.CharOperation; - -/** - * Original code is from JDT Utility methods for the Java Model. - */ -public final class JavaModelUtil { - - /** - * Finds a type by its qualified type name (dot separated). - * - * @param jproject - * The java project to search in - * @param fullyQualifiedName - * The fully qualified name (type name with enclosing type names - * and package (all separated by dots)) - * @return The type found, or null if not existing - * @throws JavaModelException - */ - public static IType findType(IJavaProject jproject, - String fullyQualifiedName) throws JavaModelException { - // workaround for bug 22883 - IType type = jproject.findType(fullyQualifiedName); - if (type != null) { - return type; - } - IPackageFragmentRoot[] roots = jproject.getPackageFragmentRoots(); - for (int i = 0; i < roots.length; i++) { - IPackageFragmentRoot root = roots[i]; - type = findType(root, fullyQualifiedName); - if (type != null && type.exists()) { - return type; - } - } - return null; - } - - /** - * Returns <code>true</code> if the given package fragment root is - * referenced. This means it is own by a different project but is referenced - * by the root's parent. Returns <code>false</code> if the given root - * doesn't have an underlying resource. - * @param root - * @return true if root is referenced - */ - public static boolean isReferenced(IPackageFragmentRoot root) { - IResource resource = root.getResource(); - if (resource != null) { - IProject jarProject = resource.getProject(); - IProject container = root.getJavaProject().getProject(); - return !container.equals(jarProject); - } - return false; - } - - private static IType findType(IPackageFragmentRoot root, - String fullyQualifiedName) throws JavaModelException { - IJavaElement[] children = root.getChildren(); - for (int i = 0; i < children.length; i++) { - IJavaElement element = children[i]; - if (element.getElementType() == IJavaElement.PACKAGE_FRAGMENT) { - IPackageFragment pack = (IPackageFragment) element; - if (!fullyQualifiedName.startsWith(pack.getElementName())) { - continue; - } - IType type = findType(pack, fullyQualifiedName); - if (type != null && type.exists()) { - return type; - } - } - } - return null; - } - - private static IType findType(IPackageFragment pack, - String fullyQualifiedName) throws JavaModelException { - ICompilationUnit[] cus = pack.getCompilationUnits(); - for (int i = 0; i < cus.length; i++) { - ICompilationUnit unit = cus[i]; - IType type = findType(unit, fullyQualifiedName); - if (type != null && type.exists()) { - return type; - } - } - return null; - } - - private static IType findType(ICompilationUnit cu, String fullyQualifiedName) - throws JavaModelException { - IType[] types = cu.getAllTypes(); - for (int i = 0; i < types.length; i++) { - IType type = types[i]; - if (getFullyQualifiedName(type).equals(fullyQualifiedName)) { - return type; - } - } - return null; - } - - /** - * Finds a type by package and type name. - * - * @param jproject - * the java project to search in - * @param pack - * The package name - * @param typeQualifiedName - * the type qualified name (type name with enclosing type names - * (separated by dots)) - * @return the type found, or null if not existing - * @throws JavaModelException - * @deprecated Use IJavaProject.findType(String, String) instead - */ - public static IType findType(IJavaProject jproject, String pack, - String typeQualifiedName) throws JavaModelException { - return jproject.findType(pack, typeQualifiedName); - } - - /** - * Finds a type container by container name. The returned element will be of - * type <code>IType</code> or a <code>IPackageFragment</code>. - * <code>null</code> is returned if the type container could not be found. - * - * @param jproject - * The Java project defining the context to search - * @param typeContainerName - * A dot separarted name of the type container - * @return the java element - * @throws JavaModelException - * @see #getTypeContainerName(IType) - */ - public static IJavaElement findTypeContainer(IJavaProject jproject, - String typeContainerName) throws JavaModelException { - // try to find it as type - IJavaElement result = jproject.findType(typeContainerName); - if (result == null) { - // find it as package - IPath path = new Path(typeContainerName.replace('.', '/')); - result = jproject.findElement(path); - if (!(result instanceof IPackageFragment)) { - result = null; - } - - } - return result; - } - - /** - * Finds a type in a compilation unit. Typical usage is to find the - * corresponding type in a working copy. - * - * @param cu - * the compilation unit to search in - * @param typeQualifiedName - * the type qualified name (type name with enclosing type names - * (separated by dots)) - * @return the type found, or null if not existing - * @throws JavaModelException - */ - public static IType findTypeInCompilationUnit(ICompilationUnit cu, - String typeQualifiedName) throws JavaModelException { - IType[] types = cu.getAllTypes(); - for (int i = 0; i < types.length; i++) { - String currName = getTypeQualifiedName(types[i]); - if (typeQualifiedName.equals(currName)) { - return types[i]; - } - } - return null; - } - - /** - * Finds a a member in a compilation unit. Typical usage is to find the - * corresponding member in a working copy. - * - * @param cu - * the compilation unit (eg. working copy) to search in - * @param member - * the member (eg. from the original) - * @return the member found, or null if not existing - */ - public static IMember findMemberInCompilationUnit(ICompilationUnit cu, - IMember member) { - IJavaElement[] elements = cu.findElements(member); - if (elements != null && elements.length > 0) { - return (IMember) elements[0]; - } - return null; - } - - /** - * Returns the element of the given compilation unit which is "equal" to the - * given element. Note that the given element usually has a parent different - * from the given compilation unit. - * - * @param cu - * the cu to search in - * @param element - * the element to look for - * @return an element of the given cu "equal" to the given element - */ - public static IJavaElement findInCompilationUnit(ICompilationUnit cu, - IJavaElement element) { - IJavaElement[] elements = cu.findElements(element); - if (elements != null && elements.length > 0) { - return elements[0]; - } - return null; - } - - /** - * Returns the qualified type name of the given type using '.' as - * separators. This is a replace for IType.getTypeQualifiedName() which uses - * '$' as separators. As '$' is also a valid character in an id this is - * ambiguous. JavaCore PR: 1GCFUNT - * @param type - * @return the type qualified name - */ - public static String getTypeQualifiedName(IType type) { - return type.getTypeQualifiedName('.'); - } - - /** - * Returns the fully qualified name of the given type using '.' as - * separators. This is a replace for IType.getFullyQualifiedTypeName which - * uses '$' as separators. As '$' is also a valid character in an id this is - * ambiguous. JavaCore PR: 1GCFUNT - * @param type - * @return the fully qualified name using . as the separator - */ - public static String getFullyQualifiedName(IType type) { - return type.getFullyQualifiedName('.'); - } - - /** - * Returns the fully qualified name of a type's container. (package name or - * enclosing type name) - * @param type - * @return the container name - */ - public static String getTypeContainerName(IType type) { - IType outerType = type.getDeclaringType(); - if (outerType != null) { - return outerType.getFullyQualifiedName('.'); - } - return type.getPackageFragment().getElementName(); - } - - /** - * Concatenates two names. Uses a dot for separation. Both strings can be - * empty or <code>null</code>. - * @param name1 - * @param name2 - * @return name1 + name2 - */ - public static String concatenateName(String name1, String name2) { - StringBuffer buf = new StringBuffer(); - if (name1 != null && name1.length() > 0) { - buf.append(name1); - } - if (name2 != null && name2.length() > 0) { - if (buf.length() > 0) { - buf.append('.'); - } - buf.append(name2); - } - return buf.toString(); - } - - /** - * Concatenates two names. Uses a dot for separation. Both strings can be - * empty or <code>null</code>. - * @param name1 - * @param name2 - * @return name1 + name2 - */ - public static String concatenateName(char[] name1, char[] name2) { - StringBuffer buf = new StringBuffer(); - if (name1 != null && name1.length > 0) { - buf.append(name1); - } - if (name2 != null && name2.length > 0) { - if (buf.length() > 0) { - buf.append('.'); - } - buf.append(name2); - } - return buf.toString(); - } - - /** - * Evaluates if a member (possible from another package) is visible from - * elements in a package. - * - * @param member - * The member to test the visibility for - * @param pack - * The package in focus - * @return true if visible - * @throws JavaModelException - */ - public static boolean isVisible(IMember member, IPackageFragment pack) - throws JavaModelException { - - int type = member.getElementType(); - if (type == IJavaElement.INITIALIZER - || (type == IJavaElement.METHOD && member.getElementName() - .startsWith("<"))) { //$NON-NLS-1$ - //$NON-NLS-1$ - return false; - } - - int otherflags = member.getFlags(); - IType declaringType = member.getDeclaringType(); - if (Flags.isPublic(otherflags) - || (declaringType != null && declaringType.isInterface())) { - return true; - } else if (Flags.isPrivate(otherflags)) { - return false; - } - - IPackageFragment otherpack = (IPackageFragment) findParentOfKind( - member, IJavaElement.PACKAGE_FRAGMENT); - return (pack != null && otherpack != null && isSamePackage(pack, - otherpack)); - } - - /** - * Evaluates if a member in the focus' element hierarchy is visible from - * elements in a package. - * - * @param member - * The member to test the visibility for - * @param pack - * The package of the focus element focus - * @return true if is visible in hiearchy - * @throws JavaModelException - */ - public static boolean isVisibleInHierarchy(IMember member, - IPackageFragment pack) throws JavaModelException { - int type = member.getElementType(); - if (type == IJavaElement.INITIALIZER - || (type == IJavaElement.METHOD && member.getElementName() - .startsWith("<"))) { //$NON-NLS-1$ - //$NON-NLS-1$ - return false; - } - - int otherflags = member.getFlags(); - - IType declaringType = member.getDeclaringType(); - if (Flags.isPublic(otherflags) || Flags.isProtected(otherflags) - || (declaringType != null && declaringType.isInterface())) { - return true; - } else if (Flags.isPrivate(otherflags)) { - return false; - } - - IPackageFragment otherpack = (IPackageFragment) findParentOfKind( - member, IJavaElement.PACKAGE_FRAGMENT); - return (pack != null && pack.equals(otherpack)); - } - - /** - * Returns the package fragment root of <code>IJavaElement</code>. If the - * given element is already a package fragment root, the element itself is - * returned. - * @param element - * @return the package fragment root - */ - public static IPackageFragmentRoot getPackageFragmentRoot( - IJavaElement element) { - return (IPackageFragmentRoot) element - .getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT); - } - - /** - * Returns the parent of the supplied java element that conforms to the - * given parent type or <code>null</code>, if such a parent doesn't exit. - * - * @deprecated Use element.getParent().getAncestor(kind); - */ - private static IJavaElement findParentOfKind(IJavaElement element, int kind) { - if (element != null && element.getParent() != null) { - return element.getParent().getAncestor(kind); - } - return null; - } - - /** - * Finds a method in a type. This searches for a method with the same name - * and signature. Parameter types are only compared by the simple name, no - * resolving for the fully qualified type name is done. Constructors are - * only compared by parameters, not the name. - * - * @param name - * The name of the method to find - * @param paramTypes - * The type signatures of the parameters e.g. - * <code>{"QString;","I"}</code> - * @param isConstructor - * If the method is a constructor - * @param type - * @return The first found method or <code>null</code>, if nothing found - * @throws JavaModelException - */ - public static IMethod findMethod(String name, String[] paramTypes, - boolean isConstructor, IType type) throws JavaModelException { - return findMethod(name, paramTypes, isConstructor, type.getMethods()); - } - - /** - * Finds a method by name. This searches for a method with a name and - * signature. Parameter types are only compared by the simple name, no - * resolving for the fully qualified type name is done. Constructors are - * only compared by parameters, not the name. - * - * @param name - * The name of the method to find - * @param paramTypes - * The type signatures of the parameters e.g. - * <code>{"QString;","I"}</code> - * @param isConstructor - * If the method is a constructor - * @param methods - * The methods to search in - * @return The found method or <code>null</code>, if nothing found - * @throws JavaModelException - */ - public static IMethod findMethod(String name, String[] paramTypes, - boolean isConstructor, IMethod[] methods) throws JavaModelException { - for (int i = methods.length - 1; i >= 0; i--) { - if (isSameMethodSignature(name, paramTypes, isConstructor, - methods[i])) { - return methods[i]; - } - } - return null; - } - - /** - * Finds a method declararion in a type's hierarchy. The search is top down, - * so this returns the first declaration of the method in the hierarchy. - * This searches for a method with a name and signature. Parameter types are - * only compared by the simple name, no resolving for the fully qualified - * type name is done. Constructors are only compared by parameters, not the - * name. - * @param hierarchy - * - * @param type - * Searches in this type's supertypes. - * @param name - * The name of the method to find - * @param paramTypes - * The type signatures of the parameters e.g. - * <code>{"QString;","I"}</code> - * @param isConstructor - * If the method is a constructor - * @return The first method found or null, if nothing found - * @throws JavaModelException - */ - public static IMethod findMethodDeclarationInHierarchy( - ITypeHierarchy hierarchy, IType type, String name, - String[] paramTypes, boolean isConstructor) - throws JavaModelException { - IType[] superTypes = hierarchy.getAllSupertypes(type); - for (int i = superTypes.length - 1; i >= 0; i--) { - IMethod first = findMethod(name, paramTypes, isConstructor, - superTypes[i]); - if (first != null && !Flags.isPrivate(first.getFlags())) { - // the order getAllSupertypes does make assumptions of the order - // of inner elements -> search recursivly - IMethod res = findMethodDeclarationInHierarchy(hierarchy, first - .getDeclaringType(), name, paramTypes, isConstructor); - if (res != null) { - return res; - } - return first; - } - } - return null; - } - - /** - * Finds a method implementation in a type's classhierarchy. The search is - * bottom-up, so this returns the nearest overridden method. Does not find - * methods in interfaces or abstract methods. This searches for a method - * with a name and signature. Parameter types are only compared by the - * simple name, no resolving for the fully qualified type name is done. - * Constructors are only compared by parameters, not the name. - * @param hierarchy - * - * @param type - * Type to search the superclasses - * @param name - * The name of the method to find - * @param paramTypes - * The type signatures of the parameters e.g. - * <code>{"QString;","I"}</code> - * @param isConstructor - * If the method is a constructor - * @return The first method found or null, if nothing found - * @throws JavaModelException - */ - public static IMethod findMethodImplementationInHierarchy( - ITypeHierarchy hierarchy, IType type, String name, - String[] paramTypes, boolean isConstructor) - throws JavaModelException { - IType[] superTypes = hierarchy.getAllSuperclasses(type); - for (int i = 0; i < superTypes.length; i++) { - IMethod found = findMethod(name, paramTypes, isConstructor, - superTypes[i]); - if (found != null) { - if (Flags.isAbstract(found.getFlags())) { - return null; - } - return found; - } - } - return null; - } - - private static IMethod findMethodInHierarchy(ITypeHierarchy hierarchy, - IType type, String name, String[] paramTypes, boolean isConstructor) - throws JavaModelException { - IMethod method = findMethod(name, paramTypes, isConstructor, type); - if (method != null) { - return method; - } - IType superClass = hierarchy.getSuperclass(type); - if (superClass != null) { - IMethod res = findMethodInHierarchy(hierarchy, superClass, name, - paramTypes, isConstructor); - if (res != null) { - return res; - } - } - if (!isConstructor) { - IType[] superInterfaces = hierarchy.getSuperInterfaces(type); - for (int i = 0; i < superInterfaces.length; i++) { - IMethod res = findMethodInHierarchy(hierarchy, - superInterfaces[i], name, paramTypes, false); - if (res != null) { - return res; - } - } - } - return method; - } - - /** - * Finds the method that is defines/declares the given method. The search is - * bottom-up, so this returns the nearest defining/declaring method. - * @param typeHierarchy - * @param type - * @param methodName - * @param paramTypes - * @param isConstructor - * - * @param testVisibility - * If true the result is tested on visibility. Null is returned - * if the method is not visible. - * @return the method or null - * @throws JavaModelException - */ - public static IMethod findMethodDefininition(ITypeHierarchy typeHierarchy, - IType type, String methodName, String[] paramTypes, - boolean isConstructor, boolean testVisibility) - throws JavaModelException { - IType superClass = typeHierarchy.getSuperclass(type); - if (superClass != null) { - IMethod res = findMethodInHierarchy(typeHierarchy, superClass, - methodName, paramTypes, isConstructor); - if (res != null && !Flags.isPrivate(res.getFlags())) { - if (!testVisibility - || isVisibleInHierarchy(res, type.getPackageFragment())) { - return res; - } - } - } - if (!isConstructor) { - IType[] interfaces = typeHierarchy.getSuperInterfaces(type); - for (int i = 0; i < interfaces.length; i++) { - IMethod res = findMethodInHierarchy(typeHierarchy, - interfaces[i], methodName, paramTypes, false); - if (res != null) { - return res; // methods from interfaces are always public and - // therefore visible - } - } - } - return null; - } - - /** - * Tests if a method equals to the given signature. Parameter types are only - * compared by the simple name, no resolving for the fully qualified type - * name is done. Constructors are only compared by parameters, not the name. - * - * @param name - * Name of the method - * @param paramTypes - * The type signatures of the parameters e.g. - * <code>{"QString;","I"}</code> - * @param isConstructor - * Specifies if the method is a constructor - * @param curr - * @return Returns <code>true</code> if the method has the given name and - * parameter types and constructor state. - * @throws JavaModelException - */ - public static boolean isSameMethodSignature(String name, - String[] paramTypes, boolean isConstructor, IMethod curr) - throws JavaModelException { - if (isConstructor || name.equals(curr.getElementName())) { - if (isConstructor == curr.isConstructor()) { - String[] currParamTypes = curr.getParameterTypes(); - if (paramTypes.length == currParamTypes.length) { - for (int i = 0; i < paramTypes.length; i++) { - String t1 = Signature.getSimpleName(Signature - .toString(paramTypes[i])); - String t2 = Signature.getSimpleName(Signature - .toString(currParamTypes[i])); - if (!t1.equals(t2)) { - return false; - } - } - return true; - } - } - } - return false; - } - - /** - * Tests if two <code>IPackageFragment</code>s represent the same logical - * java package. - * @param pack1 - * @param pack2 - * - * @return <code>true</code> if the package fragments' names are equal. - */ - public static boolean isSamePackage(IPackageFragment pack1, - IPackageFragment pack2) { - return pack1.getElementName().equals(pack2.getElementName()); - } - - /** - * Checks whether the given type has a valid main method or not. - * @param type - * @return true if type has a main method - * @throws JavaModelException - */ - public static boolean hasMainMethod(IType type) throws JavaModelException { - IMethod[] methods = type.getMethods(); - for (int i = 0; i < methods.length; i++) { - if (methods[i].isMainMethod()) { - return true; - } - } - return false; - } - - /** - * Checks if the field is boolean. - * @param field - * @return true if the file is of primitive boolean type - * @throws JavaModelException - */ - public static boolean isBoolean(IField field) throws JavaModelException { - return field.getTypeSignature().equals(Signature.SIG_BOOLEAN); - } - - /** - * Tests if the given element is on the class path of its containing - * project. Handles the case that the containing project isn't a Java - * project. - * @param element - * @return true if element in on the class path? - */ - public static boolean isOnClasspath(IJavaElement element) { - IJavaProject project = element.getJavaProject(); - if (!project.exists()) - return false; - return project.isOnClasspath(element); - } - - /** - * Resolves a type name in the context of the declaring type. - * - * @param refTypeSig - * the type name in signature notation (for example 'QVector') - * this can also be an array type, but dimensions will be - * ignored. - * @param declaringType - * the context for resolving (type where the reference was made - * in) - * @return returns the fully qualified type name or build-in-type name. if a - * unresoved type couldn't be resolved null is returned - * @throws JavaModelException - */ - public static String getResolvedTypeName(String refTypeSig, - IType declaringType) throws JavaModelException { - int arrayCount = Signature.getArrayCount(refTypeSig); - char type = refTypeSig.charAt(arrayCount); - if (type == Signature.C_UNRESOLVED) { - int semi = refTypeSig - .indexOf(Signature.C_SEMICOLON, arrayCount + 1); - if (semi == -1) { - throw new IllegalArgumentException(); - } - String name = refTypeSig.substring(arrayCount + 1, semi); - - String[][] resolvedNames = declaringType.resolveType(name); - if (resolvedNames != null && resolvedNames.length > 0) { - return JavaModelUtil.concatenateName(resolvedNames[0][0], - resolvedNames[0][1]); - } - return null; - } - return Signature.toString(refTypeSig.substring(arrayCount)); - } - - /** - * Returns if a CU can be edited. - * @param cu - * @return true if cu is editable - */ - public static boolean isEditable(ICompilationUnit cu) { - IResource resource = toOriginal(cu).getResource(); - return (resource.exists() && !resource.getResourceAttributes() - .isReadOnly()); - } - - /** - * Finds a qualified import for a type name. - * @param cu - * @param simpleName - * @return the import declaration or null - * @throws JavaModelException - */ - public static IImportDeclaration findImport(ICompilationUnit cu, - String simpleName) throws JavaModelException { - IImportDeclaration[] existing = cu.getImports(); - for (int i = 0; i < existing.length; i++) { - String curr = existing[i].getElementName(); - if (curr.endsWith(simpleName)) { - int dotPos = curr.length() - simpleName.length() - 1; - if ((dotPos == -1) - || (dotPos > 0 && curr.charAt(dotPos) == '.')) { - return existing[i]; - } - } - } - return null; - } - - /** - * Returns the original if the given member. If the member is already an - * original the input is returned. The returned member might not exist - * @param member - * @return the original IMember - */ - public static IMember toOriginal(IMember member) { - if (member instanceof IMethod) { - return toOriginalMethod((IMethod) member); - } - - return (IMember) member.getPrimaryElement(); - /* - * ICompilationUnit cu= member.getCompilationUnit(); if (cu != null && - * cu.isWorkingCopy()) return (IMember)cu.getOriginal(member); return - * member; - */ - } - - /* - * XXX workaround for bug 18568 - * http://bugs.eclipse.org/bugs/show_bug.cgi?id=18568 to be removed once the - * bug is fixed - */ - private static IMethod toOriginalMethod(IMethod method) { - ICompilationUnit cu = method.getCompilationUnit(); - if (cu == null || isPrimary(cu)) { - return method; - } - try { - // use the workaround only if needed - if (!method.getElementName().equals( - method.getDeclaringType().getElementName())) - return (IMethod) method.getPrimaryElement(); - - IType originalType = (IType) toOriginal(method.getDeclaringType()); - IMethod[] methods = originalType.findMethods(method); - boolean isConstructor = method.isConstructor(); - for (int i = 0; i < methods.length; i++) { - if (methods[i].isConstructor() == isConstructor) - return methods[i]; - } - return null; - } catch (JavaModelException e) { - return null; - } - } - - // private static boolean PRIMARY_ONLY = false; - - /** - * Returns the original cu if the given cu is a working copy. If the cu is - * already an original the input cu is returned. The returned cu might not - * exist - * @param cu - * @return the original compiliation unit - */ - public static ICompilationUnit toOriginal(ICompilationUnit cu) { - // To stay compatible with old version returned null - // if cu is null - if (cu == null) - return cu; - return cu.getPrimary(); - } - - /** - * Returns the original element if the given element is a working copy. If - * the cu is already an original the input element is returned. The returned - * element might not exist - * @param element - * @return element's primary element - */ - public static IJavaElement toOriginal(IJavaElement element) { - return element.getPrimaryElement(); - } - - /** - * Returns true if a cu is a primary cu (original or shared working copy) - * @param cu - * @return true if cu is primary - */ - public static boolean isPrimary(ICompilationUnit cu) { - return cu.getOwner() == null; - } - - /** - * http://bugs.eclipse.org/bugs/show_bug.cgi?id=19253 - * - * Reconciling happens in a separate thread. This can cause a situation - * where the Java element gets disposed after an exists test has been done. - * So we should not log not present exceptions when they happen in working - * copies. - * @param exception - * @return true if filter not present - */ - public static boolean filterNotPresentException(CoreException exception) { - if (!(exception instanceof JavaModelException)) { - return true; - } - JavaModelException je = (JavaModelException) exception; - if (!je.isDoesNotExist()) { - return true; - } - IJavaElement[] elements = je.getJavaModelStatus().getElements(); - for (int i = 0; i < elements.length; i++) { - IJavaElement element = elements[i]; - ICompilationUnit unit = (ICompilationUnit) element - .getAncestor(IJavaElement.COMPILATION_UNIT); - if (unit == null) { - return true; - } - if (!unit.isWorkingCopy()) { - return true; - } - } - return false; - } - - /** - * @param type - * @param pm - * @return all supertypes of type - * @throws JavaModelException - */ - public static IType[] getAllSuperTypes(IType type, IProgressMonitor pm) - throws JavaModelException { - // workaround for 23656 - Set types = new HashSet(Arrays.asList(type.newSupertypeHierarchy(pm) - .getAllSupertypes(type))); - IType objekt = type.getJavaProject().findType("java.lang.Object");//$NON-NLS-1$ - if (objekt != null) { - types.add(objekt); - } - return (IType[]) types.toArray(new IType[types.size()]); - } - - /** - * @param resourcePath - * @param exclusionPatterns - * @return true if resourcePath is excluded by exclusion patterns - */ - public static boolean isExcludedPath(IPath resourcePath, - IPath[] exclusionPatterns) { - char[] path = resourcePath.toString().toCharArray(); - for (int i = 0, length = exclusionPatterns.length; i < length; i++) { - char[] pattern = exclusionPatterns[i].toString().toCharArray(); - if (CharOperation.pathMatch(pattern, path, true, '/')) { - return true; - } - } - return false; - } - - /* - - * @see IClasspathEntry#getExclusionPatterns - */ - /** - * Returns whether the given resource path matches one of the exclusion - * patterns. - * - * @param resourcePath - * @param exclusionPatterns - * @return true if resourcePath is excluded - */ - public static boolean isExcluded(IPath resourcePath, - char[][] exclusionPatterns) { - if (exclusionPatterns == null) { - return false; - } - char[] path = resourcePath.toString().toCharArray(); - for (int i = 0, length = exclusionPatterns.length; i < length; i++) { - if (CharOperation.pathMatch(exclusionPatterns[i], path, true, '/')) { - return true; - } - } - return false; - } - - private static Boolean fgIsJDTCore_1_5 = null; - - /** - * @return true if JRE 1.5 in enabled. - */ - public static boolean isJDTCore_1_5() { - if (fgIsJDTCore_1_5 == null) { - fgIsJDTCore_1_5 = JavaCore - .getDefaultOptions() - .containsKey( - "org.eclipse.jdt.core.compiler.problem.unsafeTypeOperation") ? Boolean.TRUE //$NON-NLS-1$ - : Boolean.FALSE; - } - return fgIsJDTCore_1_5.booleanValue(); - } - - /** - * Helper method that tests if an classpath entry can be found in a - * container. <code>null</code> is returned if the entry can not be found - * or if the container does not allows the configuration of source - * attachments - * - * @param jproject - * The container's parent project - * @param containerPath - * The path of the container - * @param libPath - * The path of the library to be found - * @return IClasspathEntry A classpath entry from the container of - * <code>null</code> if the container can not be modified. - * @throws JavaModelException - */ - public static IClasspathEntry getClasspathEntryToEdit( - IJavaProject jproject, IPath containerPath, IPath libPath) - throws JavaModelException { - IClasspathContainer container = JavaCore.getClasspathContainer( - containerPath, jproject); - ClasspathContainerInitializer initializer = JavaCore - .getClasspathContainerInitializer(containerPath.segment(0)); - if (container != null - && initializer != null - && initializer.canUpdateClasspathContainer(containerPath, - jproject)) { - IClasspathEntry[] entries = container.getClasspathEntries(); - for (int i = 0; i < entries.length; i++) { - IClasspathEntry curr = entries[i]; - IClasspathEntry resolved = JavaCore - .getResolvedClasspathEntry(curr); - if (resolved != null && libPath.equals(resolved.getPath())) { - return curr; // return the real entry - } - } - } - return null; // attachment not possible - } -} |