improved PHP parser
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / core / PackageFragment.java
index 2b559f5..9af6588 100644 (file)
  *******************************************************************************/
 package net.sourceforge.phpdt.internal.core;
 
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Map;
+
 import net.sourceforge.phpdt.core.ICompilationUnit;
 import net.sourceforge.phpdt.core.IJavaElement;
-import net.sourceforge.phpdt.core.IJavaProject;
 import net.sourceforge.phpdt.core.IPackageFragment;
 import net.sourceforge.phpdt.core.IPackageFragmentRoot;
 import net.sourceforge.phpdt.core.JavaModelException;
+import net.sourceforge.phpdt.core.WorkingCopyOwner;
+import net.sourceforge.phpdt.internal.core.util.MementoTokenizer;
+import net.sourceforge.phpdt.internal.core.util.Util;
+import net.sourceforge.phpdt.internal.ui.util.PHPFileUtil;
 
 import org.eclipse.core.resources.IContainer;
 import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.Path;
 
@@ -31,49 +40,109 @@ public class PackageFragment extends Openable implements IPackageFragment {
         * Constant empty list of compilation units
         */
        protected static ICompilationUnit[] fgEmptyCompilationUnitList= new ICompilationUnit[] {};
-/**
- * Constructs a handle for a package fragment
- *
- * @see IPackageFragment
- */
-protected PackageFragment(IPackageFragmentRoot root, String name) {
-       super(PACKAGE_FRAGMENT, null, name);
-}
-/**
- * Compute the children of this package fragment.
- *
- * <p>Package fragments which are folders recognize files based on the
- * type of the fragment
- * <p>Package fragments which are in a jar only recognize .class files (
- * @see JarPackageFragment).
- */
+       /**
+        * Constructs a handle for a package fragment
+        *
+        * @see IPackageFragment
+        */
+       protected PackageFragment(PackageFragmentRoot root, String name) {
+               super(root, name);
+       }
+       /**
+        * @see Openable
+        */
+       protected boolean buildStructure(OpenableElementInfo info, IProgressMonitor pm, Map newElements, IResource underlyingResource) throws JavaModelException {
+
+               // check whether this pkg can be opened
+               if (!underlyingResource.isAccessible()) throw newNotPresentException();
+
+               int kind = getKind();
+               String extType;
+//             if (kind == IPackageFragmentRoot.K_SOURCE) {
+                       extType = "php"; //EXTENSION_java;
+//             } else {
+//                     extType = EXTENSION_class;
+//             }
+
+               // add compilation units/class files from resources
+               HashSet vChildren = new HashSet();
+               try {
+                   PackageFragmentRoot root = getPackageFragmentRoot();
+//                     char[][] inclusionPatterns = root.fullInclusionPatternChars();
+                       char[][] exclusionPatterns = root.fullExclusionPatternChars();
+                       IResource[] members = ((IContainer) underlyingResource).members();
+                       for (int i = 0, max = members.length; i < max; i++) {
+                               IResource child = members[i];
+                               if (child.getType() != IResource.FOLDER
+                                               && !Util.isExcluded(child, exclusionPatterns)) {
+                                       String extension = child.getProjectRelativePath().getFileExtension();
+                                       if (extension != null) {
+                                               if (extension.equalsIgnoreCase(extType)) {
+                                                       IJavaElement childElement;
+//                                                     if (kind == IPackageFragmentRoot.K_SOURCE && ProjectPrefUtil.isValidCompilationUnitName(child.getName())) {
+//                                                             childElement = new CompilationUnit(this, child.getName(), DefaultWorkingCopyOwner.PRIMARY);
+//                                                             vChildren.add(childElement);
+//                                                     } else if (ProjectPrefUtil.isValidClassFileName(child.getName())) {
+//                                                             childElement = getClassFile(child.getName());
+//                                                             vChildren.add(childElement);
+//                                                     }
+                                               }
+                                       }
+                               }
+                       }
+               } catch (CoreException e) {
+                       throw new JavaModelException(e);
+               }
+               
+//             if (kind == IPackageFragmentRoot.K_SOURCE) {
+//                     // add primary compilation units
+//                     ICompilationUnit[] primaryCompilationUnits = getCompilationUnits(DefaultWorkingCopyOwner.PRIMARY);
+//                     for (int i = 0, length = primaryCompilationUnits.length; i < length; i++) {
+//                             ICompilationUnit primary = primaryCompilationUnits[i];
+//                             vChildren.add(primary);
+//                     }
+//             }
+               
+               IJavaElement[] children = new IJavaElement[vChildren.size()];
+               vChildren.toArray(children);
+               info.setChildren(children);
+               return true;
+       }
+///**
+// * Compute the children of this package fragment.
+// *
+// * <p>Package fragments which are folders recognize files based on the
+// * type of the fragment
+// * <p>Package fragments which are in a jar only recognize .class files (
+// * @see JarPackageFragment).
+// */
 //protected boolean computeChildren(OpenableElementInfo info, IResource resource) throws JavaModelException {
 //     ArrayList vChildren = new ArrayList();
-//     int kind = getKind();
+////   int kind = getKind();
 //     String extType;
-//     if (kind == IPackageFragmentRoot.K_SOURCE) {
-//             extType = "java"; //$NON-NLS-1$
-//     } else {
-//             extType = "class"; //$NON-NLS-1$
-//     }
+////   if (kind == IPackageFragmentRoot.K_SOURCE) {
+//             extType = "php"; //$NON-NLS-1$
+////   } else {
+////           extType = "class"; //$NON-NLS-1$
+////   }
 //     try {
 //             char[][] exclusionPatterns = ((PackageFragmentRoot)getPackageFragmentRoot()).fullExclusionPatternChars();
 //             IResource[] members = ((IContainer) resource).members();
 //             for (int i = 0, max = members.length; i < max; i++) {
 //                     IResource child = members[i];
 //                     if (child.getType() != IResource.FOLDER
-//                                     && !Util.isExcluded(child, exclusionPatterns)) {
+//                                     && !ProjectPrefUtil.isExcluded(child, exclusionPatterns)) {
 //                             String extension = child.getProjectRelativePath().getFileExtension();
 //                             if (extension != null) {
 //                                     if (extension.equalsIgnoreCase(extType)) {
 //                                             IJavaElement childElement;
-//                                             if (kind == IPackageFragmentRoot.K_SOURCE && Util.isValidCompilationUnitName(child.getName())) {
-//                                                     childElement = getCompilationUnit(child.getName());
-//                                                     vChildren.add(childElement);
-//                                             } else if (Util.isValidClassFileName(child.getName())) {
-//                                                     childElement = getClassFile(child.getName());
-//                                                     vChildren.add(childElement);
-//                                             }
+////                                           if (kind == IPackageFragmentRoot.K_SOURCE && ProjectPrefUtil.isValidCompilationUnitName(child.getName())) {
+////                                                   childElement = getCompilationUnit(child.getName());
+////                                                   vChildren.add(childElement);
+////                                           } else if (ProjectPrefUtil.isValidClassFileName(child.getName())) {
+////                                                   childElement = getClassFile(child.getName());
+////                                                   vChildren.add(childElement);
+////                                           }
 //                                     }
 //                             }
 //                     }
@@ -98,7 +167,7 @@ protected PackageFragment(IPackageFragmentRoot root, String name) {
  */
 //public void copy(IJavaElement container, IJavaElement sibling, String rename, boolean force, IProgressMonitor monitor) throws JavaModelException {
 //     if (container == null) {
-//             throw new IllegalArgumentException(Util.bind("operation.nullContainer")); //$NON-NLS-1$
+//             throw new IllegalArgumentException(ProjectPrefUtil.bind("operation.nullContainer")); //$NON-NLS-1$
 //     }
 //     IJavaElement[] elements= new IJavaElement[] {this};
 //     IJavaElement[] containers= new IJavaElement[] {container};
@@ -124,9 +193,9 @@ public ICompilationUnit createCompilationUnit(String name, String contents, bool
 /**
  * @see JavaElement
  */
-//protected OpenableElementInfo createElementInfo() {
-//     return new PackageFragmentInfo();
-//}
+protected Object createElementInfo() {
+       return new PackageFragmentInfo();
+}
 /**
  * @see ISourceManipulation
  */
@@ -134,9 +203,9 @@ public ICompilationUnit createCompilationUnit(String name, String contents, bool
 //     IJavaElement[] elements = new IJavaElement[] {this};
 //     getJavaModel().delete(elements, force, monitor);
 //}
-/**
- * @see Openable
- */
+///**
+// * @see Openable
+// */
 //protected boolean generateInfos(OpenableElementInfo info, IProgressMonitor pm, Map newElements, IResource underlyingResource) throws JavaModelException {
 //     
 //     return computeChildren(info, underlyingResource);
@@ -166,23 +235,51 @@ public ICompilationUnit createCompilationUnit(String name, String contents, bool
 //}
 /**
  * @see IPackageFragment#getCompilationUnit(String)
+ * @exception IllegalArgumentExcpetion if the name does not end with a php file extension
  */
-public ICompilationUnit getCompilationUnit(String name) {
-       return new CompilationUnit(this, name);
+public ICompilationUnit getCompilationUnit(String cuName) {
+       if (!  PHPFileUtil.isValidPHPUnitName(cuName)) {
+               throw new IllegalArgumentException(Util.bind("convention.unit.notJavaName")); //$NON-NLS-1$
+       }
+       return new CompilationUnit(this, cuName, DefaultWorkingCopyOwner.PRIMARY);
 }
 /**
  * @see IPackageFragment#getCompilationUnits()
  */
-//public ICompilationUnit[] getCompilationUnits() throws JavaModelException {
-//     if (getKind() == IPackageFragmentRoot.K_BINARY) {
-//             return fgEmptyCompilationUnitList;
-//     }
-//     
-//     ArrayList list = getChildrenOfType(COMPILATION_UNIT);
-//     ICompilationUnit[] array= new ICompilationUnit[list.size()];
-//     list.toArray(array);
-//     return array;
-//}
+public ICompilationUnit[] getCompilationUnits() throws JavaModelException {
+       if (getKind() == IPackageFragmentRoot.K_BINARY) {
+               return fgEmptyCompilationUnitList;
+       }
+       
+       ArrayList list = getChildrenOfType(COMPILATION_UNIT);
+       ICompilationUnit[] array= new ICompilationUnit[list.size()];
+       list.toArray(array);
+       return array;
+}
+/**
+ * @see IJavaElement
+ */
+public int getElementType() {
+       return PACKAGE_FRAGMENT;
+}
+/*
+ * @see JavaElement
+ */
+public IJavaElement getHandleFromMemento(String token, MementoTokenizer memento, WorkingCopyOwner owner) {
+       switch (token.charAt(0)) {
+               case JEM_COUNT:
+                       return getHandleUpdatingCountFromMemento(memento, owner);
+//             case JEM_CLASSFILE:
+//                     String classFileName = memento.nextToken();
+//                     JavaElement classFile = (JavaElement)getClassFile(classFileName);
+//                     return classFile.getHandleFromMemento(memento, owner);
+               case JEM_COMPILATIONUNIT:
+                       String cuName = memento.nextToken();
+                       JavaElement cu = new CompilationUnit(this, cuName, owner);
+                       return cu.getHandleFromMemento(memento, owner);
+       }
+       return null;
+}
 /**
  * @see JavaElement#getHandleMementoDelimiter()
  */
@@ -192,9 +289,9 @@ protected char getHandleMementoDelimiter() {
 /**
  * @see IPackageFragment#getKind()
  */
-//public int getKind() throws JavaModelException {
-//     return ((IPackageFragmentRoot)getParent()).getKind();
-//}
+public int getKind() throws JavaModelException {
+       return ((IPackageFragmentRoot)getParent()).getKind();
+}
 /**
  * Returns an array of non-java resources contained in the receiver.
  */
@@ -209,14 +306,15 @@ protected char getHandleMementoDelimiter() {
 /**
  * @see IJavaElement#getPath()
  */
-//public IPath getPath() {
-//     PackageFragmentRoot root = this.getPackageFragmentRoot();
-//     if (root.isArchive()) {
-//             return root.getPath();
-//     } else {
+public IPath getPath() {
+       PackageFragmentRoot root = this.getPackageFragmentRoot();
+       if (root.isArchive()) {
+               return root.getPath();
+       } else {
 //             return root.getPath().append(this.getElementName().replace('.', '/'));
-//     }
-//}
+               return root.getPath().append(this.getElementName());
+       }
+}
 /**
  * @see IJavaElement#getResource()
  */
@@ -229,7 +327,8 @@ public IResource getResource() {
                if (elementName.length() == 0) {
                        return root.getResource();
                } else {
-                       return ((IContainer)root.getResource()).getFolder(new Path(this.getElementName().replace('.', '/')));
+//                     return ((IContainer)root.getResource()).getFolder(new Path(this.getElementName().replace('.', '/')));
+                       return ((IContainer)root.getResource()).getFolder(new Path(this.getElementName()));
                }
        }
 }
@@ -237,7 +336,7 @@ public IResource getResource() {
  * @see IJavaElement#getUnderlyingResource()
  */
 public IResource getUnderlyingResource() throws JavaModelException {
-       IResource rootResource = fParent.getUnderlyingResource();
+       IResource rootResource = parent.getUnderlyingResource();
        if (rootResource == null) {
                //jar package fragment root that has no associated resource
                return null;
@@ -286,7 +385,7 @@ public boolean isDefaultPackage() {
  */
 //public void move(IJavaElement container, IJavaElement sibling, String rename, boolean force, IProgressMonitor monitor) throws JavaModelException {
 //     if (container == null) {
-//             throw new IllegalArgumentException(Util.bind("operation.nullContainer")); //$NON-NLS-1$
+//             throw new IllegalArgumentException(ProjectPrefUtil.bind("operation.nullContainer")); //$NON-NLS-1$
 //     }
 //     IJavaElement[] elements= new IJavaElement[] {this};
 //     IJavaElement[] containers= new IJavaElement[] {container};
@@ -321,22 +420,22 @@ public boolean isDefaultPackage() {
  */
 //public void rename(String name, boolean force, IProgressMonitor monitor) throws JavaModelException {
 //     if (name == null) {
-//             throw new IllegalArgumentException(Util.bind("element.nullName")); //$NON-NLS-1$
+//             throw new IllegalArgumentException(ProjectPrefUtil.bind("element.nullName")); //$NON-NLS-1$
 //     }
 //     IJavaElement[] elements= new IJavaElement[] {this};
 //     IJavaElement[] dests= new IJavaElement[] {this.getParent()};
 //     String[] renamings= new String[] {name};
 //     getJavaModel().rename(elements, dests, renamings, force, monitor);
 //}
-/*
- * @see JavaElement#rootedAt(IJavaProject)
- */
-public IJavaElement rootedAt(IJavaProject project) {
-       return
-               new PackageFragment(
-                       (IPackageFragmentRoot)((JavaElement)fParent).rootedAt(project), 
-                       fName);
-}
+///*
+// * @see JavaElement#rootedAt(IJavaProject)
+// */
+//public IJavaElement rootedAt(IJavaProject project) {
+//     return
+//             new PackageFragment(
+//                     (IPackageFragmentRoot)((JavaElement)parent).rootedAt(project), 
+//                     name);
+//}
 /**
  * Debugging purposes
  */