ここでケースをカバーするスクリーンキャストを参照してください: http://xtextcasts.org/episodes/18-model-optimization
モデルとメタモデルを変更する必要があります。メタモデルを変更するには、ポストプロセッサを定義する必要があります。次のポストプロセッサは、type
属性ディレクトリをVariable
クラスに追加します。
詳細については、http: //christiandietrich.wordpress.com/tag/postprocessor/を参照してください。
class MyXtext2EcorePostProcessor implements IXtext2EcorePostProcessor {
override process(GeneratedMetamodel metamodel) {
metamodel.EPackage.process
}
def process(EPackage p) {
for (clazz : p.EClassifiers.filter(typeof(EClass))) {
if (clazz.name == typeof(Variable).simpleName) {
val typeAttribute = EcoreFactory::eINSTANCE.createEAttribute
typeAttribute.name = "type"
typeAttribute.EType = EcorePackage::eINSTANCE.EString
clazz.EStructuralFeatures += typeAttribute
}
}
}
}
次に、次のように拡張してバインドする必要がありますGenerator
。
public class ExtendedGenerator extends Generator {
public ExtendedGenerator() {
new XtextStandaloneSetup() {
@Override
public Injector createInjector() {
return Guice.createInjector(new XtextRuntimeModule() {
@Override
public Class<? extends IXtext2EcorePostProcessor>
bindIXtext2EcorePostProcessor() {
return MyXtext2EcorePostProcessor.class;
}
});
}
}.createInjectorAndDoEMFRegistration();
}
}
最後ExtendedGenerator
に、mwe2-workflow で new を使用します。
...
Workflow {
...
bean = StandaloneSetup {
...
component = postprocessor.ExtendedGenerator { // Set ExtendedGenerator!
...
}
...
}
...
}
...
次に、新しいtype
属性にデータを入力する必要があります。インターフェイスを実装して実行できIDerivedStateComputer
ます。
class MyDerivedStateComputer implements IDerivedStateComputer {
override discardDerivedState(DerivedStateAwareResource resource) {
resource.allContents.filter(typeof(VariableDefinition)).forEach [
type = null
]
}
override installDerivedState(DerivedStateAwareResource resource,
boolean preLinkingPhase) {
resource.allContents.filter(typeof(VariableDefinition)).forEach [
type = (eContainer as DefinitionBlock).type
]
}
}
次に、このようにバインドする必要があります (2 番目と 3 番目のバインド方法は、非 Xbase プロジェクトにのみ必要です)。
public class MyDslRuntimeModule extends AbstractMyDslRuntimeModule {
public Class<? extends IDerivedStateComputer> bindIDerivedStateComputer() {
return MyDerivedStateComputer.class;
}
// Not needed for Xbase-projects
@Override
public Class<? extends XtextResource> bindXtextResource() {
return DerivedStateAwareResource.class;
}
// Not needed for Xbase-projects
public Class<? extends IResourceDescription.Manager>
bindIResourceDescriptionManager() {
return DerivedStateAwareResourceDescriptionManager.class;
}
}
さらに進んで、ニーズに合わせてその場でモデルを再構築できます。そこまで行った場合に備えて、ソリューションを別の回答としてここに投稿してください。