1 11 package org.eclipse.jdt.internal.corext.refactoring.rename; 12 13 import java.util.ArrayList ; 14 import java.util.Collection ; 15 import java.util.HashSet ; 16 import java.util.Iterator ; 17 import java.util.List ; 18 import java.util.Set ; 19 20 import org.eclipse.core.runtime.IPath; 21 22 import org.eclipse.core.resources.IProject; 23 24 import org.eclipse.jdt.core.IClasspathEntry; 25 import org.eclipse.jdt.core.IJavaElement; 26 import org.eclipse.jdt.core.IJavaProject; 27 import org.eclipse.jdt.core.IMember; 28 import org.eclipse.jdt.core.IPackageFragmentRoot; 29 import org.eclipse.jdt.core.JavaCore; 30 import org.eclipse.jdt.core.JavaModelException; 31 import org.eclipse.jdt.core.search.IJavaSearchScope; 32 import org.eclipse.jdt.core.search.SearchEngine; 33 34 import org.eclipse.jdt.internal.corext.Assert; 35 import org.eclipse.jdt.internal.corext.util.JdtFlags; 36 37 public class RefactoringScopeFactory { 38 39 private RefactoringScopeFactory() { 40 } 42 43 public static IJavaSearchScope create(IMember[] members) throws JavaModelException { 44 Assert.isTrue(members != null && members.length > 0); 45 IMember candidate= members[0]; 46 int visibility= getVisibility(candidate); 47 for (int i= 1; i < members.length; i++) { 48 int mv= getVisibility(members[i]); 49 if (mv > visibility) { 50 visibility= mv; 51 candidate= members[i]; 52 } 53 } 54 return create(candidate); 55 } 56 57 private static int getVisibility(IMember member) throws JavaModelException { 58 if (JdtFlags.isPrivate(member)) 59 return 0; 60 if (JdtFlags.isPackageVisible(member)) 61 return 1; 62 if (JdtFlags.isProtected(member)) 63 return 2; 64 return 4; 65 } 66 67 70 public static IJavaSearchScope create(IJavaElement javaElement) throws JavaModelException { 71 if (javaElement instanceof IMember) { 72 IMember member= (IMember) javaElement; 73 if (JdtFlags.isPrivate(member)) { 74 if (member.getCompilationUnit() != null) 75 return SearchEngine.createJavaSearchScope(new IJavaElement[] { member.getCompilationUnit()}); 76 else 77 return SearchEngine.createJavaSearchScope(new IJavaElement[] { member }); 78 } 79 } 83 return create(javaElement.getJavaProject()); 84 } 85 86 private static IJavaSearchScope create(IJavaProject javaProject) throws JavaModelException { 87 return SearchEngine.createJavaSearchScope(getAllScopeElements(javaProject), false); 88 } 89 90 private static IJavaElement[] getAllScopeElements(IJavaProject project) throws JavaModelException { 91 Collection sourceRoots= getAllSourceRootsInProjects(getReferencingProjects(project)); 92 return (IPackageFragmentRoot[]) sourceRoots.toArray(new IPackageFragmentRoot[sourceRoots.size()]); 93 } 94 95 100 private static Collection getReferencingProjects(IJavaProject focus) throws JavaModelException { 101 Set projects= new HashSet (); 102 103 addReferencingProjects(focus, projects); 104 projects.add(focus); 105 return projects; 106 } 107 108 116 private static void addReferencingProjects(IJavaProject focus, Set projects) throws JavaModelException { 117 IProject[] referencingProjects= focus.getProject().getReferencingProjects(); 118 for (int i= 0; i < referencingProjects.length; i++) { 119 IJavaProject candidate= JavaCore.create(referencingProjects[i]); 120 if (candidate == null || projects.contains(candidate) || !candidate.exists()) 121 continue; IClasspathEntry entry= getReferencingClassPathEntry(candidate, focus); 123 if (entry != null) { 124 projects.add(candidate); 125 if (entry.isExported()) 126 addReferencingProjects(candidate, projects); 127 } 128 } 129 } 130 131 142 private static IClasspathEntry getReferencingClassPathEntry(IJavaProject referencingProject, IJavaProject referencedProject) throws JavaModelException { 143 IClasspathEntry result= null; 144 IPath path= referencedProject.getProject().getFullPath(); 145 IClasspathEntry[] classpath= referencingProject.getResolvedClasspath(true); 146 for (int i= 0; i < classpath.length; i++) { 147 IClasspathEntry entry= classpath[i]; 148 if (entry.getEntryKind() == IClasspathEntry.CPE_PROJECT && path.equals(entry.getPath())) { 149 if (entry.isExported()) 150 return entry; 151 result= entry; 154 } 155 } 156 return result; 157 } 158 159 165 private static Collection getAllSourceRootsInProjects(Collection projects) throws JavaModelException { 166 List result= new ArrayList (); 167 for (Iterator it= projects.iterator(); it.hasNext();) 168 result.addAll(getSourceRoots((IJavaProject) it.next())); 169 return result; 170 } 171 172 private static List getSourceRoots(IJavaProject javaProject) throws JavaModelException { 173 List elements= new ArrayList (); 174 IPackageFragmentRoot[] roots= javaProject.getPackageFragmentRoots(); 175 for (int i= 0; i < roots.length; i++) { 177 IPackageFragmentRoot root= roots[i]; 178 if (!root.isArchive()) 179 elements.add(root); 180 } 181 return elements; 182 } 183 184 187 public static IJavaSearchScope createReferencedScope(IJavaElement[] javaElements) { 188 Set projects= new HashSet (); 189 for (int i= 0; i < javaElements.length; i++) { 190 projects.add(javaElements[i].getJavaProject()); 191 } 192 IJavaProject[] prj= (IJavaProject[]) projects.toArray(new IJavaProject[projects.size()]); 193 return SearchEngine.createJavaSearchScope(prj, true); 194 } 195 } 196 | Popular Tags |