@Nullable
 public static PsiMethod findMethodBySignature(
     @NotNull PsiClass aClass, @NotNull MethodSignature methodSignature, boolean checkBases) {
   String name = methodSignature.isConstructor() ? aClass.getName() : methodSignature.getName();
   List<Pair<PsiMethod, PsiSubstitutor>> pairs =
       aClass.findMethodsAndTheirSubstitutorsByName(name, checkBases);
   for (Pair<PsiMethod, PsiSubstitutor> pair : pairs) {
     PsiMethod method = pair.first;
     PsiSubstitutor substitutor = pair.second;
     MethodSignature foundMethodSignature = method.getSignature(substitutor);
     if (methodSignature.equals(foundMethodSignature)) return method;
   }
   return null;
 }
 @Nullable
 public static PsiMethod findMethodBySuperMethod(
     @NotNull PsiClass aClass, @NotNull PsiMethod method, final boolean checkBases) {
   List<Pair<PsiMethod, PsiSubstitutor>> pairs =
       aClass.findMethodsAndTheirSubstitutorsByName(method.getName(), checkBases);
   for (Pair<PsiMethod, PsiSubstitutor> pair : pairs) {
     PsiMethod candidate = pair.first;
     PsiSubstitutor substitutor = pair.second;
     MethodSignature candidateSignature = candidate.getSignature(substitutor);
     final PsiClass methodClass = method.getContainingClass();
     final PsiClass candidateClass = candidate.getContainingClass();
     if (methodClass == null || candidateClass == null) continue;
     PsiSubstitutor superSubstitutor =
         TypeConversionUtil.getClassSubstitutor(methodClass, candidateClass, substitutor);
     if (superSubstitutor == null) continue;
     MethodSignature superSignature = method.getSignature(superSubstitutor);
     if (isSubsignature(superSignature, candidateSignature)) return candidate;
   }
   return null;
 }