@Contract("null, _, _, _ -> null")
  public static @Nullable <T extends PsiElement> T findChildOfType(@Nullable PsiElement element,
                                                                   @NotNull Class<T> aClass,
                                                                   boolean strict,
                                                                   @Nullable Class<? extends PsiElement> stopAt) {
    if (element == null) return null;

    FindElement<PsiElement> processor = new PsiElementProcessor.FindElement<PsiElement>() {
      @Override
      public boolean execute(@NotNull PsiElement each) {
        if (strict && each == element) return true;
        if (aClass.isInstance(each)) return setFound(each);
        return stopAt == null || !stopAt.isInstance(each);
      }
    };
    processElements(element, processor);
    return aClass.cast(processor.getFoundElement());
  }
@Contract("null, _, _, _ -> null")
  public static @Nullable <T extends PsiElement> T findChildOfType(@Nullable PsiElement element,
                                                                   @NotNull Class<T> aClass,
                                                                   boolean strict,
                                                                   @Nullable Class<? extends PsiElement> stopAt)