PsiClass (@NotNull PsiClass psiClass, @NotNull PsiClass psiBaseBuilderClass, PsiAnnotation psiAnnotation) { String builderClassName = getBuilderImplClassName(psiClass); String builderClassQualifiedName = psiClass.getQualifiedName() + "." + builderClassName; final LombokLightClassBuilder implClassBuilder = new LombokLightClassBuilder(psiClass, builderClassName, builderClassQualifiedName) .withContainingClass(psiClass) .withNavigationElement(psiAnnotation) .withParameterTypes(psiClass.getTypeParameterList()) .withModifier(PsiModifier.STATIC) .withModifier(PsiModifier.FINAL); final PsiClassType extendsType = getTypeWithSpecificTypeParameters(psiBaseBuilderClass, PsiClassUtil.getTypeWithGenerics(psiClass), PsiClassUtil.getTypeWithGenerics(implClassBuilder)); implClassBuilder.withExtends(extendsType); if (hasValidJacksonizedAnnotation(psiClass, null)) { handleJacksonized(psiClass, null, psiAnnotation, implClassBuilder); } else { implClassBuilder.withModifier(PsiModifier.PRIVATE); } implClassBuilder.withMethodSupplier((thisPsiClass) -> createAllMethodsOfImplBuilder(psiClass, psiAnnotation, thisPsiClass)); return implClassBuilder; }