improved PHP parser
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / core / JavaElement.java
index 6eb79ee..a14455c 100644 (file)
@@ -25,8 +25,10 @@ import net.sourceforge.phpdt.core.IParent;
 import net.sourceforge.phpdt.core.ISourceRange;
 import net.sourceforge.phpdt.core.ISourceReference;
 import net.sourceforge.phpdt.core.JavaModelException;
+import net.sourceforge.phpdt.core.WorkingCopyOwner;
 import net.sourceforge.phpdt.core.jdom.IDOMCompilationUnit;
 import net.sourceforge.phpdt.core.jdom.IDOMNode;
+import net.sourceforge.phpdt.internal.core.util.MementoTokenizer;
 import net.sourceforge.phpdt.internal.core.util.Util;
 import net.sourceforge.phpdt.internal.corext.Assert;
 
@@ -43,13 +45,13 @@ import org.eclipse.core.runtime.jobs.ISchedulingRule;
 
 /**
  * Root of Java element handle hierarchy.
- * 
+ *  
  * @see IJavaElement
  */
 public abstract class JavaElement extends PlatformObject
                implements
                        IJavaElement {
-
+    public static final char JEM_ESCAPE = '\\';
        public static final char JEM_JAVAPROJECT = '=';
        public static final char JEM_PACKAGEFRAGMENTROOT = Path.SEPARATOR;
        public static final char JEM_PACKAGEFRAGMENT = '<';
@@ -57,10 +59,12 @@ public abstract class JavaElement extends PlatformObject
        public static final char JEM_METHOD = '~';
        public static final char JEM_INITIALIZER = '|';
        public static final char JEM_COMPILATIONUNIT = '{';
-       public static final char JEM_CLASSFILE = '(';
+//     public static final char JEM_CLASSFILE = '(';
        public static final char JEM_TYPE = '[';
        public static final char JEM_PACKAGEDECLARATION = '%';
        public static final char JEM_IMPORTDECLARATION = '#';
+       public static final char JEM_COUNT = '!';
+       public static final char JEM_LOCALVARIABLE = '@';
 
        /**
         * A count to uniquely identify this element in the case that a duplicate
@@ -77,10 +81,10 @@ public abstract class JavaElement extends PlatformObject
         */
        //protected int fLEType = 0;
        /**
-        * This element's parent, or <code>null</code> if this element does not
-        * have a parent.
+        * This element's parent, or <code>null</code> if this
+        * element does not have a parent.
         */
-       protected IJavaElement parent;
+       protected JavaElement parent;
 
        /**
         * This element's name, or an empty <code>String</code> if this element
@@ -159,6 +163,30 @@ public abstract class JavaElement extends PlatformObject
        protected boolean equalsDOMNode(IDOMNode node) throws JavaModelException {
                return false;
        }
+       protected void escapeMementoName(StringBuffer buffer, String mementoName) {
+               for (int i = 0, length = mementoName.length(); i < length; i++) {
+                       char character = mementoName.charAt(i);
+                       switch (character) {
+                               case JEM_ESCAPE:
+                               case JEM_COUNT:
+                               case JEM_JAVAPROJECT:
+                               case JEM_PACKAGEFRAGMENTROOT:
+                               case JEM_PACKAGEFRAGMENT:
+                               case JEM_FIELD:
+                               case JEM_METHOD:
+                               case JEM_INITIALIZER:
+                               case JEM_COMPILATIONUNIT:
+//                             case JEM_CLASSFILE:
+                               case JEM_TYPE:
+                               case JEM_PACKAGEDECLARATION:
+                               case JEM_IMPORTDECLARATION:
+                               case JEM_LOCALVARIABLE:
+                                       buffer.append(JEM_ESCAPE);
+                       }
+                       buffer.append(character);
+               }
+       }
+       
        /**
         * @see IJavaElement
         */
@@ -332,6 +360,31 @@ public abstract class JavaElement extends PlatformObject
                return name;
        }
 
