public Collection<PsiMethod> createFieldSetters(@NotNull PsiClass psiClass, @Modifier @NotNull String methodModifier) {
Collection<PsiMethod> result = new ArrayList<PsiMethod>();
final PsiMethod[] classMethods = PsiClassUtil.collectClassMethodsIntern(psiClass);
final PsiType booleanType = PsiPrimitiveTypeFactory.getInstance().getBooleanType();
for (PsiField psiField : psiClass.getFields()) {
boolean createSetter = true;
PsiModifierList modifierList = psiField.getModifierList();
if (null != modifierList) {
//Skip final fields.
createSetter = !modifierList.hasModifierProperty(PsiModifier.FINAL);
//Skip static fields.
createSetter &= !modifierList.hasModifierProperty(PsiModifier.STATIC);
//Skip fields having Setter annotation already
createSetter &= !hasFieldProcessorAnnotation(modifierList);
//Skip fields that start with $
createSetter &= !psiField.getName().startsWith(LombokConstants.LOMBOK_INTERN_FIELD_MARKER);
//Skip fields if a method with same name already exists
final Collection<String> methodNames = getFieldProcessor().getAllSetterNames(psiField, booleanType.equals(psiField.getType()));
createSetter &= !PsiMethodUtil.hasMethodByName(classMethods, methodNames);
}
if (createSetter) {
result.add(fieldProcessor.createSetterMethod(psiField, methodModifier));
}