--- /dev/null
+package net.sourceforge.phpeclipse.builder;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.util.Map;
+
+import net.sourceforge.phpdt.core.IJavaModelMarker;
+import net.sourceforge.phpdt.internal.core.JavaProject;
+import net.sourceforge.phpdt.internal.core.util.SimpleLookupTable;
+import net.sourceforge.phpdt.internal.ui.util.PHPFileUtil;
+import net.sourceforge.phpeclipse.PHPeclipsePlugin;
+import net.sourceforge.phpeclipse.phpeditor.PHPParserAction;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.IResourceVisitor;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.IncrementalProjectBuilder;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+
+/**
+ * Builder for .php files.
+ *
+ *
+ * @see org.eclipse.core.resources.IncrementalProjectBuilder
+ * @see org.eclipse.core.resources.IResourceDelta
+ */
+public class PHPBuilder extends IncrementalProjectBuilder {
+ IProject currentProject;
+ JavaProject javaProject;
+ IWorkspaceRoot workspaceRoot;
+ // NameEnvironment nameEnvironment;
+ SimpleLookupTable binaryLocationsPerProject;
+ // maps a project to its binary resources (output folders, class folders, zip/jar files)
+ State lastState;
+
+// BuildNotifier notifier;
+
+ private final static int TOTAL_WORK = 100;
+
+ public static IMarker[] getProblemsFor(IResource resource) {
+ try {
+ if (resource != null && resource.exists())
+ return resource.findMarkers(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER, false, IResource.DEPTH_INFINITE);
+ } catch (CoreException e) {
+ } // assume there are no problems
+ return new IMarker[0];
+ }
+
+ public static IMarker[] getTasksFor(IResource resource) {
+ try {
+ if (resource != null && resource.exists())
+ return resource.findMarkers(IJavaModelMarker.TASK_MARKER, false, IResource.DEPTH_INFINITE);
+ } catch (CoreException e) {
+ } // assume there are no tasks
+ return new IMarker[0];
+ }
+
+ // public static void finishedBuilding(IResourceChangeEvent event) {
+ // BuildNotifier.resetProblemCounters();
+ // }
+
+ public static void removeProblemsFor(IResource resource) {
+ try {
+ if (resource != null && resource.exists())
+ resource.deleteMarkers(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER, false, IResource.DEPTH_INFINITE);
+ } catch (CoreException e) {
+ } // assume there were no problems
+ }
+
+ public static void removeTasksFor(IResource resource) {
+ try {
+ if (resource != null && resource.exists())
+ resource.deleteMarkers(IJavaModelMarker.TASK_MARKER, false, IResource.DEPTH_INFINITE);
+ } catch (CoreException e) {
+ } // assume there were no problems
+ }
+
+ public static void removeProblemsAndTasksFor(IResource resource) {
+ try {
+ if (resource != null && resource.exists()) {
+ resource.deleteMarkers(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER, false, IResource.DEPTH_INFINITE);
+ resource.deleteMarkers(IJavaModelMarker.TASK_MARKER, false, IResource.DEPTH_INFINITE);
+ }
+ } catch (CoreException e) {
+ } // assume there were no problems
+ }
+ public static State readState(IProject project, DataInputStream in) throws IOException {
+ return State.read(project, in);
+ }
+
+ public static void writeState(Object state, DataOutputStream out) throws IOException {
+ ((State) state).write(out);
+ }
+
+ /**
+ * Constructor
+ */
+ public PHPBuilder() {
+ }
+
+ /**
+ *
+ */
+ protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException {
+ monitor.beginTask("Parsing files", TOTAL_WORK);
+ this.currentProject = getProject();
+ if (currentProject == null || !currentProject.isAccessible())
+ return new IProject[0];
+
+ if (kind == IncrementalProjectBuilder.FULL_BUILD) {
+ IResourceDelta delta = getDelta(getProject());
+
+ processFull(getProject(), monitor);
+
+ } else { // INCREMENTAL_BUILD or AUTO_BUILD
+
+ IResourceDelta delta = getDelta(getProject());
+ if (delta != null) {
+ delta.accept(new ParserVisitor(getProject(), monitor));
+ }
+
+ }
+ monitor.done();
+ return null;
+ }
+
+ /**
+ * Performs a <code>FULL_BUILD</code> by visiting all nodes in the resource
+ * tree under the specified project.
+ *
+ * @param iProject
+ */
+ public void processFull(final IProject iProject, final IProgressMonitor monitor) {
+ final IdentifierIndexManager indexManager = PHPeclipsePlugin.getDefault().getIndexManager(iProject);
+ // Create resource visitor logic
+ IResourceVisitor myVisitor = new IResourceVisitor() {
+ public boolean visit(IResource resource) throws CoreException {
+ if (resource.getType() == IResource.FILE) {
+ if (monitor.isCanceled()) {
+ throw new OperationCanceledException();
+ }
+ if ((resource.getFileExtension() != null) && PHPFileUtil.isPHPFile((IFile) resource)) {
+ monitor.worked(1);
+ monitor.subTask("Parsing: " + resource.getFullPath());
+ // check for parsing errors
+ PHPParserAction.parseFile((IFile) resource);
+ // update indexfile for the project:
+ JavaProject nature = (JavaProject) iProject.getNature(PHPeclipsePlugin.PHP_NATURE_ID);
+ indexManager.addFile((IFile) resource);
+ }
+ }
+
+ return true;
+ }
+ };
+
+ // Process the project using the visitor just created
+ try {
+
+ // if (iProject.hasNature(PHPeclipsePlugin.PHP_NATURE_ID)) {
+ // thePHPProject = new PHPProject();
+ // thePHPProject.setProject(iProject);
+ // }
+ indexManager.initialize();
+ iProject.accept(myVisitor);
+ indexManager.writeFile();
+ } catch (CoreException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ /**
+ * Sets initialization data for this builder.
+ * <p>
+ * This method is part of the <code>IExecutableExtension</code>
+ * interface.
+ * </p>
+ * <p>
+ * Subclasses are free to extend this method to pick up
+ * initialization parameters from the plug-in plug-in manifest
+ * (<code>plugin.xml</code>) file,
+ * but should be sure to invoke this method on their superclass.
+ * <p>
+ * For example, the following method looks for a boolean-valued
+ * parameter named "trace":
+ * <pre>
+ * public void setInitializationData(IConfigurationElement cfig,
+ * String propertyName, Object data)
+ * throws CoreException {
+ * super.setInitializationData(cfig, propertyName, data);
+ * if (data instanceof Hashtable) {
+ * Hashtable args = (Hashtable) data;
+ * String traceValue = (String) args.get("trace");
+ * TRACING = (traceValue!=null && traceValue.equals("true"));
+ * }
+ * }
+ * </pre>
+ * </p>
+ */
+ public void setInitializationData(IConfigurationElement config, String propertyName, Object data) throws CoreException {
+ super.setInitializationData(config, propertyName, data);
+
+ }
+
+ /**
+ * Informs this builder that it is being started by the build management
+ * infrastructure. By the time this method is run, the builder's project
+ * is available and <code>setInitializationData</code> has been called.
+ * The default implementation should be called by all overriding methods.
+ *
+ * @see #setInitializationData
+ */
+ protected void startupOnInitialize() {
+ // traceMsg("Parse Builder Initialize - startupOnInitialize()");
+ }
+
+ /**
+ * Write trace statements.
+ * System.out.println with prefix tagging used for simplicity.
+ */
+ // private void traceMsg(String msg) {
+ // if (PHPeclipsePlugin.DEBUG | traceEnabled)
+ // System.out.println(
+ // buildMode
+ // + "<"
+ // + getProject()
+ // + "> "
+ // + "\t\t\t"
+ // + buildMark
+ // + msg);
+ // }
+
+}
\ No newline at end of file