package edu.ucsd.arcum.builders; import static edu.ucsd.arcum.ArcumPlugin.DEBUG; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceProxy; import org.eclipse.core.resources.IResourceProxyVisitor; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.content.IContentDescription; import org.eclipse.core.runtime.content.IContentType; import edu.ucsd.arcum.ArcumPlugin; import edu.ucsd.arcum.interpreter.parser.ArcumSourceFileParser; import edu.ucsd.arcum.interpreter.query.ArcumDeclarationTable; import edu.ucsd.arcum.util.FileUtil; // Builds only the .arcum files visited public class ArcumSourceBuilder implements IResourceProxyVisitor { private static int counter = 0; private ArcumDeclarationTable table; private IProgressMonitor monitor; private int numErrs; public ArcumSourceBuilder(ArcumDeclarationTable table, IProgressMonitor monitor) { this.table = table; this.monitor = monitor; this.numErrs = 0; } public boolean visit(IResourceProxy resource) throws CoreException { if (resource.getType() == IResource.FILE) { if (resource.isDerived()) { // skip over derived sources; they are either not .arcum source // files, or are copies of .arcum source files already seen in // the src directory return false; } IFile file = (IFile)resource.requestResource(); IContentDescription contentDescription = file.getContentDescription(); if (contentDescription == null) { if (DEBUG) { System.out.printf("File %s has no content description%n", file.getName()); } return false; } IContentType type = contentDescription.getContentType(); String id = type.getId(); //if (DEBUG) System.out.printf("#%d, Looking at %s (%s)%n", counter, file, id); ++counter; if (id.equals(ArcumPlugin.SOURCE_ID)) { String msg = String.format("Compiling %s", file); monitor.subTask(msg); if (DEBUG) System.out.printf("%s (%s)%n", msg, id); String source; String name; ArcumSourceFileParser parser; source = FileUtil.readFile(file); name = file.getFullPath().lastSegment(); parser = new ArcumSourceFileParser(source, file, name, file.getProject()); numErrs += parser.parseArcumSource(table); } } return true; } public int getNumberOfErrors() { return numErrs; } }