package com.seventh7.mybatis.provider; import com.google.common.base.Optional; import com.intellij.codeInsight.daemon.RelatedItemLineMarkerInfo; import com.intellij.codeInsight.daemon.RelatedItemLineMarkerProvider; import com.intellij.codeInsight.navigation.NavigationGutterIconBuilder; import com.intellij.openapi.editor.markup.GutterIconRenderer; import com.intellij.psi.PsiAnnotation; import com.intellij.psi.PsiAnnotationMemberValue; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiField; import com.intellij.psi.PsiType; import com.intellij.psi.impl.source.PsiClassReferenceType; import com.seventh7.mybatis.annotation.Annotation; import com.seventh7.mybatis.dom.model.Mapper; import com.seventh7.mybatis.util.Icons; import com.seventh7.mybatis.util.JavaUtils; import com.seventh7.mybatis.util.MapperUtils; import org.apache.commons.lang.StringUtils; import org.jetbrains.annotations.NotNull; import java.util.Collection; /** * @author yanglin */ public class InjectionLineMarkerProvider extends RelatedItemLineMarkerProvider { @Override protected void collectNavigationMarkers(@NotNull PsiElement element, Collection<? super RelatedItemLineMarkerInfo> result) { if (!(element instanceof PsiField)) return; PsiField field = (PsiField) element; if (!isTargetField(field)) return; PsiType type = field.getType(); if (!(type instanceof PsiClassReferenceType)) return; Optional<PsiClass> clazz = JavaUtils.findClazz(element.getProject(), type.getCanonicalText()); if (!clazz.isPresent()) return; PsiClass psiClass = clazz.get(); Optional<Mapper> mapper = MapperUtils.findFirstMapper(element.getProject(), psiClass); if (!mapper.isPresent()) return; NavigationGutterIconBuilder<PsiElement> builder = NavigationGutterIconBuilder.create(Icons.SPRING_INJECTION_ICON) .setAlignment(GutterIconRenderer.Alignment.CENTER) .setTarget(psiClass) .setTooltipTitle("Data access object found - " + psiClass.getQualifiedName()); result.add(builder.createLineMarkerInfo(field.getNameIdentifier())); } private boolean isTargetField(PsiField field) { if (JavaUtils.isAnnotationPresent(field, Annotation.AUTOWIRED)) { return true; } Optional<PsiAnnotation> resourceAnno = JavaUtils.getPsiAnnotation(field, Annotation.RESOURCE); if (resourceAnno.isPresent()) { PsiAnnotationMemberValue nameValue = resourceAnno.get().findAttributeValue("name"); String name = nameValue.getText().replaceAll("\"", ""); return StringUtils.isBlank(name) || name.equals(field.getName()); } return false; } }