static final IMethod[] hierarchyDeclaresMethodName(
     IProgressMonitor pm, ITypeHierarchy hierarchy, IMethod method, String newName)
     throws CoreException {
   try {
     Set<IMethod> result = new HashSet<>();
     IType type = method.getDeclaringType();
     IMethod foundMethod =
         Checks.findMethod(newName, method.getParameterTypes().length, false, type);
     if (foundMethod != null) result.add(foundMethod);
     IMethod[] foundInHierarchyClasses =
         classesDeclareMethodName(
             hierarchy, Arrays.asList(hierarchy.getAllClasses()), method, newName);
     if (foundInHierarchyClasses != null) result.addAll(Arrays.asList(foundInHierarchyClasses));
     IType[] implementingClasses = hierarchy.getImplementingClasses(type);
     IMethod[] foundInImplementingClasses =
         classesDeclareMethodName(hierarchy, Arrays.asList(implementingClasses), method, newName);
     if (foundInImplementingClasses != null)
       result.addAll(Arrays.asList(foundInImplementingClasses));
     return result.toArray(new IMethod[result.size()]);
   } finally {
     if (pm != null) {
       pm.done();
     }
   }
 }