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

时间:2017-03-11 07:07:18

标签: java eclipse eclipse-plugin xtext

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

目前,节点如下:

  • SourceFile(只是我目前正在使用的文件的名称)
    • TopLevelStatement
      • 声明
        • StructDeclaration
          • StructCreator
            • name=Identifier - 与下面相同的标识符。
        • ClassDeclaration
          • ClassCreator
            • name=Identifier - 与下面相同的标识符。
      • 标识符
        • ID(Xtext附带的terminal

如果我做了以下所有事情,如果我做了以下事情:

class TestClass {}
struct TestStruct {}

我希望:

  • 的SourceFile
    • 识别TestClass
    • TestStruct

但我真正得到的是这样的:

  • 的SourceFile
    • <unnamed>
      • <unnamed>
        • <unnamed>
          • <unnamed>
            • 识别TestClass
    • <unnamed>
      • <unnamed>
        • <unnamed>
          • <unnamed>
            • TestStruct

我真的只想在我的Xtext项目中隐藏每个 <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
;

您可以查看上面的代码并询问我为什么不将类和结构创建者合并为一个,但我不能。我还要为课程和结构制定更多规则,我还没有补充,因为他们没有为这个问题做出贡献。

1 个答案:

答案 0 :(得分:3)

首先,我不了解您创建的这种有线对象结构。有没有理由这样做?

第一步:实施标签提供者

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
;