package org.rubypeople.rdt.internal.core.builder;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.SubMonitor;
import org.rubypeople.rdt.core.compiler.BuildContext;
import org.rubypeople.rdt.internal.core.util.Util;
public class IncrementalRdtCompiler extends AbstractRdtCompiler
{
private List<BuildContext> contexts;
private List<IFile> filesToClear;
private final IResourceDelta rootDelta;
public IncrementalRdtCompiler(IProject project, IResourceDelta delta, IMarkerManager markerManager)
{
super(project, markerManager);
this.rootDelta = delta;
}
public IncrementalRdtCompiler(IProject project, IResourceDelta delta)
{
this(project, delta, new MarkerManager());
}
protected void removeMarkers(IMarkerManager markerManager, IProgressMonitor monitor)
{
SubMonitor sub = SubMonitor.convert(monitor, "Removing Markers...", fParticipants.length);
for (IFile file : filesToClear)
{
markerManager.removeProblemsAndTasksFor(file);
sub.worked(1);
}
sub.done();
}
private void analyzeFiles() throws CoreException
{
filesToClear = new ArrayList<IFile>();
contexts = new ArrayList<BuildContext>();
rootDelta.accept(new IResourceDeltaVisitor()
{
public boolean visit(IResourceDelta delta) throws CoreException
{
IResource resource = delta.getResource();
if (isRubyFile(resource) || isERBFile(resource))
{
if (delta.getKind() == IResourceDelta.REMOVED)
{
filesToClear.add((IFile) resource);
}
else if (delta.getKind() == IResourceDelta.ADDED || delta.getKind() == IResourceDelta.CHANGED)
{
filesToClear.add((IFile) resource);
if (isERBFile(resource))
{
contexts.add(new ERBBuildContext((IFile) resource));
}
else
{
contexts.add(new BuildContext((IFile) resource));
}
}
}
if (IResource.FOLDER == resource.getType())
{
// HACK Don't create problems in vendor folders of ruby projects
if (resource.getProjectRelativePath().equals(new Path("vendor")))
{
return false;
}
}
return true;
}
private boolean isERBFile(IResource resource)
{
if (!(resource instanceof IFile))
return false;
String name = resource.getName();
return BuildContextCollector.isERB(name);
}
private boolean isRubyFile(IResource resource)
{
return resource instanceof IFile && Util.isRubyLikeFileName(resource.getName());
}
});
}
protected BuildContext[] getBuildContexts() throws CoreException
{
if (contexts == null)
{
analyzeFiles();
}
return contexts.toArray(new BuildContext[contexts.size()]);
}
}