我正在开发 Xtext 解析器,但遇到了一个问题:使用 Eclipse 的 IDE 插件,特别是 Outline View ,它往往会显示 <unnamed>
节点,我不想显示这些节点。
目前节点如下:
- SourceFile(只是我当前使用的文件的名称)
- 顶级声明
- 声明
- 结构声明
- 结构创建器
-
name=Identifier
- 与下面相同的标识符。
-
- 结构创建器
- 类声明
- 类创建者
-
name=Identifier
- 与下面相同的标识符。
-
- 类创建者
- 结构声明
- 标识符
- ID(Xtext 附带的
terminal
)
- ID(Xtext 附带的
- 声明
- 顶级声明
面对上面的所有困惑,如果我做如下事情:
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/