private static boolean processMethodReturnValue(final @NotNull PsiMethodCallExpression methodCallExpr,
                                                  final @NotNull Processor<? super SliceUsage> processor,
                                                  final @NotNull JavaSliceBuilder builder) {
    // if the call looks like 'otherClassObject.methodFromInterface()'
    // we can narrow down the overridden methods scan to inheritors of OtherClass only
    PsiClass qualifierClass = resolveQualifier(methodCallExpr);
    JavaResolveResult resolved = methodCallExpr.resolveMethodGenerics();
    PsiElement r = resolved.getElement();
    if (r instanceof PsiCompiledElement) {
      r = r.getNavigationElement();
    }
    if (!(r instanceof PsiMethod methodCalled)) return true;

    PsiType returnType = methodCalled.getReturnType();
    if (returnType == null) return true;

    final PsiType parentType = builder.substitute(methodCallExpr.getType());
    final PsiSubstitutor substitutor = resolved.getSubstitutor().putAll(builder.getSubstitutor());
    return processMethodReturnValue(processor, builder.getSubstitutor(), qualifierClass, methodCalled, parentType,
                                    builder.withSubstitutor(substitutor).dropSyntheticField().withFilter(JavaValueFilter::pushFrame));
  }
private static boolean processMethodReturnValue(final @NotNull PsiMethodCallExpression methodCallExpr,
                                                  final @NotNull Processor<? super SliceUsage> processor,
                                                  final @NotNull JavaSliceBuilder builder)