如何配置Xtext mwe.Reader以填充插槽中的根元素

时间:2011-10-12 09:02:45

标签: xtext xpand mwe

我正在使用带有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纳入我的模板?

4 个答案:

答案 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。

怎么可能有更好的解决方案 - 我会在发布后立即接受。