package org.eclipse.jdt.internal.debug.ui.launcher; | |
/* | |
* (c) Copyright IBM Corp. 2000, 2001. | |
* All Rights Reserved. | |
*/ | |
import java.lang.reflect.InvocationTargetException; | |
import java.util.HashSet; | |
import java.util.Set; | |
import org.eclipse.core.runtime.IAdaptable; | |
import org.eclipse.core.runtime.IProgressMonitor; | |
import org.eclipse.core.runtime.SubProgressMonitor; | |
import org.eclipse.debug.core.model.IDebugTarget; | |
import org.eclipse.debug.core.model.IProcess; | |
import org.eclipse.jdt.core.IClassFile; | |
import org.eclipse.jdt.core.ICompilationUnit; | |
import org.eclipse.jdt.core.IJavaElement; | |
import org.eclipse.jdt.core.IType; | |
import org.eclipse.jdt.core.JavaModelException; | |
import org.eclipse.jdt.core.Signature; | |
import org.eclipse.jdt.core.search.IJavaSearchScope; | |
import org.eclipse.jdt.core.search.SearchEngine; | |
import org.eclipse.jdt.internal.corext.util.JavaModelUtil; | |
import org.eclipse.jdt.internal.debug.ui.JDIDebugUIPlugin; | |
import org.eclipse.jdt.internal.ui.util.MainMethodSearchEngine; | |
import org.eclipse.jdt.ui.IJavaElementSearchConstants; | |
import org.eclipse.jface.operation.IRunnableContext; | |
import org.eclipse.jface.operation.IRunnableWithProgress; | |
public class MainMethodFinder { | |
private MainMethodFinder() { | |
} | |
public static IType[] findTargets(IRunnableContext context, final Object[] elements) throws InvocationTargetException, InterruptedException{ | |
final Set result= new HashSet(); | |
if (elements.length > 0) { | |
IRunnableWithProgress runnable= new IRunnableWithProgress() { | |
public void run(IProgressMonitor pm) throws InterruptedException { | |
int nElements= elements.length; | |
pm.beginTask(LauncherMessages.getString("MainMethodFinder.description"), nElements); //$NON-NLS-1$ | |
try { | |
for (int i= 0; i < nElements; i++) { | |
try { | |
collectTypes(elements[i], new SubProgressMonitor(pm, 1), result); | |
} catch (JavaModelException e) { | |
JDIDebugUIPlugin.log(e); | |
} | |
if (pm.isCanceled()) { | |
throw new InterruptedException(); | |
} | |
} | |
} finally { | |
pm.done(); | |
} | |
} | |
}; | |
context.run(true, true, runnable); | |
} | |
return (IType[]) result.toArray(new IType[result.size()]) ; | |
} | |
private static void collectTypes(Object element, IProgressMonitor monitor, Set result) throws JavaModelException { | |
if (element instanceof IProcess) { | |
element= ((IProcess)element).getLaunch(); | |
} else if (element instanceof IDebugTarget) { | |
element= ((IDebugTarget)element).getLaunch(); | |
} | |
if (element instanceof IAdaptable) { | |
IJavaElement jelem= (IJavaElement) ((IAdaptable) element).getAdapter(IJavaElement.class); | |
if (jelem != null) { | |
IType parentType= (IType)jelem.getAncestor(IJavaElement.TYPE); | |
if (parentType != null && JavaModelUtil.hasMainMethod((IType) parentType)) { | |
result.add(parentType); | |
monitor.done(); | |
return; | |
} | |
IJavaElement openable= (IJavaElement) jelem.getOpenable(); | |
if (openable != null) { | |
if (openable.getElementType() == IJavaElement.COMPILATION_UNIT) { | |
ICompilationUnit cu= (ICompilationUnit) openable; | |
IType mainType= cu.getType(Signature.getQualifier(cu.getElementName())); | |
if (mainType.exists() && JavaModelUtil.hasMainMethod(mainType)) { | |
result.add(mainType); | |
} | |
monitor.done(); | |
return; | |
} else if (openable.getElementType() == IJavaElement.CLASS_FILE) { | |
IType mainType= ((IClassFile)openable).getType(); | |
if (JavaModelUtil.hasMainMethod(mainType)) { | |
result.add(mainType); | |
} | |
monitor.done(); | |
return; | |
} | |
} | |
IType[] types= searchMainMethods(jelem, monitor); | |
for (int i= 0; i < types.length; i++) { | |
result.add(types[i]); | |
} | |
} | |
} | |
} | |
private static IType[] searchMainMethods(IJavaElement elem, IProgressMonitor monitor) throws JavaModelException { | |
IJavaSearchScope scope= SearchEngine.createJavaSearchScope(new IJavaElement[] { elem }); | |
MainMethodSearchEngine searchEngine= new MainMethodSearchEngine(); | |
return searchEngine.searchMainMethods(monitor, scope, IJavaElementSearchConstants.CONSIDER_BINARIES); | |
} | |
} | |