Buggy code:
public FieldBinding [ ] availableFields ( ) { } public MethodBinding [ ] availableMethods ( ) { } void cachePartsFrom ( IBinaryType binaryType , boolean needFieldsAndMethods ) { } private void createFields ( IBinaryField [ ] iFields , long sourceLevel , char [ ] [ ] [ ] missingTypeNames ) { } private MethodBinding createMethod ( IBinaryMethod method , long sourceLevel , char [ ] [ ] [ ] missingTypeNames ) { int methodModifiers = ( method . getModifiers ( ) ) | ( ExtraCompilerModifiers . AccUnresolved ) ; if ( sourceLevel < ( ClassFileConstants . JDK1_5 ) ) methodModifiers &= ~ ( ClassFileConstants . AccVarargs ) ; ReferenceBinding [ ] exceptions = Binding . NO_EXCEPTIONS ; TypeBinding [ ] parameters = Binding . NO_PARAMETERS ; TypeVariableBinding [ ] typeVars = Binding . NO_TYPE_VARIABLES ; AnnotationBinding [ ] [ ] paramAnnotations = null ; TypeBinding returnType = null ; final boolean use15specifics = sourceLevel >= ( ClassFileConstants . JDK1_5 ) ; char [ ] methodSignature = method . getGenericSignature ( ) ; if ( methodSignature == null ) { char [ ] methodDescriptor = method . getMethodDescriptor ( ) ; int numOfParams = 0 ; char nextChar ; int index = 0 ; while ( ( nextChar = methodDescriptor [ ( ++ index ) ] ) != ')' ) { if ( nextChar != '[' ) { numOfParams ++ ; if ( nextChar == 'L' ) while ( ( nextChar = methodDescriptor [ ( ++ index ) ] ) != ';' ) { } } } int startIndex = 0 ; if ( method . isConstructor ( ) ) { if ( ( isMemberType ( ) ) && ( ! ( isStatic ( ) ) ) ) { startIndex ++ ; } if ( isEnum ( ) ) { startIndex += 2 ; } } int size = numOfParams - startIndex ; if ( size > 0 ) { parameters = new TypeBinding [ size ] ; if ( this . environment . globalOptions . storeAnnotations ) paramAnnotations = new AnnotationBinding [ size ] [ ] ; index = 1 ; int end = 0 ; for ( int i = 0 ; i < numOfParams ; i ++ ) { while ( ( nextChar = methodDescriptor [ ( ++ end ) ] ) == '[' ) { } if ( nextChar == 'L' ) while ( ( nextChar = methodDescriptor [ ( ++ end ) ] ) != ';' ) { } if ( i >= startIndex ) { parameters [ ( i - startIndex ) ] = this . environment . getTypeFromSignature ( methodDescriptor , index , end , false , this , missingTypeNames ) ; if ( paramAnnotations != null ) paramAnnotations [ ( i - startIndex ) ] = BinaryTypeBinding . createAnnotations ( method . getParameterAnnotations ( ( i - startIndex ) ) , this . environment , missingTypeNames ) ; } index = end + 1 ; } } char [ ] [ ] exceptionTypes = method . getExceptionTypeNames ( ) ; if ( exceptionTypes != null ) { size = exceptionTypes . length ; if ( size > 0 ) { exceptions = new ReferenceBinding [ size ] ; for ( int i = 0 ; i < size ; i ++ ) exceptions [ i ] = this . environment . getTypeFromConstantPoolName ( exceptionTypes [ i ] , 0 , ( - 1 ) , false , missingTypeNames ) ; } } if ( ! ( method . isConstructor ( ) ) ) returnType = this . environment . getTypeFromSignature ( methodDescriptor , ( index + 1 ) , ( - 1 ) , false , this , missingTypeNames ) ; } else { methodModifiers |= ExtraCompilerModifiers . AccGenericSignature ; <START_BUG> SignatureWrapper wrapper = new SignatureWrapper ( methodSignature , true ) ; <END_BUG> if ( ( wrapper . signature [ wrapper . start ] ) == '<' ) { ( wrapper . start ) ++ ; typeVars = createTypeVariables ( wrapper , false , missingTypeNames ) ; ( wrapper . start ) ++ ; } if ( ( wrapper . signature [ wrapper . start ] ) == '(' ) { ( wrapper . start ) ++ ; if ( ( wrapper . signature [ wrapper . start ] ) == ')' ) { ( wrapper . start ) ++ ; } else { ArrayList types = new ArrayList ( 2 ) ; while ( ( wrapper . signature [ wrapper . start ] ) != ')' ) types . add ( this . environment . getTypeFromTypeSignature ( wrapper , typeVars , this , missingTypeNames ) ) ; ( wrapper . start ) ++ ; int numParam = types . size ( ) ; parameters = new TypeBinding [ numParam ] ; types . toArray ( parameters ) ; if ( this . environment . globalOptions . storeAnnotations ) { paramAnnotations = new AnnotationBinding [ numParam ] [ ] ; for ( int i = 0 ; i < numParam ; i ++ ) paramAnnotations [ i ] = BinaryTypeBinding . createAnnotations ( method . getParameterAnnotations ( i ) , this . environment , missingTypeNames ) ; } } } returnType = this . environment . getTypeFromTypeSignature ( wrapper , typeVars , this , missingTypeNames ) ; if ( ( ! ( wrapper . atEnd ( ) ) ) && ( ( wrapper . signature [ wrapper . start ] ) == '^' ) ) { ArrayList types = new ArrayList ( 2 ) ; do { ( wrapper . start ) ++ ; types . add ( this . environment . getTypeFromTypeSignature ( wrapper , typeVars , this , missingTypeNames ) ) ; } while ( ( ! ( wrapper . atEnd ( ) ) ) && ( ( wrapper . signature [ wrapper . start ] ) == '^' ) ) ; exceptions = new ReferenceBinding [ types . size ( ) ] ;

Fix:
SignatureWrapper wrapper = new SignatureWrapper ( methodSignature , use15specifics ) ;