0

我试图通过在 PsiImplUtil 类中创建方法来覆盖我的一些 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);
  }

}

这是带有方法实现的 util 类

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...
4

1 回答 1

1

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

public static PsiReference getReference(JMMValidNameExpr expr, IReference ref)

然后它将被注入为

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

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

于 2020-01-03T19:15:03.553 回答