Buggy code:
public class SourceType extends NamedMember implements IType { protected SourceType ( JavaElement parent , String name ) { } protected void closing ( Object info ) throws JavaModelException { } public void codeComplete ( char [ ] snippet , int insertion , int position , char [ ] [ ] localVariableTypeNames , char [ ] [ ] localVariableNames , int [ ] localVariableModifiers , boolean isStatic , ICompletionRequestor requestor ) throws JavaModelException { } public void codeComplete ( char [ ] snippet , int insertion , int position , char [ ] [ ] localVariableTypeNames , char [ ] [ ] localVariableNames , int [ ] localVariableModifiers , boolean isStatic , ICompletionRequestor requestor , WorkingCopyOwner owner ) throws JavaModelException { } public IField createField ( String contents , IJavaElement sibling , boolean force , IProgressMonitor monitor ) throws JavaModelException { } public IInitializer createInitializer ( String contents , IJavaElement sibling , IProgressMonitor monitor ) throws JavaModelException { } public IMethod createMethod ( String contents , IJavaElement sibling , boolean force , IProgressMonitor monitor ) throws JavaModelException { } public IType createType ( String contents , IJavaElement sibling , boolean force , IProgressMonitor monitor ) throws JavaModelException { } public boolean equals ( Object o ) { } protected boolean equalsDOMNode ( IDOMNode node ) { } public IMethod [ ] findMethods ( IMethod method ) { } public IType getDeclaringType ( ) { } public int getElementType ( ) { } public IField getField ( String fieldName ) { } public IField [ ] getFields ( ) throws JavaModelException { } public String getFullyQualifiedName ( ) { } public String getFullyQualifiedName ( char enclosingTypeSeparator ) { } public IJavaElement getHandleFromMemento ( String token , MementoTokenizer memento , WorkingCopyOwner workingCopyOwner ) { switch ( token . charAt ( 0 ) ) { case JavaElement . JEM_COUNT : return getHandleUpdatingCountFromMemento ( memento , workingCopyOwner ) ; case JavaElement . JEM_FIELD : String fieldName = memento . nextToken ( ) ; JavaElement field = ( ( JavaElement ) ( getField ( fieldName ) ) ) ; return field . getHandleFromMemento ( memento , workingCopyOwner ) ; case JavaElement . JEM_INITIALIZER : String count = memento . nextToken ( ) ; JavaElement initializer = ( ( JavaElement ) ( getInitializer ( Integer . parseInt ( count ) ) ) ) ; return initializer . getHandleFromMemento ( memento , workingCopyOwner ) ; case JavaElement . JEM_METHOD : String selector = memento . nextToken ( ) ; ArrayList params = new ArrayList ( ) ; nextParam : while ( memento . hasMoreTokens ( ) ) { token = memento . nextToken ( ) ; switch ( token . charAt ( 0 ) ) { case JavaElement . JEM_TYPE : case JavaElement . JEM_TYPE_PARAMETER : break nextParam ; case JavaElement . JEM_METHOD : String param = memento . nextToken ( ) ; StringBuffer buffer = new StringBuffer ( ) ; <START_BUG> while ( ( Signature . C_ARRAY ) == ( param . charAt ( 0 ) ) ) { <END_BUG> buffer . append ( Signature . C_ARRAY ) ; param = memento . nextToken ( ) ; } params . add ( ( ( buffer . toString ( ) ) + param ) ) ; break ; default : break nextParam ; } } String [ ] parameters = new String [ params . size ( ) ] ; params . toArray ( parameters ) ; JavaElement method = ( ( JavaElement ) ( getMethod ( selector , parameters ) ) ) ; if ( token != null ) { switch ( token . charAt ( 0 ) ) { case JavaElement . JEM_TYPE : case JavaElement . JEM_TYPE_PARAMETER : case JavaElement . JEM_LOCALVARIABLE : return method . getHandleFromMemento ( token , memento , workingCopyOwner ) ; default : return method ; } } else { return method ; } case JavaElement . JEM_TYPE : String typeName ; if ( memento . hasMoreTokens ( ) ) { typeName = memento . nextToken ( ) ; char firstChar = typeName . charAt ( 0 ) ; if ( ( ( ( ( firstChar == ( JavaElement . JEM_FIELD ) ) || ( firstChar == ( JavaElement . JEM_INITIALIZER ) ) ) || ( firstChar == ( JavaElement . JEM_METHOD ) ) ) || ( firstChar == ( JavaElement . JEM_TYPE ) ) ) || ( firstChar == ( JavaElement . JEM_COUNT ) ) ) { token = typeName ; typeName = "" ; } else { token = null ; } } else { typeName = "" ; token = null ; } JavaElement type = ( ( JavaElement ) ( getType ( typeName ) ) ) ; if ( token == null ) { return type . getHandleFromMemento ( memento , workingCopyOwner ) ; } else { return type . getHandleFromMemento ( token , memento , workingCopyOwner ) ; } case JavaElement . JEM_TYPE_PARAMETER : String typeParameterName = memento . nextToken ( ) ; JavaElement typeParameter = new TypeParameter ( this , typeParameterName ) ; return typeParameter . getHandleFromMemento ( memento , workingCopyOwner ) ; } return null ; } public IInitializer getInitializer ( int count ) { } public IInitializer [ ] getInitializers ( ) throws JavaModelException { } public IMethod getMethod ( String selector , String [ ] parameterTypeSignatures ) { } public IMethod [ ] getMethods ( ) throws JavaModelException { } public IPackageFragment getPackageFragment ( ) { } public IJavaElement getPrimaryElement ( boolean checkOwner ) { } public String getSuperclassName ( ) throws JavaModelException { } public String getSuperclassTypeSignature ( ) throws JavaModelException { } public String [ ] getSuperInterfaceNames ( ) throws JavaModelException { } public String [ ] getSuperInterfaceTypeSignatures ( ) throws JavaModelException { } public ITypeParameter [ ] getTypeParameters ( ) throws JavaModelException { } public String [ ] getTypeParameterSignatures ( ) throws JavaModelException { } public IType getType ( String typeName ) { } public ITypeParameter getTypeParameter ( String typeParameterName ) { }

Fix:
while ( ( ( param . length ( ) ) == 1 ) && ( ( Signature . C_ARRAY ) == ( param . charAt ( 0 ) ) ) ) {