package com.seventh7.mybatis.service; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.project.Project; import com.intellij.psi.JavaPsiFacade; import com.intellij.psi.PsiAnnotation; import com.intellij.psi.PsiElementFactory; import com.intellij.psi.PsiJavaFile; import com.intellij.psi.PsiMethod; import com.intellij.psi.PsiModifierList; import com.intellij.psi.PsiModifierListOwner; import com.intellij.psi.PsiParameter; import com.intellij.psi.PsiParameterList; import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.seventh7.mybatis.annotation.Annotation; import com.seventh7.mybatis.util.JavaUtils; import org.jetbrains.annotations.NotNull; /** * @author yanglin */ public class AnnotationService { private Project project; public AnnotationService(Project project) { this.project = project; } public static AnnotationService getInstance(@NotNull Project project) { return ServiceManager.getService(project, AnnotationService.class); } public void addAnnotation(@NotNull PsiModifierListOwner parameter, @NotNull Annotation annotation) { PsiModifierList modifierList = parameter.getModifierList(); if (JavaUtils.isAnnotationPresent(parameter, annotation) || null == modifierList) { return; } JavaService.getInstance(parameter.getProject()).importClazz((PsiJavaFile) parameter.getContainingFile(), annotation.getQualifiedName()); PsiElementFactory elementFactory = JavaPsiFacade.getInstance(project).getElementFactory(); PsiAnnotation psiAnnotation = elementFactory.createAnnotationFromText(annotation.toString(), parameter); modifierList.add(psiAnnotation); JavaCodeStyleManager.getInstance(project).shortenClassReferences(psiAnnotation.getParent()); } public void addAnnotationWithParameterNameForMethodParameters(@NotNull PsiMethod method) { PsiParameterList parameterList = method.getParameterList(); if (null == parameterList) { return; } PsiParameter[] parameters = parameterList.getParameters(); for (PsiParameter param : parameters) { addAnnotationWithParameterName(param); } } public void addAnnotationWithParameterName(@NotNull PsiParameter parameter) { String name = parameter.getName(); if (null != name) { AnnotationService.getInstance(parameter.getProject()).addAnnotation(parameter, Annotation.PARAM.withValue(new Annotation.StringValue(name))); } } }