X-Git-Url: http://git.phpeclipse.com diff --git a/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/launching/PHPSourceLookupParticipant.java b/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/launching/PHPSourceLookupParticipant.java index d747466..3e7a34d 100644 --- a/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/launching/PHPSourceLookupParticipant.java +++ b/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/launching/PHPSourceLookupParticipant.java @@ -1,17 +1,155 @@ package net.sourceforge.phpeclipse.xdebug.php.launching; +import java.util.ArrayList; +import java.util.List; + +import net.sourceforge.phpeclipse.xdebug.core.PathMapItem; import net.sourceforge.phpeclipse.xdebug.php.model.XDebugStackFrame; +import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.MultiStatus; +import org.eclipse.core.runtime.Path; +import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.sourcelookup.AbstractSourceLookupParticipant; +import org.eclipse.debug.core.sourcelookup.ISourceContainer; +import org.eclipse.debug.internal.core.sourcelookup.SourceLookupMessages; public class PHPSourceLookupParticipant extends AbstractSourceLookupParticipant { + /* (non-Javadoc) + * @see org.eclipse.debug.core.sourcelookup.ISourceLookupParticipant#getSourceName(Object) + */ public String getSourceName(Object object) throws CoreException { if (object instanceof XDebugStackFrame) { - return ((XDebugStackFrame)object).getSourceName(); + return ((XDebugStackFrame) object).getSourceName(); } return null; } -} + /* (non-Javadoc) + * @see org.eclipse.debug.core.sourcelookup.ISourceLookupParticipant#findSourceElements(java.lang.Object) + */ + public Object[] findSourceElements(Object object) throws CoreException { + if (object == null) { + return new Object[] {}; + } + XDebugStackFrame stackFrame = null; + if (object instanceof XDebugStackFrame) { + stackFrame = (XDebugStackFrame) object; + } else { + return new Object[] {}; + } + + List results = null; + CoreException single = null; + MultiStatus multiStatus = null; + + if (isFindDuplicates()) { + results = new ArrayList(); + } + + String name = getSourceName(object); + if (name == null || name.length() == 0) { + return new Object[] {}; + } + + // here our stackframe is guaranteed not to be null + IPath sLocalPath = null; + + if (((XDebugStackFrame) object).getThread() == null) { + IPath sPath = new Path(stackFrame.getFullName().getPath()); + List pathMap = getDirector().getLaunchConfiguration() + .getAttribute(IXDebugConstants.ATTR_PHP_PATHMAP, (List) null); + + PathMapItem pmi = null; + for (int k = 0; k < pathMap.size(); k++) { + pmi = new PathMapItem((String) pathMap.get(k)); + + IPath local = new Path(pmi.getLocalPath().toString())/* .removeFirstSegments(1) */; + IPath remote = new Path(pmi.getRemotePath().toString())/* .removeFirstSegments(1) */; + + if (remote.matchingFirstSegments(sPath) == remote.segmentCount()) { + sLocalPath = local; + } + } + } else { + + } + + String Type = stackFrame.getType(); + + if (Type.equals("eval")) { + results.add("pippo"); + return results.toArray(); + } + + ISourceContainer[] containers = getSourceContainers(); + for (int i = 0; i < containers.length; i++) { + ISourceContainer container = getDelegateContainer(containers[i]); + if (container == null) { + continue; + } + + try { + Object[] objects = container.findSourceElements(name); + if (objects.length > 0) { + if (isFindDuplicates()) { + if (((XDebugStackFrame) object).getThread() == null) { + addMatching(results, sLocalPath, objects); + } else { + return objects; + } + } else { + if (objects.length == 1) { + return objects; + } + return new Object[] { objects[0] }; + } + } + } catch (CoreException e) { + if (single == null) { + single = e; + } else if (multiStatus == null) { + multiStatus = new MultiStatus(DebugPlugin + .getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR, + new IStatus[] { single.getStatus() }, + SourceLookupMessages.CompositeSourceContainer_0, + null); + multiStatus.add(e.getStatus()); + } else { + multiStatus.add(e.getStatus()); + } + } + } + if (results == null) { + if (multiStatus != null) { + throw new CoreException(multiStatus); + } else if (single != null) { + throw single; + } + return EMPTY; + } + return results.toArray(); + } + + static void addMatching(List results, IPath localPath, Object[] objects) { + if (results == null || localPath == null || objects == null) { + return; + } + for (int j = 0; j < objects.length; j++) { + if (objects[j] == null || !(objects[j] instanceof IFile)) { + continue; + } + IFile file = (IFile) objects[j]; + + IPath path = new Path(file.getLocation().toString()); + if (localPath.matchingFirstSegments(path) == localPath + .segmentCount()) { + results.add(objects[j]); + } + } + } +} \ No newline at end of file