private MethodSymbol firstUnimplementedAbstractImpl(ClassSymbol impl, ClassSymbol c) {
            MethodSymbol undef = null;
            // Do not bother to search in classes that are not abstract,
            // since they cannot have abstract members.
            if (c == impl || (c.flags() & (ABSTRACT | INTERFACE)) != 0) {
                Scope s = c.members();
                for (Scope.Entry e = s.elems;
                     undef == null && e != null;
                     e = e.sibling) {
                    if (e.sym.kind == MTH &&
                        (e.sym.flags() & (ABSTRACT|IPROXY|DEFAULT)) == ABSTRACT) {
                        MethodSymbol absmeth = (MethodSymbol)e.sym;
                        MethodSymbol implmeth = absmeth.implementation(impl, this, true);
                        if (implmeth == null || implmeth == absmeth) {
                            //look for default implementations
                            if (allowDefaultMethods) {
                                MethodSymbol prov = interfaceCandidates(impl.type, absmeth).head;
                                if (prov != null && prov.overrides(absmeth, impl, this, true)) {
                                    implmeth = prov;
                                }
                            }
                        }
                        if (implmeth == null || implmeth == absmeth) {
                            undef = absmeth;
                        }
                    }
                }
                if (undef == null) {
                    Type st = supertype(c.type);
                    if (st.hasTag(CLASS))
                        undef = firstUnimplementedAbstractImpl(impl, (ClassSymbol)st.tsym);
                }
                for (List<Type> l = interfaces(c.type);
                     undef == null && l.nonEmpty();
                     l = l.tail) {
                    undef = firstUnimplementedAbstractImpl(impl, (ClassSymbol)l.head.tsym);
                }
            }
            return undef;
        }
private MethodSymbol firstUnimplementedAbstractImpl ( ClassSymbol impl , ClassSymbol c ) { MethodSymbol undef = null ; if ( c == impl || ( c . flags ( ) & ( ABSTRACT | INTERFACE ) ) != 0 ) { Scope s = c . members ( ) ; for ( Scope . Entry e = s . elems ; undef == null && e != null ; e = e . sibling ) { if ( e . sym . kind == MTH && ( e . sym . flags ( ) & ( ABSTRACT | IPROXY | DEFAULT ) ) == ABSTRACT ) { MethodSymbol absmeth = ( MethodSymbol ) e . sym ; MethodSymbol implmeth = absmeth . implementation ( impl , this , true ) ; if ( implmeth == null || implmeth == absmeth ) { if ( allowDefaultMethods ) { MethodSymbol prov = interfaceCandidates ( impl . type , absmeth ) . head ; if ( prov != null && prov . overrides ( absmeth , impl , this , true ) ) { implmeth = prov ; } } } if ( implmeth == null || implmeth == absmeth ) { undef = absmeth ; } } } if ( undef == null ) { Type st = supertype ( c . type ) ; if ( st . hasTag ( CLASS ) ) undef = firstUnimplementedAbstractImpl ( impl , ( ClassSymbol ) st . tsym ) ; } for ( List < Type > l = interfaces ( c . type ) ; undef == null && l . nonEmpty ( ) ; l = l . tail ) { undef = firstUnimplementedAbstractImpl ( impl , ( ClassSymbol ) l . head . tsym ) ; } } return undef ; }
where: