在 Xtext 大纲视图中隐藏父节点

Hide parent nodes in Xtext Outline View

我正在研究 Xtext 解析器,运行 遇到一个问题:使用 Eclipse 的 IDE 插件,特别是 Outline 视图,它往往会显示 <unnamed> 个我不想显示的节点。

目前节点如下:

上面的所有乱七八糟的事情,如果我做这样的事情:

class TestClass {}
struct TestStruct {}

我预计:

但我真正得到的是:

我真的只是想在我的 Xtext 项目中隐藏 every <unnamed> 节点,因为这对我不希望出现的任何情况都有好处,但是如果不可能,我只是希望隐藏上面的特定节点。我试过文档,但似乎找不到任何关于隐藏特定节点的信息,尤其是当它有多种类型的子节点时

这是我的语法代码:

SourceFile:
    (statements+=TopLevelStatement)*
;

TopLevelStatement:
    statement=(Declaration)
;

Declaration:
    declare=(StructDeclaration|ClassDeclaration)
;

StructDeclaration:
    declare=StructCreator '{' '}' ';'?
;

ClassDeclaration:
    declare=ClassCreator '{' '}' ';'?
;

StructCreator:
    'struct' id=Identifier
;

ClassCreator:
    'class' id=Identifier
;

Identifier:
    ID
;

你可能看了上面的代码会问为什么我不把class和struct creators合二为一,但是我不能。我将为 class 和结构制定更多规则,但我没有添加这些规则,因为它们不会导致问题。

首先我不明白你创建的这个有线对象结构。有什么理由按照你的方式去做吗?

第一步:实施标签提供程序

class MyDslLabelProvider extends DefaultEObjectLabelProvider {

    @Inject
    new(AdapterFactoryLabelProvider delegate) {
        super(delegate);
    }
    // xtext does reflective polymorphic dispatch on params
    def text(StructCreator ele) {
        ele.id
    }

    def text(ClassCreator ele) {
        ele.id
    }

}

第二步:实施大纲树提供程序

class MyDslOutlineTreeProvider extends DefaultOutlineTreeProvider {

    // xtext does reflective polymorphic dispatch on params
    def protected _createChildren(IOutlineNode parentNode, SourceFile modelElement) {
            for (s : modelElement.statements) {
                val firstDecl = s.statement?.declare
                if (firstDecl instanceof StructDeclaration) {
                    val secondDecl = firstDecl.declare
                    if (secondDecl !== null) {
                        createNode(parentNode, secondDecl)
                    }
                } else if (firstDecl instanceof ClassDeclaration) {
                    val secondDecl = firstDecl.declare
                    if (secondDecl !== null) {
                        createNode(parentNode, secondDecl)
                    }
                }

            }
    }

}

选项 0:更改语法和命名约定

SourceFile:
    (statements+=TopLevelStatement)*
;

TopLevelStatement:
    Declaration
;

Declaration:
    StructDeclaration|ClassDeclaration
;

StructDeclaration:
    'struct' name=Identifier '{' '}' ';'?
;

ClassDeclaration:
    'class' name=Identifier '{' '}' ';'?
;

Identifier:
    ID
;