A massive organize imports and formatting of the sources using default Eclipse code...
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / core / CompilationUnitStructureRequestor.java
index 162e83d..d828458 100644 (file)
@@ -29,570 +29,563 @@ import net.sourceforge.phpdt.internal.core.util.ReferenceInfoAdapter;
 import net.sourceforge.phpdt.internal.corext.Assert;
 
 /**
- * A requestor for the fuzzy parser, used to compute the children of an ICompilationUnit.
+ * A requestor for the fuzzy parser, used to compute the children of an
+ * ICompilationUnit.
  */
-public class CompilationUnitStructureRequestor extends ReferenceInfoAdapter implements ISourceElementRequestor {
-
-  /**
-   * The handle to the compilation unit being parsed
-   */
-  protected ICompilationUnit unit;
-
-  /**
-   * The info object for the compilation unit being parsed
-   */
-  protected CompilationUnitElementInfo unitInfo;
-
-  /**
-   * The import container info - null until created
-   */
-  protected JavaElementInfo importContainerInfo = null;
-
-  /**
-   * Hashtable of children elements of the compilation unit.
-   * Children are added to the table as they are found by
-   * the parser. Keys are handles, values are corresponding
-   * info objects.
-   */
-  protected Map newElements;
-
-  /**
-   * Stack of parent scope info objects. The info on the
-   * top of the stack is the parent of the next element found.
-   * For example, when we locate a method, the parent info object
-   * will be the type the method is contained in.
-   */
-  protected Stack infoStack;
-
-  /**
-   * Stack of parent handles, corresponding to the info stack. We
-   * keep both, since info objects do not have back pointers to
-   * handles.
-   */
-  protected Stack handleStack;
-
-  /**
-   * The name of the source file being parsed.
-   */
-  protected char[] fSourceFileName = null;
-
-  /**
-   * The dot-separated name of the package the compilation unit
-   * is contained in - based on the package statement in the
-   * compilation unit, and initialized by #acceptPackage.
-   * Initialized to <code>null</code> for the default package.
-   */
-  protected char[] fPackageName = null;
-
-  /**
-   * The number of references reported thus far. Used to
-   * expand the arrays of reference kinds and names.
-   */
-  protected int fRefCount = 0;
-
-  /**
-   * The initial size of the reference kind and name
-   * arrays. If the arrays fill, they are doubled in
-   * size
-   */
-  protected static int fgReferenceAllocation = 50;
-
-  /**
-   * Problem requestor which will get notified of discovered problems
-   */
-  protected boolean hasSyntaxErrors = false;
-
-  /*
-   * The parser this requestor is using.
-   */
-  //   protected Parser parser;
-  protected Parser parser;
-
-  /**
-   * Empty collections used for efficient initialization
-   */
-  protected static String[] fgEmptyStringArray = new String[0];
-  protected static byte[] fgEmptyByte = new byte[] {
-  };
-  protected static char[][] fgEmptyCharChar = new char[][] {
-  };
-  protected static char[] fgEmptyChar = new char[] {
-  };
-
-  protected HashtableOfObject fieldRefCache;
-  protected HashtableOfObject messageRefCache;
-  protected HashtableOfObject typeRefCache;
-  protected HashtableOfObject unknownRefCache;
-
-  protected CompilationUnitStructureRequestor(ICompilationUnit unit, CompilationUnitElementInfo unitInfo, Map newElements)
-    throws JavaModelException {
-    this.unit = unit;
-    this.unitInfo = unitInfo;
-    this.newElements = newElements;
-    this.fSourceFileName = unit.getElementName().toCharArray();
-  }
-  /**
-   * @see ISourceElementRequestor
-   */
-  public void acceptImport(int declarationStart, int declarationEnd, char[] name, boolean onDemand)  {
-    //, int modifiers) {
-  
-       JavaElementInfo parentInfo = (JavaElementInfo) this.infoStack.peek();
-       JavaElement parentHandle= (JavaElement) this.handleStack.peek();
-       if (!(parentHandle.getElementType() == IJavaElement.COMPILATION_UNIT)) {
-               Assert.isTrue(false); // Should not happen
-       }
-
-       ICompilationUnit parentCU= (ICompilationUnit)parentHandle;
-       //create the import container and its info
-       ImportContainer importContainer= (ImportContainer)parentCU.getImportContainer();
-       if (this.importContainerInfo == null) {
-               this.importContainerInfo= new JavaElementInfo();
-               this.importContainerInfo.setIsStructureKnown(true);
-               parentInfo.addChild(importContainer);
-               this.newElements.put(importContainer, this.importContainerInfo);
-       }
-       
-       // tack on the '.*' if it is onDemand
-       String importName;
-       if (onDemand) {
-               importName= new String(name) + ".*"; //$NON-NLS-1$
-       } else {
-               importName= new String(name);
-       }
-       
-       ImportDeclaration handle = new ImportDeclaration(importContainer, importName);
-       resolveDuplicates(handle);
-       
-       ImportDeclarationElementInfo info = new ImportDeclarationElementInfo();
-       info.setSourceRangeStart(declarationStart);
-       info.setSourceRangeEnd(declarationEnd);
-//     info.setFlags(modifiers);
-       info.setName(name); // no trailing * if onDemand
-       info.setOnDemand(onDemand);
-
-       this.importContainerInfo.addChild(handle);
-       this.newElements.put(handle, info);
-  }
-  /**
-   * @see ISourceElementRequestor
-   */
-  
-  /*
-   * Table of line separator position. This table is passed once at the end
-   * of the parse action, so as to allow computation of normalized ranges.
-   *
-   * A line separator might corresponds to several characters in the source,
-   * 
-   */
-  public void acceptLineSeparatorPositions(int[] positions) {
-  }
-  /**
-   * @see ISourceElementRequestor
-   */
-  //public void acceptPackage(int declarationStart, int declarationEnd, char[] name) {
-  //
-  //           JavaElementInfo parentInfo = (JavaElementInfo) fInfoStack.peek();
-  //           JavaElement parentHandle= (JavaElement)fHandleStack.peek();
-  //           IPackageDeclaration handle = null;
-  //           fPackageName= name;
-  //           
-  //           if (parentHandle.getElementType() == IJavaElement.COMPILATION_UNIT) {
-  //                   handle = new PackageDeclaration((ICompilationUnit) parentHandle, new String(name));
-  //           }
-  //           else {
-  //                   Assert.isTrue(false); // Should not happen
-  //           }
-  //           resolveDuplicates(handle);
-  //           
-  //           SourceRefElementInfo info = new SourceRefElementInfo();
-  //           info.setSourceRangeStart(declarationStart);
-  //           info.setSourceRangeEnd(declarationEnd);
-  //
-  //           parentInfo.addChild(handle);
-  //           fNewElements.put(handle, info);
-  //
-  //}
-  public void acceptProblem(IProblem problem) {
-    if ((problem.getID() & IProblem.Syntax) != 0) {
-      this.hasSyntaxErrors = true;
-    }
-  }
-  /**
-   * Convert these type names to signatures.
-   * @see Signature.
-   */
-  /* default */
-  static String[] convertTypeNamesToSigs(char[][] typeNames) {
-    if (typeNames == null)
-      return fgEmptyStringArray;
-    int n = typeNames.length;
-    if (n == 0)
-      return fgEmptyStringArray;
-    String[] typeSigs = new String[n];
-    for (int i = 0; i < n; ++i) {
-      typeSigs[i] = Signature.createTypeSignature(typeNames[i], false);
-    }
-    return typeSigs;
-  }
-  /**
-   * @see ISourceElementRequestor
-   */
-  public void enterClass(
-    int declarationStart,
-    int modifiers,
-    char[] name,
-    int nameSourceStart,
-    int nameSourceEnd,
-    char[] superclass,
-    char[][] superinterfaces) {
-
-    enterType(declarationStart, modifiers, name, nameSourceStart, nameSourceEnd, superclass, superinterfaces);
-
-  }
-  /**
-   * @see ISourceElementRequestor
-   */
-  public void enterCompilationUnit() {
-    infoStack = new Stack();
-    handleStack = new Stack();
-    infoStack.push(unitInfo);
-    handleStack.push(unit);
-  }
-  /**
-   * @see ISourceElementRequestor
-   */
-  public void enterConstructor(
-    int declarationStart,
-    int modifiers,
-    char[] name,
-    int nameSourceStart,
-    int nameSourceEnd,
-    char[][] parameterTypes,
-    char[][] parameterNames,
-    char[][] exceptionTypes) {
-
-    enterMethod(
-      declarationStart,
-      modifiers,
-      null,
-      name,
-      nameSourceStart,
-      nameSourceEnd,
-      parameterTypes,
-      parameterNames,
-      exceptionTypes,
-      true);
-  }
-
-  /**
-   * @see ISourceElementRequestor
-   */
-  public void enterField(int declarationStart, int modifiers, char[] type, char[] name, int nameSourceStart, int nameSourceEnd) {
-
-    SourceTypeElementInfo parentInfo = (SourceTypeElementInfo) infoStack.peek();
-    JavaElement parentHandle = (JavaElement) handleStack.peek();
-    IField handle = null;
-
-    if (parentHandle.getElementType() == IJavaElement.TYPE) {
-      handle = new SourceField(parentHandle, new String(name));
-    } else {
-      Assert.isTrue(false); // Should not happen
-    }
-    resolveDuplicates(handle);
-
-    SourceFieldElementInfo info = new SourceFieldElementInfo();
-    info.setName(name);
-    info.setNameSourceStart(nameSourceStart);
-    info.setNameSourceEnd(nameSourceEnd);
-    info.setSourceRangeStart(declarationStart);
-    info.setFlags(modifiers);
-    info.setTypeName(type);
-
-    parentInfo.addChild(handle);
-    newElements.put(handle, info);
-
-    infoStack.push(info);
-    handleStack.push(handle);
-  }
-  /**
-   * @see ISourceElementRequestor
-   */
-  //public void enterInitializer(
-  //   int declarationSourceStart,
-  //   int modifiers) {
-  //           JavaElementInfo parentInfo = (JavaElementInfo) fInfoStack.peek();
-  //           JavaElement parentHandle= (JavaElement)fHandleStack.peek();
-  //           IInitializer handle = null;
-  //           
-  //           if (parentHandle.getElementType() == IJavaElement.TYPE) {
-  //                   handle = ((IType) parentHandle).getInitializer(1);
-  //           }
-  //           else {
-  //                   Assert.isTrue(false); // Should not happen
-  //           }
-  //           resolveDuplicates(handle);
-  //           
-  //           InitializerElementInfo info = new InitializerElementInfo();
-  //           info.setSourceRangeStart(declarationSourceStart);
-  //           info.setFlags(modifiers);
-  //
-  //           parentInfo.addChild(handle);
-  //           fNewElements.put(handle, info);
-  //
-  //           fInfoStack.push(info);
-  //           fHandleStack.push(handle);
-  //}
-  /**
-   * @see ISourceElementRequestor
-   */
-  public void enterInterface(
-    int declarationStart,
-    int modifiers,
-    char[] name,
-    int nameSourceStart,
-    int nameSourceEnd,
-    char[][] superinterfaces) {
-
-    enterType(declarationStart, modifiers, name, nameSourceStart, nameSourceEnd, null, superinterfaces);
-
-  }
-  /**
-   * @see ISourceElementRequestor
-   */
-  public void enterMethod(
-    int declarationStart,
-    int modifiers,
-    char[] returnType,
-    char[] name,
-    int nameSourceStart,
-    int nameSourceEnd,
-    char[][] parameterTypes,
-    char[][] parameterNames,
-    char[][] exceptionTypes) {
-
-    enterMethod(
-      declarationStart,
-      modifiers,
-      returnType,
-      name,
-      nameSourceStart,
-      nameSourceEnd,
-      parameterTypes,
-      parameterNames,
-      exceptionTypes,
-      false);
-  }
-  /**
-   * @see ISourceElementRequestor
-   */
-  protected void enterMethod(
-    int declarationStart,
-    int modifiers,
-    char[] returnType,
-    char[] name,
-    int nameSourceStart,
-    int nameSourceEnd,
-    char[][] parameterTypes,
-    char[][] parameterNames,
-    char[][] exceptionTypes,
-    boolean isConstructor) {
-    SourceTypeElementInfo parentInfo = null;
-    try {
-      parentInfo = (SourceTypeElementInfo) infoStack.peek();
-    } catch (ClassCastException e) {
-      //                       parentInfo = null;
-    }
-    JavaElement parentHandle = (JavaElement) handleStack.peek();
-    IMethod handle = null;
-
-    // translate nulls to empty arrays
-    if (parameterTypes == null) {
-      parameterTypes = fgEmptyCharChar;
-    }
-    if (parameterNames == null) {
-      parameterNames = fgEmptyCharChar;
-    }
-    if (exceptionTypes == null) {
-      exceptionTypes = fgEmptyCharChar;
-    }
-
-    String[] parameterTypeSigs = convertTypeNamesToSigs(parameterTypes);
-    // TODO : jsurfer changed
-//     if (parentHandle.getElementType() == IJavaElement.TYPE) {
-               handle = new SourceMethod(parentHandle, new String(name), parameterTypeSigs);
-//     }
-//     else {
-//             Assert.isTrue(false); // Should not happen
-//     }
-       resolveDuplicates(handle);
-       
-    SourceMethodElementInfo info = new SourceMethodElementInfo();
-    info.setSourceRangeStart(declarationStart);
-    int flags = modifiers;
-    info.setName(name);
-    info.setNameSourceStart(nameSourceStart);
-    info.setNameSourceEnd(nameSourceEnd);
-    info.setConstructor(isConstructor);
-    info.setFlags(flags);
-    info.setArgumentNames(parameterNames);
-    info.setArgumentTypeNames(parameterTypes);
-    info.setReturnType(returnType == null ? new char[] { 'v', 'o', 'i', 'd' }
-    : returnType);
-    info.setExceptionTypeNames(exceptionTypes);
-
-    if (parentInfo == null) {
-      unitInfo.addChild(handle);
-    } else {
-      parentInfo.addChild(handle);
-    }
-    newElements.put(handle, info);
-    infoStack.push(info);
-    handleStack.push(handle);
-  }
-  /**
-   * Common processing for classes and interfaces.
-   */
-  protected void enterType(
-    int declarationStart,
-    int modifiers,
-    char[] name,
-    int nameSourceStart,
-    int nameSourceEnd,
-    char[] superclass,
-    char[][] superinterfaces) {
-
-    char[] enclosingTypeName = null;
-    char[] qualifiedName = null;
-
-    JavaElementInfo parentInfo = (JavaElementInfo) infoStack.peek();
-    JavaElement parentHandle = (JavaElement) handleStack.peek();
-    IType handle = null;
-    String nameString = new String(name);
-
-    if (parentHandle.getElementType() == IJavaElement.COMPILATION_UNIT) {
-      handle = ((ICompilationUnit) parentHandle).getType(nameString);
-      if (fPackageName == null) {
-        qualifiedName = nameString.toCharArray();
-      } else {
-        qualifiedName = (new String(fPackageName) + "." + nameString).toCharArray(); //$NON-NLS-1$
-      }
-    } else if (parentHandle.getElementType() == IJavaElement.TYPE) {
-      handle = ((IType) parentHandle).getType(nameString);
-      enclosingTypeName = ((SourceTypeElementInfo) parentInfo).getName();
-      qualifiedName = (new String(((SourceTypeElementInfo) parentInfo).getQualifiedName()) + "." + nameString).toCharArray(); //$NON-NLS-1$
-    } else {
-      Assert.isTrue(false); // Should not happen
-    }
-    resolveDuplicates(handle);
-
-    SourceTypeElementInfo info = new SourceTypeElementInfo();
-    info.setHandle(handle);
-    info.setSourceRangeStart(declarationStart);
-    info.setFlags(modifiers);
-    info.setName(name);
-    info.setNameSourceStart(nameSourceStart);
-    info.setNameSourceEnd(nameSourceEnd);
-    info.setSuperclassName(superclass);
-    info.setSuperInterfaceNames(superinterfaces);
-    info.setEnclosingTypeName(enclosingTypeName);
-    info.setSourceFileName(fSourceFileName);
-    info.setPackageName(fPackageName);
-    info.setQualifiedName(qualifiedName);
-    // for (Iterator iter = fNewElements.keySet().iterator(); iter.hasNext();){
-    //         Object object = iter.next();
-    //         if (object instanceof IImportDeclaration)
-    //                 info.addImport(((IImportDeclaration)object).getElementName().toCharArray());
-    // }
-
-    parentInfo.addChild(handle);
-    newElements.put(handle, info);
-
-    infoStack.push(info);
-    handleStack.push(handle);
-
-  }
-  /**
-   * @see ISourceElementRequestor
-   */
-  public void exitClass(int declarationEnd) {
-
-    exitMember(declarationEnd);
-  }
-  /**
-   * @see ISourceElementRequestor
-   */
-  public void exitCompilationUnit(int declarationEnd) {
-    unitInfo.setSourceLength(declarationEnd + 1);
-
-    // determine if there were any parsing errors
-    unitInfo.setIsStructureKnown(!this.hasSyntaxErrors);
-  }
-  /**
-   * @see ISourceElementRequestor
-   */
-  public void exitConstructor(int declarationEnd) {
-    exitMember(declarationEnd);
-  }
-  /**
-   * @see ISourceElementRequestor
-   */
-  public void exitField(int initializationStart, int declarationEnd, int declarationSourceEnd) {
-       SourceFieldElementInfo info = (SourceFieldElementInfo) infoStack.pop();
-       info.setSourceRangeEnd(declarationSourceEnd);
-       
-       // remember initializer source if field is a constant
-       if (initializationStart != -1) {
-               int flags = info.flags;
-               Object typeInfo;
-               if (Flags.isStatic(flags) && Flags.isFinal(flags)
-                               || ((typeInfo = infoStack.peek()) instanceof SourceTypeElementInfo
-                                        && (Flags.isInterface(((SourceTypeElementInfo)typeInfo).flags)))) {
-                       int length = declarationEnd - initializationStart;
-                       if (length > 0) {
-                               char[] initializer = new char[length];
-                               System.arraycopy(this.parser.scanner.source, initializationStart, initializer, 0, length);
-                               info.initializationSource = initializer;
-                       }
-               }
-       }
-       handleStack.pop();
-  }
-  /**
-   * @see ISourceElementRequestor
-   */
-  public void exitInitializer(int declarationEnd) {
-    exitMember(declarationEnd);
-  }
-  /**
-   * @see ISourceElementRequestor
-   */
-  public void exitInterface(int declarationEnd) {
-    exitMember(declarationEnd);
-  }
-  /**
-   * common processing for classes and interfaces
-   */
-  protected void exitMember(int declarationEnd) {
-    SourceRefElementInfo info = (SourceRefElementInfo) infoStack.pop();
-    info.setSourceRangeEnd(declarationEnd);
-    handleStack.pop();
-  }
-  /**
-   * @see ISourceElementRequestor
-   */
-  public void exitMethod(int declarationEnd) {
-    exitMember(declarationEnd);
-  }
-
-  /**
-   * Resolves duplicate handles by incrementing the occurrence count
-   * of the handle being created until there is no conflict.
-   */
-  protected void resolveDuplicates(IJavaElement handle) {
-    while (newElements.containsKey(handle)) {
-      JavaElement h = (JavaElement) handle;
-      h.setOccurrenceCount(h.getOccurrenceCount() + 1);
-    }
-  }
+public class CompilationUnitStructureRequestor extends ReferenceInfoAdapter
+               implements ISourceElementRequestor {
+
+       /**
+        * The handle to the compilation unit being parsed
+        */
+       protected ICompilationUnit unit;
+
+       /**
+        * The info object for the compilation unit being parsed
+        */
+       protected CompilationUnitElementInfo unitInfo;
+
+       /**
+        * The import container info - null until created
+        */
+       protected JavaElementInfo importContainerInfo = null;
+
+       /**
+        * Hashtable of children elements of the compilation unit. Children are
+        * added to the table as they are found by the parser. Keys are handles,
+        * values are corresponding info objects.
+        */
+       protected Map newElements;
+
+       /**
+        * Stack of parent scope info objects. The info on the top of the stack is
+        * the parent of the next element found. For example, when we locate a
+        * method, the parent info object will be the type the method is contained
+        * in.
+        */
+       protected Stack infoStack;
+
+       /**
+        * Stack of parent handles, corresponding to the info stack. We keep both,
+        * since info objects do not have back pointers to handles.
+        */
+       protected Stack handleStack;
+
+       /**
+        * The name of the source file being parsed.
+        */
+       protected char[] fSourceFileName = null;
+
+       /**
+        * The dot-separated name of the package the compilation unit is contained
+        * in - based on the package statement in the compilation unit, and
+        * initialized by #acceptPackage. Initialized to <code>null</code> for the
+        * default package.
+        */
+       protected char[] fPackageName = null;
+
+       /**
+        * The number of references reported thus far. Used to expand the arrays of
+        * reference kinds and names.
+        */
+       protected int fRefCount = 0;
+
+       /**
+        * The initial size of the reference kind and name arrays. If the arrays
+        * fill, they are doubled in size
+        */
+       protected static int fgReferenceAllocation = 50;
+
+       /**
+        * Problem requestor which will get notified of discovered problems
+        */
+       protected boolean hasSyntaxErrors = false;
+
+       /*
+        * The parser this requestor is using.
+        */
+       // protected Parser parser;
+       protected Parser parser;
+
+       /**
+        * Empty collections used for efficient initialization
+        */
+       protected static String[] fgEmptyStringArray = new String[0];
+
+       protected static byte[] fgEmptyByte = new byte[] {};
+
+       protected static char[][] fgEmptyCharChar = new char[][] {};
+
+       protected static char[] fgEmptyChar = new char[] {};
+
+       protected HashtableOfObject fieldRefCache;
+
+       protected HashtableOfObject messageRefCache;
+
+       protected HashtableOfObject typeRefCache;
+
+       protected HashtableOfObject unknownRefCache;
+
+       protected CompilationUnitStructureRequestor(ICompilationUnit unit,
+                       CompilationUnitElementInfo unitInfo, Map newElements)
+                       throws JavaModelException {
+               this.unit = unit;
+               this.unitInfo = unitInfo;
+               this.newElements = newElements;
+               this.fSourceFileName = unit.getElementName().toCharArray();
+       }
+
+       /**
+        * @see ISourceElementRequestor
+        */
+       public void acceptImport(int declarationStart, int declarationEnd,
+                       char[] name, boolean onDemand) {
+               // , int modifiers) {
+
+               JavaElementInfo parentInfo = (JavaElementInfo) this.infoStack.peek();
+               JavaElement parentHandle = (JavaElement) this.handleStack.peek();
+               if (!(parentHandle.getElementType() == IJavaElement.COMPILATION_UNIT)) {
+                       Assert.isTrue(false); // Should not happen
+               }
+
+               ICompilationUnit parentCU = (ICompilationUnit) parentHandle;
+               // create the import container and its info
+               ImportContainer importContainer = (ImportContainer) parentCU
+                               .getImportContainer();
+               if (this.importContainerInfo == null) {
+                       this.importContainerInfo = new JavaElementInfo();
+                       this.importContainerInfo.setIsStructureKnown(true);
+                       parentInfo.addChild(importContainer);
+                       this.newElements.put(importContainer, this.importContainerInfo);
+               }
+
+               // tack on the '.*' if it is onDemand
+               String importName;
+               if (onDemand) {
+                       importName = new String(name) + ".*"; //$NON-NLS-1$
+               } else {
+                       importName = new String(name);
+               }
+
+               ImportDeclaration handle = new ImportDeclaration(importContainer,
+                               importName);
+               resolveDuplicates(handle);
+
+               ImportDeclarationElementInfo info = new ImportDeclarationElementInfo();
+               info.setSourceRangeStart(declarationStart);
+               info.setSourceRangeEnd(declarationEnd);
+               // info.setFlags(modifiers);
+               info.setName(name); // no trailing * if onDemand
+               info.setOnDemand(onDemand);
+
+               this.importContainerInfo.addChild(handle);
+               this.newElements.put(handle, info);
+       }
+
+       /**
+        * @see ISourceElementRequestor
+        */
+
+       /*
+        * Table of line separator position. This table is passed once at the end of
+        * the parse action, so as to allow computation of normalized ranges.
+        * 
+        * A line separator might corresponds to several characters in the source,
+        * 
+        */
+       public void acceptLineSeparatorPositions(int[] positions) {
+       }
+
+       /**
+        * @see ISourceElementRequestor
+        */
+       // public void acceptPackage(int declarationStart, int declarationEnd,
+       // char[] name) {
+       //
+       // JavaElementInfo parentInfo = (JavaElementInfo) fInfoStack.peek();
+       // JavaElement parentHandle= (JavaElement)fHandleStack.peek();
+       // IPackageDeclaration handle = null;
+       // fPackageName= name;
+       //              
+       // if (parentHandle.getElementType() == IJavaElement.COMPILATION_UNIT) {
+       // handle = new PackageDeclaration((ICompilationUnit) parentHandle, new
+       // String(name));
+       // }
+       // else {
+       // Assert.isTrue(false); // Should not happen
+       // }
+       // resolveDuplicates(handle);
+       //              
+       // SourceRefElementInfo info = new SourceRefElementInfo();
+       // info.setSourceRangeStart(declarationStart);
+       // info.setSourceRangeEnd(declarationEnd);
+       //
+       // parentInfo.addChild(handle);
+       // fNewElements.put(handle, info);
+       //
+       // }
+       public void acceptProblem(IProblem problem) {
+               if ((problem.getID() & IProblem.Syntax) != 0) {
+                       this.hasSyntaxErrors = true;
+               }
+       }
+
+       /**
+        * Convert these type names to signatures.
+        * 
+        * @see Signature.
+        */
+       /* default */
+       static String[] convertTypeNamesToSigs(char[][] typeNames) {
+               if (typeNames == null)
+                       return fgEmptyStringArray;
+               int n = typeNames.length;
+               if (n == 0)
+                       return fgEmptyStringArray;
+               String[] typeSigs = new String[n];
+               for (int i = 0; i < n; ++i) {
+                       typeSigs[i] = Signature.createTypeSignature(typeNames[i], false);
+               }
+               return typeSigs;
+       }
+
+       /**
+        * @see ISourceElementRequestor
+        */
+       public void enterClass(int declarationStart, int modifiers, char[] name,
+                       int nameSourceStart, int nameSourceEnd, char[] superclass,
+                       char[][] superinterfaces) {
+
+               enterType(declarationStart, modifiers, name, nameSourceStart,
+                               nameSourceEnd, superclass, superinterfaces);
+
+       }
+
+       /**
+        * @see ISourceElementRequestor
+        */
+       public void enterCompilationUnit() {
+               infoStack = new Stack();
+               handleStack = new Stack();
+               infoStack.push(unitInfo);
+               handleStack.push(unit);
+       }
+
+       /**
+        * @see ISourceElementRequestor
+        */
+       public void enterConstructor(int declarationStart, int modifiers,
+                       char[] name, int nameSourceStart, int nameSourceEnd,
+                       char[][] parameterTypes, char[][] parameterNames,
+                       char[][] exceptionTypes) {
+
+               enterMethod(declarationStart, modifiers, null, name, nameSourceStart,
+                               nameSourceEnd, parameterTypes, parameterNames, exceptionTypes,
+                               true);
+       }
+
+       /**
+        * @see ISourceElementRequestor
+        */
+       public void enterField(int declarationStart, int modifiers, char[] type,
+                       char[] name, int nameSourceStart, int nameSourceEnd) {
+
+               SourceTypeElementInfo parentInfo = (SourceTypeElementInfo) infoStack
+                               .peek();
+               JavaElement parentHandle = (JavaElement) handleStack.peek();
+               IField handle = null;
+
+               if (parentHandle.getElementType() == IJavaElement.TYPE) {
+                       handle = new SourceField(parentHandle, new String(name));
+               } else {
+                       Assert.isTrue(false); // Should not happen
+               }
+               resolveDuplicates(handle);
+
+               SourceFieldElementInfo info = new SourceFieldElementInfo();
+               info.setName(name);
+               info.setNameSourceStart(nameSourceStart);
+               info.setNameSourceEnd(nameSourceEnd);
+               info.setSourceRangeStart(declarationStart);
+               info.setFlags(modifiers);
+               info.setTypeName(type);
+
+               parentInfo.addChild(handle);
+               newElements.put(handle, info);
+
+               infoStack.push(info);
+               handleStack.push(handle);
+       }
+
+       /**
+        * @see ISourceElementRequestor
+        */
+       // public void enterInitializer(
+       // int declarationSourceStart,
+       // int modifiers) {
+       // JavaElementInfo parentInfo = (JavaElementInfo) fInfoStack.peek();
+       // JavaElement parentHandle= (JavaElement)fHandleStack.peek();
+       // IInitializer handle = null;
+       //              
+       // if (parentHandle.getElementType() == IJavaElement.TYPE) {
+       // handle = ((IType) parentHandle).getInitializer(1);
+       // }
+       // else {
+       // Assert.isTrue(false); // Should not happen
+       // }
+       // resolveDuplicates(handle);
+       //              
+       // InitializerElementInfo info = new InitializerElementInfo();
+       // info.setSourceRangeStart(declarationSourceStart);
+       // info.setFlags(modifiers);
+       //
+       // parentInfo.addChild(handle);
+       // fNewElements.put(handle, info);
+       //
+       // fInfoStack.push(info);
+       // fHandleStack.push(handle);
+       // }
+       /**
+        * @see ISourceElementRequestor
+        */
+       public void enterInterface(int declarationStart, int modifiers,
+                       char[] name, int nameSourceStart, int nameSourceEnd,
+                       char[][] superinterfaces) {
+
+               enterType(declarationStart, modifiers, name, nameSourceStart,
+                               nameSourceEnd, null, superinterfaces);
+
+       }
+
+       /**
+        * @see ISourceElementRequestor
+        */
+       public void enterMethod(int declarationStart, int modifiers,
+                       char[] returnType, char[] name, int nameSourceStart,
+                       int nameSourceEnd, char[][] parameterTypes,
+                       char[][] parameterNames, char[][] exceptionTypes) {
+
+               enterMethod(declarationStart, modifiers, returnType, name,
+                               nameSourceStart, nameSourceEnd, parameterTypes, parameterNames,
+                               exceptionTypes, false);
+       }
+
+       /**
+        * @see ISourceElementRequestor
+        */
+       protected void enterMethod(int declarationStart, int modifiers,
+                       char[] returnType, char[] name, int nameSourceStart,
+                       int nameSourceEnd, char[][] parameterTypes,
+                       char[][] parameterNames, char[][] exceptionTypes,
+                       boolean isConstructor) {
+               SourceTypeElementInfo parentInfo = null;
+               try {
+                       parentInfo = (SourceTypeElementInfo) infoStack.peek();
+               } catch (ClassCastException e) {
+                       // parentInfo = null;
+               }
+               JavaElement parentHandle = (JavaElement) handleStack.peek();
+               IMethod handle = null;
+
+               // translate nulls to empty arrays
+               if (parameterTypes == null) {
+                       parameterTypes = fgEmptyCharChar;
+               }
+               if (parameterNames == null) {
+                       parameterNames = fgEmptyCharChar;
+               }
+               if (exceptionTypes == null) {
+                       exceptionTypes = fgEmptyCharChar;
+               }
+
+               String[] parameterTypeSigs = convertTypeNamesToSigs(parameterTypes);
+               // TODO : jsurfer changed
+               // if (parentHandle.getElementType() == IJavaElement.TYPE) {
+               handle = new SourceMethod(parentHandle, new String(name),
+                               parameterTypeSigs);
+               // }
+               // else {
+               // Assert.isTrue(false); // Should not happen
+               // }
+               resolveDuplicates(handle);
+
+               SourceMethodElementInfo info = new SourceMethodElementInfo();
+               info.setSourceRangeStart(declarationStart);
+               int flags = modifiers;
+               info.setName(name);
+               info.setNameSourceStart(nameSourceStart);
+               info.setNameSourceEnd(nameSourceEnd);
+               info.setConstructor(isConstructor);
+               info.setFlags(flags);
+               info.setArgumentNames(parameterNames);
+               info.setArgumentTypeNames(parameterTypes);
+               info
+                               .setReturnType(returnType == null ? new char[] { 'v', 'o', 'i',
+                                               'd' } : returnType);
+               info.setExceptionTypeNames(exceptionTypes);
+
+               if (parentInfo == null) {
+                       unitInfo.addChild(handle);
+               } else {
+                       parentInfo.addChild(handle);
+               }
+               newElements.put(handle, info);
+               infoStack.push(info);
+               handleStack.push(handle);
+       }
+
+       /**
+        * Common processing for classes and interfaces.
+        */
+       protected void enterType(int declarationStart, int modifiers, char[] name,
+                       int nameSourceStart, int nameSourceEnd, char[] superclass,
+                       char[][] superinterfaces) {
+
+               char[] enclosingTypeName = null;
+               char[] qualifiedName = null;
+
+               JavaElementInfo parentInfo = (JavaElementInfo) infoStack.peek();
+               JavaElement parentHandle = (JavaElement) handleStack.peek();
+               IType handle = null;
+               String nameString = new String(name);
+
+               if (parentHandle.getElementType() == IJavaElement.COMPILATION_UNIT) {
+                       handle = ((ICompilationUnit) parentHandle).getType(nameString);
+                       if (fPackageName == null) {
+                               qualifiedName = nameString.toCharArray();
+                       } else {
+                               qualifiedName = (new String(fPackageName) + "." + nameString).toCharArray(); //$NON-NLS-1$
+                       }
+               } else if (parentHandle.getElementType() == IJavaElement.TYPE) {
+                       handle = ((IType) parentHandle).getType(nameString);
+                       enclosingTypeName = ((SourceTypeElementInfo) parentInfo).getName();
+                       qualifiedName = (new String(((SourceTypeElementInfo) parentInfo)
+                                       .getQualifiedName())
+                                       + "." + nameString).toCharArray(); //$NON-NLS-1$
+               } else {
+                       Assert.isTrue(false); // Should not happen
+               }
+               resolveDuplicates(handle);
+
+               SourceTypeElementInfo info = new SourceTypeElementInfo();
+               info.setHandle(handle);
+               info.setSourceRangeStart(declarationStart);
+               info.setFlags(modifiers);
+               info.setName(name);
+               info.setNameSourceStart(nameSourceStart);
+               info.setNameSourceEnd(nameSourceEnd);
+               info.setSuperclassName(superclass);
+               info.setSuperInterfaceNames(superinterfaces);
+               info.setEnclosingTypeName(enclosingTypeName);
+               info.setSourceFileName(fSourceFileName);
+               info.setPackageName(fPackageName);
+               info.setQualifiedName(qualifiedName);
+               // for (Iterator iter = fNewElements.keySet().iterator();
+               // iter.hasNext();){
+               // Object object = iter.next();
+               // if (object instanceof IImportDeclaration)
+               // info.addImport(((IImportDeclaration)object).getElementName().toCharArray());
+               // }
+
+               parentInfo.addChild(handle);
+               newElements.put(handle, info);
+
+               infoStack.push(info);
+               handleStack.push(handle);
+
+       }
+
+       /**
+        * @see ISourceElementRequestor
+        */
+       public void exitClass(int declarationEnd) {
+
+               exitMember(declarationEnd);
+       }
+
+       /**
+        * @see ISourceElementRequestor
+        */
+       public void exitCompilationUnit(int declarationEnd) {
+               unitInfo.setSourceLength(declarationEnd + 1);
+
+               // determine if there were any parsing errors
+               unitInfo.setIsStructureKnown(!this.hasSyntaxErrors);
+       }
+
+       /**
+        * @see ISourceElementRequestor
+        */
+       public void exitConstructor(int declarationEnd) {
+               exitMember(declarationEnd);
+       }
+
+       /**
+        * @see ISourceElementRequestor
+        */
+       public void exitField(int initializationStart, int declarationEnd,
+                       int declarationSourceEnd) {
+               SourceFieldElementInfo info = (SourceFieldElementInfo) infoStack.pop();
+               info.setSourceRangeEnd(declarationSourceEnd);
+
+               // remember initializer source if field is a constant
+               if (initializationStart != -1) {
+                       int flags = info.flags;
+                       Object typeInfo;
+                       if (Flags.isStatic(flags)
+                                       && Flags.isFinal(flags)
+                                       || ((typeInfo = infoStack.peek()) instanceof SourceTypeElementInfo && (Flags
+                                                       .isInterface(((SourceTypeElementInfo) typeInfo).flags)))) {
+                               int length = declarationEnd - initializationStart;
+                               if (length > 0) {
+                                       char[] initializer = new char[length];
+                                       System.arraycopy(this.parser.scanner.source,
+                                                       initializationStart, initializer, 0, length);
+                                       info.initializationSource = initializer;
+                               }
+                       }
+               }
+               handleStack.pop();
+       }
+
+       /**
+        * @see ISourceElementRequestor
+        */
+       public void exitInitializer(int declarationEnd) {
+               exitMember(declarationEnd);
+       }
+
+       /**
+        * @see ISourceElementRequestor
+        */
+       public void exitInterface(int declarationEnd) {
+               exitMember(declarationEnd);
+       }
+
+       /**
+        * common processing for classes and interfaces
+        */
+       protected void exitMember(int declarationEnd) {
+               SourceRefElementInfo info = (SourceRefElementInfo) infoStack.pop();
+               info.setSourceRangeEnd(declarationEnd);
+               handleStack.pop();
+       }
+
+       /**
+        * @see ISourceElementRequestor
+        */
+       public void exitMethod(int declarationEnd) {
+               exitMember(declarationEnd);
+       }
+
+       /**
+        * Resolves duplicate handles by incrementing the occurrence count of the
+        * handle being created until there is no conflict.
+        */
+       protected void resolveDuplicates(IJavaElement handle) {
+               while (newElements.containsKey(handle)) {
+                       JavaElement h = (JavaElement) handle;
+                       h.setOccurrenceCount(h.getOccurrenceCount() + 1);
+               }
+       }
 }