PsiMethod (PsiClass psiClass, @PsiModifier.ModifierConstant String methodModifier, String staticName, boolean useJavaDefaults, Collection<PsiField> params, PsiAnnotation psiAnnotation) { LombokLightMethodBuilder methodBuilder = new LombokLightMethodBuilder(psiClass.getManager(), staticName) .withContainingClass(psiClass) .withNavigationElement(psiAnnotation) .withModifier(methodModifier) .withModifier(PsiModifier.STATIC); PsiSubstitutor substitutor = PsiSubstitutor.EMPTY; if (psiClass.hasTypeParameters()) { final PsiTypeParameter[] classTypeParameters = psiClass.getTypeParameters(); // need to create new type parameters for (int index = 0; index < classTypeParameters.length; index++) { final PsiTypeParameter classTypeParameter = classTypeParameters[index]; final LightTypeParameterBuilder methodTypeParameter = createTypeParameter(methodBuilder, index, classTypeParameter); methodBuilder.withTypeParameter(methodTypeParameter); substitutor = substitutor.put(classTypeParameter, PsiSubstitutor.EMPTY.substitute(methodTypeParameter)); } } final PsiElementFactory factory = JavaPsiFacade.getElementFactory(psiClass.getProject()); final PsiType returnType = factory.createType(psiClass, substitutor); methodBuilder.withMethodReturnType(returnType); if (!useJavaDefaults) { for (PsiField psiField : params) { final String parameterName = psiField.getName(); final PsiType parameterType = substitutor.substitute(psiField.getType()); final LombokLightParameter parameter = new LombokLightParameter(parameterName, parameterType, methodBuilder); parameter.setNavigationElement(psiField); methodBuilder.withParameter(parameter); LombokCopyableAnnotations.copyCopyableAnnotations(psiField, parameter.getModifierList(), LombokCopyableAnnotations.BASE_COPYABLE); } } final String codeBlockText = createStaticCodeBlockText(returnType, useJavaDefaults, methodBuilder.getParameterList()); methodBuilder.withBodyText(codeBlockText); LombokAddNullAnnotations.createRelevantNonNullAnnotation(psiClass, methodBuilder); return methodBuilder; }