@NotNull
  private static ConstructorMethodInfo getConstructorMethodInfo(@NotNull PsiClass contextClass) {
    return CachedValuesManager.getCachedValue(contextClass, () -> {
      CachedValueProvider.Result<ConstructorMethodInfo> emptyResult =
        CachedValueProvider.Result.create(new ConstructorMethodInfo(Map.of(), null, false), PsiModificationTracker.MODIFICATION_COUNT);
      PsiMethod context = findOnlyOneNotChainConstructor(contextClass);
      if(context == null) return emptyResult;
      PsiManager psiManager = context.getManager();
      var visitor = new JavaRecursiveElementWalkingVisitor() {
        final Map<String, Map<PsiMethod, PsiMethodCallExpression>> collectedMethods = new HashMap<>();
        boolean callsOutside = false;

        @Override
        public void visitLambdaExpression(@NotNull PsiLambdaExpression expression) { }

        @Override
        public void visitClass(@NotNull PsiClass aClass) { }

        @Override
        public void visitAnonymousClass(@NotNull PsiAnonymousClass aClass) { }

        @Override
        public void visitMethodCallExpression(@NotNull PsiMethodCallExpression methodCallExpression) {
          PsiExpression qualifier = methodCallExpression.getMethodExpression().getQualifierExpression();
          if (qualifier == null || qualifier instanceof PsiThisExpression) {
            PsiMethod resolvedMethod = methodCallExpression.resolveMethod();
            if (resolvedMethod != null &&
                resolvedMethod.getContainingClass() != null &&
                psiManager.areElementsEquivalent(resolvedMethod.getContainingClass(), contextClass)) {
              collectedMethods.computeIfAbsent(resolvedMethod.getName(), k -> new HashMap<>())
                .putIfAbsent(resolvedMethod, methodCallExpression);
            }
            else {
              callsOutside = true;
            }
          }
          else {
            callsOutside = true;
          }
          super.visitMethodCallExpression(methodCallExpression);
        }
      };
      context.accept(visitor);
      ConstructorMethodInfo info = new ConstructorMethodInfo(visitor.collectedMethods, context, visitor.callsOutside);
      return CachedValueProvider.Result.create(info, PsiModificationTracker.MODIFICATION_COUNT);
    });
  }
@NotNull
  private static ConstructorMethodInfo getConstructorMethodInfo(@NotNull PsiClass contextClass)