我正在使用带有MWE 1和XPand的Xtext 2.0,但我想MWE 2和XTend的问题完全相同。
我的Xtext语法看起来像这样(摘录):
grammer org.test.Test with org.eclipse.xtext.common.Terminals
generate test "http://www.test.org/test/Test
Model :
"COMMON STUFF"
"{"
(formatterDefs+=FormatterDef)*
"}"
...
FormatterDef : "Formatter" name=ID ":" formatter=STRING;
当我使用这个mwe definiton(摘录)时:
<component class="org.eclipse.xtext.mwe.Reader" path="${project.src.directory}/xtext/model/" >
<register class="org.test.TestStandaloneSetup"/>
<load slot='formatterDefs' type='FormatterDef'/>
</component>
<component class="org.eclipse.xpand2.Generator">
<metaModel class="org.eclipse.xtend.typesystem.emf.EmfRegistryMetaModel"/>
<expand value="templates::Formatter::formatterTxt FOREACH formatterDefs"/>
</component>
因此插槽formatterDefs
填充了所有FormaterDef
,然后将其用于模板,每个思路都可以正常工作。
但我有一些模板需要模型根元素,在语法中名为Model
。所以我尝试使用
<load slot='formatterDefs' type='FormatterDef'/>
和
<expand value="templates::Main::main FOREACH model"/>
代替。
但后来我收到了这个警告:
org.eclipse.xtext.mwe.SlotEntry - 找不到任何类型为'Model'的导出元素 - &gt;插槽'模型'是空的。
插槽包含一个空列表。
所以我的问题是:我需要做什么才能将根Model
纳入我的模板?
答案 0 :(得分:1)
您可以自定义IQualifiedNameProvider以为模型命名。
〜基督教
答案 1 :(得分:1)
我的意思是
public class MyDslNameProvider extends DefaultDeclarativeQualifiedNameProvider {
QualifiedName qualifiedName(Model m) {
return QualifiedName.create(m.eResource().getURI().toString());
}
}
public class MyDslRuntimeModule extends
org.xtext.example.mydsl.AbstractMyDslRuntimeModule {
@Override
public Class<? extends IQualifiedNameProvider> bindIQualifiedNameProvider() {
return MyDslNameProvider.class;
}
}
答案 2 :(得分:1)
可能最好的方法是在规则的开头插入文本{Model}
,以确保创建。
答案 3 :(得分:0)
解决方案是在模型的Grammer Definiton中添加ID。
Model : name = ID
"COMMON STUFF"
"{"
(formatterDefs+=FormatterDef)*
"}"
我知道之前没有现有的Model元素,因此在添加ID之后,必须创建Model元素以包含Id。
怎么可能有更好的解决方案 - 我会在发布后立即接受。