0

私は xtext プロジェクトに取り組んでおり、.xtext ファイルからオブジェクトを生成しています。生成されたオブジェクトの 1 つに新しい属性を追加したいと考えています。http://christiandietrich.wordpress.com/2011/07/22/customizing-xtext-metamodel-inference-using-xtend2/で見 た次のコードは、ObjectValue で一時変数を生成していますが、temp を MyObject 型にしたい.

その方法は?どこでそれについて読むことができますか?

import org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage
import org.eclipse.emf.common.util.BasicEMap$Entry
import org.eclipse.emf.ecore.EClass
import org.eclipse.emf.ecore.EPackage
import org.eclipse.emf.ecore.EcoreFactory
import org.eclipse.emf.ecore.EcorePackage
import org.eclipse.xtext.GeneratedMetamodel
import org.eclipse.xtext.xtext.ecoreInference.IXtext2EcorePostProcessor

class CodeGeneratorClass implements IXtext2EcorePostProcessor {

    override process(GeneratedMetamodel metamodel) {
        metamodel.EPackage.process
    }

    def process(EPackage p) {
        for (c : p.EClassifiers.filter(typeof(EClass))) {
            if (c.name == "ObjectValue") {
                c.handle
            }
        }
    }

    def handle (EClass c) {
    val attr = EcoreFactory::eINSTANCE.createEAttribute
    attr.name = "temp"
    attr.EType = EcorePackage::eINSTANCE.EString
    c.EStructuralFeatures += attr
}
}
4

1 に答える 1

1

最初:または のMyObjectいずれかで記述する必要があります。プレーンな Java オブジェクトではできません。EClassEDataType

MyObjectが an の場合、メソッドEDataTypeに an を追加する必要があります。あなたの方法はほぼ正しいですが、調整する必要があるのは次のとおりです。EAttributehandlehandleEType

attr.EType = MyPackage::eINSTANCE.MyObject

それ以外の場合:MyObjectが の場合、 の代わりに をEClass追加する必要があります。この場合のメソッドは次のようになります。EReferenceEAttributehandle

def handleReference(EClass c){
    val ref = EcoreFactory::eINSTANCE.createEReference
    ref.name = "temp"
    ref.EType = MyPackage::eINSTANCE.MyObject
    c.EStructuralFeatures += ref
}

編集

新しい最小限の EDataType を定義してモデルに接続するには、次のスニペットが機能する必要があります。

def void process(GeneratedMetamodel it){
     // create new dynamic EDataType
     val dataType = EcoreFactory::eINSTANCE.createEDataType => [
        name = 'MyObject'
        instanceTypeName = 'java.package.with.MyObject' 
    ]

    // register new EDataType in own model package
    EPackage.EClassifiers += dataType

    // attach as EAttribute to appropriate EClasses
    EPackage.EClassifiers.filter(typeof(EClass)).filter[name == 'ObjectValue'].forEach[
        EStructuralFeatures += EcoreFactory::eINSTANCE.createEAttribute => [
            name = "temp"
            EType = dataType
        ]
    ]
}
于 2012-10-31T20:33:41.410 に答える