improved PHP parser
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / core / Member.java
index 1d53b70..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;
@@ -22,17 +24,15 @@ import net.sourceforge.phpdt.core.JavaModelException;
 import net.sourceforge.phpdt.core.Signature;
 import net.sourceforge.phpdt.core.jdom.IDOMNode;
 
-import com.sun.corba.se.internal.core.Constant;
-
 
 /**
  * @see IMember
  */
 
-/* package */ abstract class Member extends SourceRefElement implements IMember {
-protected Member(int type, IJavaElement parent, String name) {
-       super(type, parent, name);
-}
+public abstract class Member extends SourceRefElement implements IMember {
+       protected Member(JavaElement parent, String name) {
+               super(parent, name);
+       }
 protected boolean areSimilarMethods(
        String name1, String[] params1, 
        String name2, String[] params2,
@@ -137,9 +137,9 @@ protected IMethod[] findMethods(IMethod method, IMethod[] methods) {
  * @see IMember
  */
 public IType getDeclaringType() {
-       JavaElement parent = (JavaElement)getParent();
-       if (parent.fLEType == TYPE) {
-               return (IType) parent;
+       JavaElement parentElement = (JavaElement)getParent();
+       if (parentElement.getElementType() == TYPE) {
+               return (IType) parentElement;
        }
        return null;
 }
@@ -156,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
  */
@@ -166,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;
 }