improved PHP parser
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / core / Member.java
index eb6d570..63576cf 100644 (file)
@@ -12,6 +12,8 @@ package net.sourceforge.phpdt.internal.core;
 
 import java.util.ArrayList;
 
+import net.sourceforge.phpdt.internal.core.SourceType;
+
 import net.sourceforge.phpdt.core.Flags;
 import net.sourceforge.phpdt.core.IJavaElement;
 import net.sourceforge.phpdt.core.IMember;
@@ -27,7 +29,7 @@ import net.sourceforge.phpdt.core.jdom.IDOMNode;
  * @see IMember
  */
 
-/* package */ abstract class Member extends SourceRefElement implements IMember {
+public abstract class Member extends SourceRefElement implements IMember {
        protected Member(JavaElement parent, String name) {
                super(parent, name);
        }
@@ -154,6 +156,33 @@ public int getFlags() throws JavaModelException {
 protected char getHandleMementoDelimiter() {
        return JavaElement.JEM_TYPE;
 }
+/*
+ * Returns the outermost context defining a local element. Per construction, it can only be a
+ * method/field/initializarer member; thus, returns null if this member is already a top-level type or member type.
+ * e.g for X.java/X/Y/foo()/Z/bar()/T, it will return X.java/X/Y/foo()
+ */
+public Member getOuterMostLocalContext() {
+       IJavaElement current = this;
+       Member lastLocalContext = null;
+       parentLoop: while (true) {
+               switch (current.getElementType()) {
+                       case CLASS_FILE:
+                       case COMPILATION_UNIT:
+                               break parentLoop; // done recursing
+                       case TYPE:
+                               // cannot be a local context
+                               break;
+                       case INITIALIZER:
+                       case FIELD:
+                       case METHOD:
+                                // these elements can define local members
+                               lastLocalContext = (Member) current;
+                               break;
+               }               
+               current = current.getParent();
+       } 
+       return lastLocalContext;
+}
 /**
  * @see IMember
  */
@@ -164,6 +193,18 @@ public ISourceRange getNameRange() throws JavaModelException {
 /**
  * @see IMember
  */
+public IType getType(String typeName, int count) {
+       if (isBinary()) {
+               throw new IllegalArgumentException("Not a source member " + toStringWithAncestors()); //$NON-NLS-1$
+       } else {
+               SourceType type = new SourceType(this, typeName);
+               type.occurrenceCount = count;
+               return type;
+       }
+}
+/**
+ * @see IMember
+ */
 public boolean isBinary() {
        return false;
 }