package com.seventh7.mybatis.dom.converter;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiReference;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.xml.XmlAttributeValue;
import com.intellij.util.xml.ConvertContext;
import com.intellij.util.xml.CustomReferenceConverter;
import com.intellij.util.xml.DomJavaUtil;
import com.intellij.util.xml.GenericDomValue;
import com.intellij.util.xml.PsiClassConverter;
import com.seventh7.mybatis.alias.AliasClassReference;
import com.seventh7.mybatis.alias.AliasFacade;
import com.seventh7.mybatis.util.MybatisConstants;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* @author yanglin
*/
public class AliasConverter extends ConverterAdaptor<PsiClass> implements CustomReferenceConverter<PsiClass> {
private PsiClassConverter delegate = new PsiClassConverter();
@Nullable @Override
public PsiClass fromString(@Nullable @NonNls String s, ConvertContext context) {
if (StringUtil.isEmptyOrSpaces(s)) return null;
if (!s.contains(MybatisConstants.DOT_SEPARATOR)) {
return AliasFacade.getInstance(context.getProject()).findPsiClass(context.getXmlElement(), s).orNull();
}
return DomJavaUtil.findClass(s.trim(), context.getFile(), context.getModule(), GlobalSearchScope.allScope(context.getProject()));
}
@Nullable @Override
public String toString(@Nullable PsiClass psiClass, ConvertContext context) {
return delegate.toString(psiClass, context);
}
@NotNull @Override
public PsiReference[] createReferences(GenericDomValue<PsiClass> value, PsiElement element, ConvertContext context) {
if (((XmlAttributeValue) element).getValue().contains(MybatisConstants.DOT_SEPARATOR)) {
return delegate.createReferences(value, element, context);
} else {
return new PsiReference[]{new AliasClassReference((XmlAttributeValue) element)};
}
}
}