2012-10-31 2 views
0

xtext 프로젝트에서 작업 중이며 .xtext 파일을 통해 오브젝트를 생성 중입니다. 생성 된 개체 중 하나에 새 특성을 추가하려고합니다. http://christiandietrich.wordpress.com/2011/07/22/customizing-xtext-metamodel-inference-using-xtend2/ 다음 코드는 ObjectValue 에 임시 변수를 생성하지만 temp는 MyObject 유형이어야합니다.xtend 프로젝트에서 xtend로 코드 생성

어떻게 그렇게합니까? 그것에 대해 읽을 수있는 곳은 어디입니까? 우선

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 
} 
} 

답변

1

: MyObjectEClass 또는 EDataType 의해 어느 설명한다. 일반 Java 객체는이를 수행하지 않습니다.

MyObjectEDataType 인 경우 handle 방법에 EAttribute을 추가해야합니다. 귀하의 handle 방법은 거의 바로 만 EType 조정해야한다 :

attr.EType = MyPackage::eINSTANCE.MyObject 

그렇지 않으면 : MyObjectEClass의 경우, 당신은 대신 EAttributeEReference를 추가해야합니다. 이 경우의 handle 방법은 다음과 같습니다

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 
     ] 
    ] 
} 
+0

위대한! 고맙습니다! 내 객체를 EDataType으로 어떻게 만들 수 있습니까? –

+0

@DanaKlein : 흠. 'EDataType'을 정의하는 몇 가지 방법이 있습니다. 그리고'EDataType'이 실제로 옳은지 아닌지는 또 하나의 질문입니다. 쉽고 간단한 것들을 위해서'EcorePackage'에서 미리 정의 된 것을 사용할 수 있습니다 -'EDataType'을 반환하는 모든'getXyz' 메소드. 자신의 EDataType을 실제로 정의하려면 먼저 EMF에 대한 책을 참조해야합니다. –

+0

고마워요! Iterator 객체를 반환 할 수 있습니까? s.t. 생성 된 코드는 다음과 같을 것입니다 : public Iterator getIterator() {} –