package com.sgaop.idea.linemarker.navigation; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; import com.intellij.psi.impl.java.stubs.index.JavaShortClassNameIndex; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.xml.XmlAttribute; import com.intellij.psi.xml.XmlTag; import com.sgaop.util.SqlsXmlUtil; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Objects; /** * @author 黄川 [email protected] * @date: 2020/5/30 */ public class Sqls2XmlNavigationHandler extends AbstractPsiElementNavigationHandler { @Override public boolean canNavigate(PsiElement psiElement) { return true; } @Override public List<PsiElement> findReferences(PsiElement psiElement) { XmlTag xmlTag = (XmlTag) psiElement; XmlAttribute xmlAttribute = xmlTag.getAttribute("id"); if (xmlTag.getName().equals("sql") && Objects.nonNull(xmlAttribute)) { String id = xmlAttribute.getValue(); PsiClass javaPsiClass = findJavaPsiClass(psiElement); if (Objects.nonNull(javaPsiClass)) { return SqlsXmlUtil.findJavaPsiElement(javaPsiClass, id); } } return Arrays.asList(); } private PsiClass findJavaPsiClass(PsiElement psiElement) { XmlTag parentOfType = PsiTreeUtil.getParentOfType(psiElement, XmlTag.class); if (parentOfType.getName().equals("Sqls")) { XmlAttribute aClass = parentOfType.getAttribute("class"); if (Objects.nonNull(aClass)) { String value = aClass.getValue(); String[] split = value.split("\\."); Collection<PsiClass> roleBizImpl = JavaShortClassNameIndex.getInstance().get(split[split.length - 1], psiElement.getProject(), GlobalSearchScope.projectScope(psiElement.getProject())); for (PsiClass psiClass : roleBizImpl) { if (psiClass.getQualifiedName().equals(value)) { return psiClass; } } } } return null; } }