Eclipse plugin 获取悬停的Xtext元素

Eclipse plugin 获取悬停的Xtext元素,eclipse-plugin,dsl,xtext,Eclipse Plugin,Dsl,Xtext,我的Xtext语法如下所示: Model: MsgDef ; MsgDef: (definitions+=definition)+ ; definition: type=fieldType ' '+ name=ValidID (' '* '=' ' '* const=Value)? ; 我试图为definition元素创建一个工具提示,它只包含该元素跨越的文本 (Xtend语法)文档提供程序: import dsl.dsl_msg.definition imp

我的Xtext语法如下所示:

Model:
    MsgDef
;


MsgDef:
     (definitions+=definition)+ 
;

definition:
    type=fieldType ' '+ name=ValidID (' '* '=' ' '* const=Value)?
;
我试图为definition元素创建一个工具提示,它只包含该元素跨越的文本

(Xtend语法)文档提供程序:

import dsl.dsl_msg.definition
import static extension org.eclipse.xtext.nodemodel.util.NodeModelUtils.*

class MsgDocumentationProvider implements IEObjectDocumentationProvider {

    override getDocumentation(EObject o) {
        val result = switch(o) {
            definition : o.node?.tokenText  

        }
        return result

    }

}
我的EOBjectHover实现:

package dsl.ui.hover

import dsl.dsl_msg.definition
import com.google.inject.Inject
import org.eclipse.emf.ecore.EObject
import org.eclipse.jface.text.IRegion
import org.eclipse.jface.text.ITextViewer
import org.eclipse.jface.text.Region
import org.eclipse.xtext.nodemodel.util.NodeModelUtils
import org.eclipse.xtext.resource.EObjectAtOffsetHelper
import org.eclipse.xtext.resource.XtextResource
import org.eclipse.xtext.ui.editor.hover.DispatchingEObjectTextHover
import org.eclipse.xtext.ui.editor.hover.IEObjectHoverProvider
import org.eclipse.xtext.util.Pair
import org.eclipse.xtext.util.Tuples

class MsgHover extends DispatchingEObjectTextHover {

    @Inject
    private EObjectAtOffsetHelper eObjectAtOffsetHelper;

    @Inject private IEObjectHoverProvider msgHoverProvider;

    override protected Pair<EObject, IRegion> getXtextElementAt(XtextResource resource, int offset) {
        // check for cross reference
        val crossLinkedEObject = eObjectAtOffsetHelper.resolveCrossReferencedElementAt(resource, offset);
        if(crossLinkedEObject != null) {
              [...]
        } else {
            val parseResult = resource.getParseResult();
            if(parseResult != null) {
                var leaf = NodeModelUtils.findLeafNodeAtOffset(parseResult.getRootNode(), offset);
                if(leaf != null && leaf.isHidden() && leaf.getOffset() == offset) {
                    leaf = NodeModelUtils.findLeafNodeAtOffset(parseResult.getRootNode(), offset - 1);
                }
            // this is the part I am having trouble with
                if(leaf != null && leaf.getGrammarElement() instanceof definition) {
                    val keyword = leaf.getGrammarElement() as definition;
                    return Tuples.create(keyword, new Region(leaf.getOffset(), leaf.getLength()));
                }
           //-----------------
            }
        }
        return null;
    }

    override public Object getHoverInfo(EObject first, ITextViewer textViewer, IRegion hoverRegion) {
            this.lastCreatorProvider = msgHoverProvider.getHoverInfo(first, textViewer, hoverRegion);
            return this.lastCreatorProvider?.getInfo();
    }

}
我没有得到标记的代码来为definition语法元素创建区域。在遇到definition节点之前,我也尝试过获取父节点,但没有成功,因为父节点实际上只是规则调用实现,我不知道如何处理它们


我如何得到定义?

我不确定我是否理解您的问题。你在MsgHover上更改的目标是什么?@christianditerich问得好,我有另一个需要访问关键字的鼠标悬停,而默认的鼠标悬停没有。我复制了那个,并试图改编它。不过,在这个用例中,默认的悬停似乎实际执行了我想要的操作…:-P哦,是时候结束这个问题了。
class MsgHoverProvider extends DefaultEObjectHoverProvider {

    override protected boolean hasHover(EObject o){
        return true;
    }

}