在 Xtext 大纲视图中隐藏父节点
Hide parent nodes in Xtext Outline View
我正在研究 Xtext 解析器,运行 遇到一个问题:使用 Eclipse 的 IDE 插件,特别是 Outline 视图,它往往会显示 <unnamed>
个我不想显示的节点。
目前节点如下:
- SourceFile(只是我当前使用的文件的名称)
- 顶级声明
- 声明
- 结构声明
- 结构创建器
name=Identifier
- 与下面相同的标识符。
- 类声明
- 类创建器
name=Identifier
- 与下面相同的标识符。
- 标识符
- ID(Xtext自带的
terminal
)
上面的所有乱七八糟的事情,如果我做这样的事情:
class TestClass {}
struct TestStruct {}
我预计:
- 源文件
- 测试类
- 测试结构
但我真正得到的是:
- 源文件
<unnamed>
<unnamed>
<unnamed>
<unnamed>
- 测试类
<unnamed>
<unnamed>
<unnamed>
<unnamed>
- 测试结构
我真的只是想在我的 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
;
我正在研究 Xtext 解析器,运行 遇到一个问题:使用 Eclipse 的 IDE 插件,特别是 Outline 视图,它往往会显示 <unnamed>
个我不想显示的节点。
目前节点如下:
- SourceFile(只是我当前使用的文件的名称)
- 顶级声明
- 声明
- 结构声明
- 结构创建器
name=Identifier
- 与下面相同的标识符。
- 结构创建器
- 类声明
- 类创建器
name=Identifier
- 与下面相同的标识符。
- 类创建器
- 结构声明
- 标识符
- ID(Xtext自带的
terminal
)
- ID(Xtext自带的
- 声明
- 顶级声明
上面的所有乱七八糟的事情,如果我做这样的事情:
class TestClass {}
struct TestStruct {}
我预计:
- 源文件
- 测试类
- 测试结构
但我真正得到的是:
- 源文件
<unnamed>
<unnamed>
<unnamed>
<unnamed>
- 测试类
<unnamed>
<unnamed>
<unnamed>
<unnamed>
- 测试结构
我真的只是想在我的 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
;