public static void collectCopyMapping(PsiElement @NotNull [] pattern,
                                        PsiElement @NotNull [] copy,
                                        @NotNull Predicate<? super PsiExpression> isReplaceablePattern,
                                        @NotNull BiConsumer<? super PsiExpression, ? super PsiExpression> expressionsMapping,
                                        @NotNull BiConsumer<? super PsiVariable, ? super PsiVariable> variablesMapping) {
    pattern = DuplicatesFinder.getDeeplyFilteredElements(pattern);
    copy = DuplicatesFinder.getDeeplyFilteredElements(copy);
    if (copy.length != pattern.length) {
      return; // it's an extracted parameter, so there's no need to go deeper
    }
    for (int i = 0; i < pattern.length; i++) {
      collectCopyMapping(pattern[i], copy[i], isReplaceablePattern, expressionsMapping, variablesMapping);
    }
  }
public static void collectCopyMapping(PsiElement @NotNull [] pattern,
                                        PsiElement @NotNull [] copy,
                                        @NotNull Predicate<? super PsiExpression> isReplaceablePattern,
                                        @NotNull BiConsumer<? super PsiExpression, ? super PsiExpression> expressionsMapping,
                                        @NotNull BiConsumer<? super PsiVariable, ? super PsiVariable> variablesMapping)