我正在使用Xtext解析器,但遇到了一个问题:使用Eclipse的IDE插件,特别是Outline视图,它倾向于显示<unnamed>
节点,而我不想显示。
当前,节点如下:
SourceFile(仅是我当前正在使用的文件的名称)
顶层声明
宣布
结构声明
StructCreatorname=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
;