+       /*
+        * Creates a Java element handle from the given memento.
+        * The given token is the current delimiter indicating the type of the next token(s).
+        * The given working copy owner is used only for compilation unit handles.
+        */
+       public abstract IJavaElement getHandleFromMemento(String token, MementoTokenizer memento, WorkingCopyOwner owner);
+       /*
+        * Creates a Java element handle from the given memento.
+        * The given working copy owner is used only for compilation unit handles.
+        */
+       public IJavaElement getHandleFromMemento(MementoTokenizer memento, WorkingCopyOwner owner) {
+               if (!memento.hasMoreTokens()) return this;
+               String token = memento.nextToken();
+               return getHandleFromMemento(token, memento, owner);
+       }
+       /*
+        * Update the occurence count of the receiver and creates a Java element handle from the given memento.
+        * The given working copy owner is used only for compilation unit handles.
+        */
+       public IJavaElement getHandleUpdatingCountFromMemento(MementoTokenizer memento, WorkingCopyOwner owner) {
+               this.occurrenceCount = Integer.parseInt(memento.nextToken());
+               if (!memento.hasMoreTokens()) return this;
+               String token = memento.nextToken();
+               return getHandleFromMemento(token, memento, owner);
+       }
        /**
         * @see IJavaElement
         */
@@ -341,17 +394,25 @@ public abstract class JavaElement extends PlatformObject
        /**
         * @see JavaElement#getHandleMemento()
         */
-       public String getHandleMemento() {
-               StringBuffer buff = new StringBuffer(((JavaElement) getParent())
-                               .getHandleMemento());
+       public String getHandleMemento(){
+               StringBuffer buff= new StringBuffer(((JavaElement)getParent()).getHandleMemento());
                buff.append(getHandleMementoDelimiter());
-               buff.append(getElementName());
+               escapeMementoName(buff, getElementName());
+               if (this.occurrenceCount > 1) {
+                       buff.append(JEM_COUNT);
+                       buff.append(this.occurrenceCount);
+               }
                return buff.toString();
        }
        /**
         * Returns the <code>char</code> that marks the start of this handles
         * contribution to a memento.
         */
+       
+       /**
+        * Returns the <code>char</code> that marks the start of this handles
+        * contribution to a memento.
+        */
        protected abstract char getHandleMementoDelimiter();
        /**
         * @see IJavaElement
@@ -399,6 +460,7 @@ public abstract class JavaElement extends PlatformObject
 
                return (IOpenable) parent;
        }
+       
        /**
         * @see IJavaElement
         */
@@ -434,9 +496,13 @@ public abstract class JavaElement extends PlatformObject
                        int i;
                        for (i = 0; i < children.length; i++) {
                                IJavaElement aChild = children[i];
+                               
                                if (aChild instanceof SourceRefElement) {
                                        SourceRefElement child = (SourceRefElement) children[i];
                                        ISourceRange range = child.getSourceRange();
+//                                     if (child.name.equals("stopObject")||range==null || range.getOffset()<=0) {
+//                                       System.out.println(child.name);
+//                                     }
                                        if (position < range.getOffset() + range.getLength()
                                                        && position >= range.getOffset()) {
                                                if (child instanceof IParent) {
@@ -463,7 +529,7 @@ public abstract class JavaElement extends PlatformObject
        /*
         * (non-Javadoc)
         * 
-        * @see org.eclipse.jdt.core.IJavaElement#getSchedulingRule()
+        * @see net.sourceforge.phpdt.core.IJavaElement#getSchedulingRule()
         */
        public ISchedulingRule getSchedulingRule() {
                IResource resource = getResource();
@@ -523,19 +589,18 @@ public abstract class JavaElement extends PlatformObject
                return Util.combineHashCodes(this.name.hashCode(), this.parent
                                .hashCode());
        }
-
        /**
         * Returns true if this element is an ancestor of the given element,
         * otherwise false.
         */
-       protected boolean isAncestorOf(IJavaElement e) {
-               IJavaElement parent = e.getParent();
-               while (parent != null && !parent.equals(this)) {
-                       parent = parent.getParent();
+       public boolean isAncestorOf(IJavaElement e) {
+               IJavaElement parentElement= e.getParent();
+               while (parentElement != null && !parentElement.equals(this)) {
+                       parentElement= parentElement.getParent();
                }
-               return parent != null;
+               return parentElement != null;
        }
-
+       
        /**
         * @see IJavaElement
         */