code: public List<MethodSymbol> interfaceCandidates(Type site, MethodSymbol ms) {
          CandidatesCache.Entry e = candidatesCache.new Entry(site, ms);
          List<MethodSymbol> candidates = candidatesCache.get(e);
          if (candidates == null) {
              Filter<Symbol> filter = new MethodFilter(ms, site);
              List<MethodSymbol> candidates2 = List.nil();
              for (Symbol s : membersClosure(site, false).getSymbols(filter)) {
                  if (!site.tsym.isInterface() && !s.owner.isInterface()) {
                      return List.of((MethodSymbol)s);
                  } else if (!candidates2.contains(s)) {
                      candidates2 = candidates2.prepend((MethodSymbol)s);
                  }
              }
              candidates = prune(candidates2);
              candidatesCache.put(e, candidates);
          }
          return candidates;
      }
docs: where