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" 方法,但是您可以尝试一下。
我试图通过在 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" 方法,但是您可以尝试一下。