code: 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;
          }
docs: where: