java - 在 Xtext 大纲 View 中隐藏父节点

标签 java eclipse eclipse-plugin xtext

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

目前节点如下:

  • SourceFile(只是我当前使用的文件的名称)
    • 顶级声明
      • 声明
        • 结构声明
          • 结构创建器
            • name=Identifier - 与下面相同的标识符。
        • 类声明
          • 类创建者
            • name=Identifier - 与下面相同的标识符。
      • 标识符
        • ID(Xtext 附带的 terminal)

面对上面的所有困惑,如果我做如下事情:

class TestClass {}
struct TestStruct {}

我期望:

  • 源文件
    • 测试类
    • 测试结构

但是我真正得到的是:

  • 源文件
    • <unnamed>
      • <unnamed>
        • <unnamed>
          • <unnamed>
            • 测试类
    • <unnamed>
      • <unnamed>
        • <unnamed>
          • <unnamed>
            • 测试结构

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

这是我的语法代码:

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
;

关于java - 在 Xtext 大纲 View 中隐藏父节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42732416/

相关文章:

java - Android eclipse - android.jar 在 libs 文件夹和引用的库中重复

java - Eclipse 不将库放入导出的 war 文件中

linux - 多个用户共享时 Linux 上的 Eclipse 行为

java - 将应用程序与 VC++ 应用程序集成

java - 使用 printwriter 创建一个包含列表中多行的文本文件

java - 如何使用将注释写入生成的 XML 的注释来扩展 org.simpleframework.xml

java - Intellij IDEA 项目 View 不像以前那样显示结构。

Mac OS High Sierra 上的 Java 驱动程序 Firebird 2.5

java - 在没有反应堆的情况下按顺序清理/安装多个maven项目

eclipse-plugin - Eclipse 插件开发 : How to add option in Right Click Menu