| package org.eclipse.dltk.launching; |
| |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.HashSet; |
| import java.util.List; |
| |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.debug.core.ILaunchConfiguration; |
| |
| public class StandardSourcepathProvider extends StandardBuildpathProvider { |
| |
| @Override |
| public IRuntimeBuildpathEntry[] computeUnresolvedBuildpath( |
| ILaunchConfiguration configuration) throws CoreException { |
| boolean useDefault = configuration.getAttribute( |
| ScriptLaunchConfigurationConstants.ATTR_DEFAULT_SOURCEPATH, |
| true); |
| IRuntimeBuildpathEntry[] entries = null; |
| if (useDefault) { |
| // the default source lookup path is the same as the classpath |
| entries = super.computeUnresolvedBuildpath(configuration); |
| } else { |
| // recover persisted source path |
| entries = recoverRuntimePath(configuration, |
| ScriptLaunchConfigurationConstants.ATTR_SOURCEPATH); |
| } |
| return entries; |
| |
| } |
| |
| @Override |
| public IRuntimeBuildpathEntry[] resolveBuildpath( |
| IRuntimeBuildpathEntry[] entries, |
| ILaunchConfiguration configuration) throws CoreException { |
| List all = new UniqueList(entries.length); |
| for (int i = 0; i < entries.length; i++) { |
| switch (entries[i].getType()) { |
| case IRuntimeBuildpathEntry.PROJECT: |
| // a project resolves to itself for source lookup (rather than |
| // the class file output locations) |
| all.add(entries[i]); |
| break; |
| default: |
| IRuntimeBuildpathEntry[] resolved = ScriptRuntime |
| .resolveRuntimeBuildpathEntry(entries[1], |
| configuration); |
| all.add(resolved); |
| break; |
| } |
| } |
| |
| return (IRuntimeBuildpathEntry[]) all |
| .toArray(new IRuntimeBuildpathEntry[all.size()]); |
| } |
| |
| class UniqueList<T> extends ArrayList<T> { |
| private static final long serialVersionUID = -7402160651027036270L; |
| HashSet<T> set; |
| |
| public UniqueList(int length) { |
| super(length); |
| set = new HashSet<>(length); |
| } |
| |
| @Override |
| public void add(int index, T element) { |
| if (set.add(element)) |
| super.add(index, element); |
| } |
| |
| @Override |
| public boolean add(T o) { |
| if (set.add(o)) |
| return super.add(o); |
| return false; |
| } |
| |
| @Override |
| public boolean addAll(Collection<? extends T> c) { |
| if (set.addAll(c)) |
| return super.addAll(c); |
| return false; |
| } |
| |
| @Override |
| public boolean addAll(int index, Collection<? extends T> c) { |
| if (set.addAll(c)) |
| return super.addAll(index, c); |
| return false; |
| } |
| |
| @Override |
| public void clear() { |
| set.clear(); |
| super.clear(); |
| } |
| |
| @Override |
| public boolean contains(Object elem) { |
| return set.contains(elem); |
| } |
| |
| @Override |
| public void ensureCapacity(int minCapacity) { |
| super.ensureCapacity(minCapacity); |
| } |
| |
| @Override |
| public T remove(int index) { |
| T object = super.remove(index); |
| set.remove(object); |
| return object; |
| } |
| |
| @Override |
| protected void removeRange(int fromIndex, int toIndex) { |
| for (int index = fromIndex; index <= toIndex; index++) |
| remove(index); |
| } |
| |
| @Override |
| public T set(int index, T element) { |
| set.remove(element); |
| if (set.add(element)) |
| return super.set(index, element); |
| return null; // should not happen. |
| } |
| } |
| } |