<s> package org . eclipse . jdt . internal . codeassist . select ; import org . eclipse . jdt . internal . compiler . ast . MessageSend ; import org . eclipse . jdt . internal . compiler . lookup . Binding ; import org . eclipse . jdt . internal . compiler . lookup . BlockScope ; import org . eclipse . jdt . internal . compiler . lookup . MethodBinding ; import org . eclipse . jdt . internal . compiler . lookup . ProblemReasons ; import org . eclipse . jdt . internal . compiler . lookup . ReferenceBinding ; import org . eclipse . jdt . internal . compiler . lookup . TypeBinding ; public class SelectionOnMessageSend extends MessageSend { private MethodBinding findNonDefaultAbstractMethod ( MethodBinding methodBinding ) { ReferenceBinding [ ] itsInterfaces = methodBinding . declaringClass . superInterfaces ( ) ; if ( itsInterfaces != Binding . NO_SUPERINTERFACES ) { ReferenceBinding [ ] interfacesToVisit = itsInterfaces ; int nextPosition = interfacesToVisit . length ; for ( int i = 0 ; i < nextPosition ; i ++ ) { ReferenceBinding currentType = interfacesToVisit [ i ] ; MethodBinding [ ] methods = currentType . getMethods ( methodBinding . selector ) ; if ( methods != null ) { for ( int k = 0 ; k < methods . length ; k ++ ) { if ( methodBinding . areParametersEqual ( methods [ k ] ) ) return methods [ k ] ; } } if ( ( itsInterfaces = currentType . superInterfaces ( ) ) != Binding . NO_SUPERINTERFACES ) { int itsLength = itsInterfaces . length ; if ( nextPosition + itsLength >= interfacesToVisit . length ) System . arraycopy ( interfacesToVisit , 0 , interfacesToVisit = new ReferenceBinding [ nextPosition + itsLength + 5 ] , 0 , nextPosition ) ; nextInterface : for ( int a = 0 ; a < itsLength ; a ++ ) { ReferenceBinding next = itsInterfaces [ a ] ; for ( int b = 0 ; b < nextPosition ; b ++ ) if ( next == interfacesToVisit [ b ] ) continue nextInterface ; interfacesToVisit [ nextPosition ++ ] = next ; } } } } return methodBinding ; } public StringBuffer printExpression ( int indent , StringBuffer output ) { output . append ( "" ) ; if ( ! this . receiver . isImplicitThis ( ) ) this . receiver . printExpression ( 0 , output ) . append ( '.' ) ; output . append ( this . selector ) . append ( '(' ) ; if ( this . arguments != null ) { for ( int i = 0 ; i < this . arguments . length ; i ++ ) { if ( i > 0 ) output . append ( ", " ) ; this . arguments [ i ] . printExpression ( 0 , output ) ; } } return output . append ( ")>" ) ; } public TypeBinding resolveType ( BlockScope scope ) { super . resolveType ( scope ) ; if ( this . binding == null || ! ( this . binding . isValidBinding ( ) || this . binding . problemId ( ) == ProblemReasons . NotVisible || this . binding . problemId ( ) == ProblemReasons . InheritedNameHidesEnclosingName || this . binding . problemId ( ) == ProblemReasons . NonStaticReferenceInConstructorInvocation || this . binding . problemId ( ) == ProblemReasons . NonStaticReferenceInStaticContext ) ) { throw new SelectionNodeFound ( ) ; } else { if ( this . binding . isDefaultAbstract ( ) ) { throw new SelectionNodeFound ( findNonDefaultAbstractMethod ( this . binding ) ) ; } else { throw new SelectionNodeFound ( this . binding ) ; } } } } </s>