以编程方式将源代码添加到自定义 DSL 文件的问题
Issues adding source code to a custom DSL file programatically
我目前的 xtext 语法如下所示:
Features:
'feature' name = ID
'{'(
('action' '{' action+=Actions (',' action+=Actions)* '}')? &
('dependencies' '{' dependencies = Dependencies '}')? &
('children' '{' children = Children '}')?
)'}'
;
我想做的是以编程方式向一个已经存在的源文件添加一个动作,因为我使用 IUnitOfWork.Void class 我子 class 更容易实现,它目前看起来像这样(它的有意义的部分):
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() 方法将列表中的项目复制到数组中以避免引用,将我的操作添加到数组中,清除列表,然后再次一个一个地添加所有元素
- 创建一个全新的 Features 对象并将其中的所有内容设置为与当前编辑的相同,然后用新的替换该特征
然后我就没主意了。令人沮丧的是,第三种方法适用于我语法中的另一种对象,并且没有错误。
我怎样才能完成这项工作?
这是 xtext 中的错误。 (请问您可以提交一张票吗?)
作为解决方法,您可以使用以下
Features:
'feature' name = ID
'{'(
('action' '{' actionList=ActionList '}')? &
('dependencies' '{' dependencies = Dependencies '}')? &
('children' '{' children = Children '}')?
)'}';
ActionList:
(action+=Action (',' action+=Action)*)
;
我目前的 xtext 语法如下所示:
Features:
'feature' name = ID
'{'(
('action' '{' action+=Actions (',' action+=Actions)* '}')? &
('dependencies' '{' dependencies = Dependencies '}')? &
('children' '{' children = Children '}')?
)'}'
;
我想做的是以编程方式向一个已经存在的源文件添加一个动作,因为我使用 IUnitOfWork.Void class 我子 class 更容易实现,它目前看起来像这样(它的有意义的部分):
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() 方法将列表中的项目复制到数组中以避免引用,将我的操作添加到数组中,清除列表,然后再次一个一个地添加所有元素
- 创建一个全新的 Features 对象并将其中的所有内容设置为与当前编辑的相同,然后用新的替换该特征
然后我就没主意了。令人沮丧的是,第三种方法适用于我语法中的另一种对象,并且没有错误。 我怎样才能完成这项工作?
这是 xtext 中的错误。 (请问您可以提交一张票吗?) 作为解决方法,您可以使用以下
Features:
'feature' name = ID
'{'(
('action' '{' actionList=ActionList '}')? &
('dependencies' '{' dependencies = Dependencies '}')? &
('children' '{' children = Children '}')?
)'}';
ActionList:
(action+=Action (',' action+=Action)*)
;