【发布时间】:2017-07-26 18:46:19
【问题描述】:
我目前有一个 xtext 语法,如下所示:
Features:
'feature' name = ID
'{'(
('action' '{' action+=Actions (',' action+=Actions)* '}')? &
('dependencies' '{' dependencies = Dependencies '}')? &
('children' '{' children = Children '}')?
)'}'
;
我想要做的是以编程方式向已经存在的源文件添加一个动作,因为我正在使用 IUnitOfWork.Void 类,我将其子类化以便于实现,它目前看起来像这样(它的有意义的部分) :
final XtextEditor editor = (XtextEditor)sourcepart;
final IXtextDocument document = editor.getDocument();
document.modify(new IUnitOfWork.Void<XtextResource>(){
public void process (XtextResource resource) throws Exception {
IParseResult parseResult = resource.getParseResult();
if(parseResult ==null)
return;
CompositeNode rootNode=(CompositeNode) parseResult.getRootNode();
LeafNode node = (LeafNode)NodeModelUtils.findLeafNodeAtOffset(rootNode, 0);
EObject object =NodeModelUtils.findActualSemanticObjectFor(node);
通过这个我遍历模型的树并到达我想要添加操作的特征对象(这是通过我正在实现的自定义树视图中的弹出菜单完成的)
这是我的问题:每当我想添加一个动作时,它会破坏标签在源文件中的放置方式,我的意思是,而不是:
action {
act1.set (foo),
act2.set (bar),
act3.set (baz),
act4.set (booze) //where this is the new action that I add
}
它会将其添加为
action {
act1.set (foo),
act2.set (bar),
act3.set (baz)
}
action {
act4.set(booze)
}
根据我的语法规则,这是非法的,我不能改变它应该写的方式。 (我可以对规则的实施方式进行一些小改动,但我真的很想避免它,因为这将意味着重新实施依赖于它们的其他事情的全新工作量)
我试过了:
- 直接通过Features.getAction().add(*新动作)添加;
- 使用 toArray() 方法将列表中的项目复制到数组中以避免引用,将我的操作添加到数组中,清除列表然后再次将所有元素一一添加
- 创建一个全新的功能对象并将其中的所有内容设置为与当前编辑的对象相同,然后用新的功能替换该功能
在那之后我就没有想法了。令人沮丧的是,第三种方法适用于我语法中的另一种对象,并且没有错误。 我怎样才能做到这一点?
【问题讨论】: