package com.seventh7.mybatis.reference; import com.google.common.base.Optional; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiField; import com.intellij.psi.PsiType; import com.intellij.psi.impl.source.PsiClassReferenceType; import com.intellij.psi.xml.XmlAttributeValue; import com.seventh7.mybatis.dom.MapperBacktrackingUtils; import com.seventh7.mybatis.util.JavaUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** * @author yanglin */ public class PsiFieldReferenceSetResolver extends ContextReferenceSetResolver<XmlAttributeValue, PsiField> { protected PsiFieldReferenceSetResolver(XmlAttributeValue from) { super(from); } @NotNull @Override public String getText() { return getElement().getValue(); } @NotNull @Override public Optional<PsiField> resolve(@NotNull PsiField current, @NotNull String text) { PsiType type = current.getType(); if (type instanceof PsiClassReferenceType && !((PsiClassReferenceType) type).hasParameters()) { PsiClass clazz = ((PsiClassReferenceType) type).resolve(); if (null != clazz) { return JavaUtils.findSettablePsiField(clazz, text); } } return Optional.absent(); } @NotNull @Override public Optional<PsiField> getStartElement(@Nullable String firstText) { Optional<PsiClass> clazz = MapperBacktrackingUtils.getPropertyClazz(getElement()); return clazz.isPresent() ? JavaUtils.findSettablePsiField(clazz.get(), firstText) : Optional.<PsiField>absent(); } }