package org.gsonformat.intellij.process;
import com.intellij.psi.*;
import org.apache.http.util.TextUtils;
import org.gsonformat.intellij.common.FieldHelper;
import org.gsonformat.intellij.common.Try;
import org.gsonformat.intellij.config.Config;
import org.gsonformat.intellij.config.Constant;
import org.gsonformat.intellij.entity.ClassEntity;
import org.gsonformat.intellij.entity.FieldEntity;
import java.util.regex.Pattern;
/**
* Created by dim on 16/11/7.
*/
public class LombokProcessor extends Processor {
@Override
protected void onStarProcess(ClassEntity classEntity, PsiElementFactory factory, PsiClass cls, IProcessor visitor) {
super.onStarProcess(classEntity, factory, cls, visitor);
injectAnnotation(factory, cls);
}
private void injectAnnotation(PsiElementFactory factory, PsiClass generateClass) {
if (factory == null || generateClass == null) {
return;
}
PsiModifierList modifierList = generateClass.getModifierList();
if (modifierList != null) {
PsiElement firstChild = modifierList.getFirstChild();
Pattern pattern = Pattern.compile("@.*?NoArgsConstructor");
if (firstChild != null && !pattern.matcher(firstChild.getText()).find()) {
PsiAnnotation annotationFromText = factory.createAnnotationFromText("@lombok.NoArgsConstructor", generateClass);
modifierList.addBefore(annotationFromText, firstChild);
}
Pattern pattern2 = Pattern.compile("@.*?Data");
if (firstChild != null && !pattern2.matcher(firstChild.getText()).find()) {
PsiAnnotation annotationFromText = factory.createAnnotationFromText("@lombok.Data", generateClass);
modifierList.addBefore(annotationFromText, firstChild);
}
}
}
@Override
protected void generateField(PsiElementFactory factory, FieldEntity fieldEntity, PsiClass cls, ClassEntity classEntity) {
if (fieldEntity.isGenerate()) {
Try.run(new Try.TryListener() {
@Override
public void run() {
cls.add(factory.createFieldFromText(generateLombokFieldText(classEntity, fieldEntity,null), cls));
}
@Override
public void runAgain() {
fieldEntity.setFieldName(FieldHelper.generateLuckyFieldName(fieldEntity.getFieldName()));
cls.add(factory.createFieldFromText(generateLombokFieldText(classEntity, fieldEntity, Constant.FIXME), cls));
}
@Override
public void error() {
cls.addBefore(factory.createCommentFromText("// FIXME generate failure field " + fieldEntity.getFieldName(), cls), cls.getChildren()[0]);
}
});
}
}
@Override
protected void createGetAndSetMethod(PsiElementFactory factory, PsiClass cls, FieldEntity field) {
}
@Override
protected void onEndGenerateClass(PsiElementFactory factory, ClassEntity classEntity, PsiClass parentClass, PsiClass generateClass, IProcessor visitor) {
super.onEndGenerateClass(factory, classEntity, parentClass, generateClass, visitor);
injectAnnotation(factory, generateClass);
}
private String generateLombokFieldText(ClassEntity classEntity, FieldEntity fieldEntity,String fixme) {
fixme = fixme == null ? "" : fixme;
StringBuilder fieldSb = new StringBuilder();
String filedName = fieldEntity.getGenerateFieldName();
if (!TextUtils.isEmpty(classEntity.getExtra())) {
fieldSb.append(classEntity.getExtra()).append("\n");
classEntity.setExtra(null);
}
if (fieldEntity.getTargetClass() != null) {
fieldEntity.getTargetClass().setGenerate(true);
}
if (Config.getInstant().isFieldPrivateMode()) {
fieldSb.append("private ").append(fieldEntity.getFullNameType()).append(" ").append(filedName).append(" ; ");
} else {
fieldSb.append("public ").append(fieldEntity.getFullNameType()).append(" ").append(filedName).append(" ; ");
}
return fieldSb.append(fixme).toString();
}
}