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

当前,节点如下:


SourceFile(仅是我当前正在使用的文件的名称)


顶层声明


宣布


结构声明


StructCreator


name=Identifier-相同的标识符,如下所示。


类声明


类创建者


name=Identifier-相同的标识符,如下所示。



识别码


ID(Xtext随附的terminal





考虑到上面所有的混乱,如果我做这样的事情:

class TestClass {}
struct TestStruct {}


我期望:


源文件


测试类
测试结构



但是我真正得到的是:


源文件


<unnamed>


<unnamed>


<unnamed>


<unnamed>


测试类




<unnamed>


<unnamed>


<unnamed>


<unnamed>


测试结构







我真的只想隐藏我的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
;


您可能会看上面的代码,并问为什么我不将类和结构创建者合并为一个,但我不能。对于类和结构,我将有更多规则,我没有添加,因为它们不会导致问题。

最佳答案

首先,我不理解您创建的这种有线对象结构。有什么理由可以像您那样做吗?

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

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
;

10-05 22:08