X-Git-Url: http://git.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/builder/ParserBuilder.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/builder/ParserBuilder.java new file mode 100644 index 0000000..d351132 --- /dev/null +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/builder/ParserBuilder.java @@ -0,0 +1,166 @@ +package net.sourceforge.phpeclipse.builder; + +import java.util.Map; + +import net.sourceforge.phpdt.internal.ui.util.PHPFileUtil; +import net.sourceforge.phpeclipse.PHPeclipsePlugin; +import net.sourceforge.phpeclipse.phpeditor.PHPParserAction; +import net.sourceforge.phpeclipse.resourcesview.PHPProject; + +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.IResourceVisitor; +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 ParserBuilder extends IncrementalProjectBuilder { + private final static int TOTAL_WORK = 100; + + /** + * Constructor + */ + public ParserBuilder() { + } + + /** + * + */ + protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException { + monitor.beginTask("Parsing files", TOTAL_WORK); + + 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 FULL_BUILD 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: + PHPProject nature = (PHPProject) 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. + *

+ * This method is part of the IExecutableExtension + * interface. + *

+ *

+ * Subclasses are free to extend this method to pick up + * initialization parameters from the plug-in plug-in manifest + * (plugin.xml) file, + * but should be sure to invoke this method on their superclass. + *

+ * For example, the following method looks for a boolean-valued + * parameter named "trace": + *

+   *     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"));
+   *         }
+   *     }
+   * 
+ *

+ */ + 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 setInitializationData 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