@Override
  public @Nullable UsageInfo createUsageInfo(@NotNull ChangeInfo changeInfo,
                                             @NotNull PsiReference reference,
                                             @NotNull PsiElement m,
                                             boolean isToModifyArgs,
                                             boolean isToThrowExceptions) {
    JavaChangeInfo javaChangeInfo = JavaChangeInfoConverters.getJavaChangeInfo(changeInfo, new UsageInfo(reference));
    if (javaChangeInfo == null) return null;
    PsiMethod method = javaChangeInfo.getMethod();
    if (m instanceof PsiMethod) {
      //in case of propagation, completely different method
      //todo if it's foreign language override, keep base method and hope it's fine
      method = (PsiMethod)m;
    }

    PsiElement element = reference.getElement();
    boolean isToCatchExceptions = isToThrowExceptions &&
                                  needToCatchExceptions(RefactoringUtil.getEnclosingMethod(element), javaChangeInfo);
    if (PsiUtil.isMethodUsage(element)) {
      return new GrMethodCallUsageInfo(element, isToModifyArgs, isToCatchExceptions, method);
    }
    else if (element instanceof GrDocTagValueToken) {
      return new UsageInfo(reference.getElement());
    }
    else if (element instanceof GrMethod && ((GrMethod)element).isConstructor()) {
      return new DefaultConstructorImplicitUsageInfo((GrMethod)element, ((GrMethod)element).getContainingClass(), method);
    }
    else if (element instanceof PsiClass psiClass) {
      LOG.assertTrue(method.isConstructor());
      if (psiClass instanceof GrAnonymousClassDefinition) {
        return new GrMethodCallUsageInfo(element, isToModifyArgs, isToCatchExceptions, method);
      }
      /*if (!(myChangeInfo instanceof JavaChangeInfoImpl)) continue; todo propagate methods
      if (shouldPropagateToNonPhysicalMethod(method, result, psiClass,
                                             ((JavaChangeInfoImpl)myChangeInfo).propagateParametersMethods)) {
        continue;
      }
      if (shouldPropagateToNonPhysicalMethod(method, result, psiClass,
                                             ((JavaChangeInfoImpl)myChangeInfo).propagateExceptionsMethods)) {
        continue;
      }*/
      return new NoConstructorClassUsageInfo(psiClass);
    }
    else if (reference instanceof PsiCallReference) {
      return new CallReferenceUsageInfo((PsiCallReference)reference);
    }
    else {
      return new MoveRenameUsageInfo(element, reference, method);
    }
  }
@Override
  public @Nullable UsageInfo createUsageInfo(@NotNull ChangeInfo changeInfo,
                                             @NotNull PsiReference reference,
                                             @NotNull PsiElement m,
                                             boolean isToModifyArgs,
                                             boolean isToThrowExceptions)