GrammarKit 插件中的方法注入不起作用

Method injection in GrammarKit plugin does not work

我试图通过在 PsiImplUtil class 中创建方法来覆盖我的一些 PsiElements 中的 getReference() 方法,但是没有方法被注入。下面是需要方法 (ValidNameExpr) 的元素。我确定我只是在某个地方犯了一个小错误,但我不明白为什么这不起作用。我尝试使该方法成为非静态方法,但这也无济于事。如果您知道可能出了什么问题,能否请您帮忙?

// This is a generated file. Not intended for manual editing.
package lang.psi.impl;

public class JMMValidNameExprImpl extends ASTWrapperPsiElement implements JMMValidNameExpr {

  public JMMValidNameExprImpl(@NotNull ASTNode node) {
    super(node);
  }

  public void accept(@NotNull JMMVisitor visitor) {
    visitor.visitValidNameExpr(this);
  }

  public void accept(@NotNull PsiElementVisitor visitor) {
    if (visitor instanceof JMMVisitor) accept((JMMVisitor)visitor);
    else super.accept(visitor);
  }

  @Override
  @NotNull
  public PsiElement getValidName() {
    return findNotNullChildByType(VALID_NAME);
  }

}

这是utilclass配合执行方法

package lang.psi;

public class JMMPsiImplUtil {

    public static PsiReference getReference(IReference ref) {
        return RefUtil.makeRef(expr, expr.getTextRangeInParent());
    }
    //more stuff here... (there are no other methods named getReference, just in case that is a problem)

这是我的 .BNF 文件

{
    ...

    psiImplUtilClass = "lang.psi.JMMPsiImplUtil"

    ...
}
...
validNameExpr ::= VALID_NAME {extends=expr implements="lang.psi.IReference" methods=[getReference]}

More stuff...

据我所知,实用方法的第一个参数 必须 具有您要为其添加的 PSI 元素的类型:

public static PsiReference getReference(JMMValidNameExpr expr, IReference ref)

然后它将作为

注入
PsiReference getReference(IReference ref) {
  return JMMPsiImplUtil.getReference(this, ref);
}

或类似的东西。这是因为这些方法是静态的,您可能希望针对不同的类型使用许多这样的方法,因此第一个参数用于区分它们。注意:我不确定它是否适用于 "over-riding" 方法,但是您可以尝试一下。