这时就方便了许多,同时你可以根据属性值快速定位到指定的文件。如果引用的文件不存在,IDEA还会提示你错误,彻底告别了Ctrl+C、Ctrl+V等烦人操作,如果你对资源进行重构操作,如rename、move,这里同样可以更新。
IntelliJ IDEA内置了很多ReferenceProvider,如java类、ResourceBundle的key引用、CSS等,用好这些内置的Provider会给你插件提供很好的功能。
如何去创建一个自定义的Provider,实现个性的提示呢?下面我们就以ww:set的scope属性为例子做一说明。 scope的属性值属于一定范围,只能为page, requestion, session和application,下面我们就要实现这样的提示:
创建一个类,代码如下:
public class VariableScopeReferenceProvider extends BaseReferenceProvider
{
protected RangeReference[] createReferencesByStringImpl(String string, PsiElement psiElement, ReferenceType referenceType, int i)
{
return new MyReference[]{new MyReference(string, psiElement)};
}
public class MyReference implements RangeReference
{
private String string;
private PsiElement psiElement;
public MyReference(String string, PsiElement psiElement)
{
this.string = string; this.psiElement = psiElement;
}
public void shiftRight(int i)
{
}
public void expandRight(int i)
{
}
public PsiElement getElement()
{
return psiElement;
}
public TextRange getRangeInElement()
{
return new TextRange(1, psiElement.getText().length());
}
@Nullable public PsiElement resolve()
{
return null;
}
public String getCanonicalText()
{
return string;
}
public PsiElement handleElementRename(String string) throws IncorrectOperationException
{
return psiElement;
}
public PsiElement bindToElement(PsiElement psiElement) throws IncorrectOperationException
{
return null;
}
public boolean isReferenceTo(PsiElement psiElement)
{
return false;
}
public Object[] getVariants()
{
return new Object[]{"page", "request", "session", "application"};
}
public boolean isSoft()
{
return true;
}
}
}
这里我们只需继承BaseReferenceProvider,然后实现该抽象类的抽象方法即可。这里我们作一说明:
- getRangeInElement方法需要按照以上的代码编写即可。
- resolve方法主要是为定位资源服务,如果属性值表示为一定的资源引用,可以实现该方法来实现定位。
- getVariants方法返回代码提示的列表,也就是弹出的代码提示窗口。
实现以上的方法后,我们只需调用ReferenceProvidersRegistry注册一下该Provider即可,代码如下:
registry.registerXmlAttributeValueReferenceProvider(
new String[]{"scope"},
new ScopeFilter(new ParentElementFilter(new AndFilter(new ClassFilter(XmlTag.class), new AndFilter(new OrFilter(new ElementFilter[]{new TextFilter("set")}), webwork2NamespaceFilter)), 2)),
new VariableScopeReferenceProvider());
重新运行这个插件,我们就可以看到如下效果: |