Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Modeling » TMF (Xtext) » Compute another type from inferredType
Compute another type from inferredType [message #1765092] Tue, 06 June 2017 14:02 Go to next message
anil chalil is currently offline anil chalilFriend
Messages: 38
Registered: October 2010
Member
Hi all,

In my dsl, I am trying to generate a pojo and corresponding serializer. I have statement like "emit(a,b,c)". For this statement I should generate:
(Suppose a:int b:int and c:String and their type calculated with a.inferredType)
Class Foo{
public int a;
public int b;
public String c;
}

Class FooSerializer{
public IntSerializer a=IntSerializer.Instance;
public IntSerializer b=IntSerializer.Instance;
public StringSerializer c=StringSerializer.Instance;
}

It is easy to generate Foo with model inferrer but for FooSerializer it become problematic since I should make some kind of lookup int=>IntSerializer. I am using 2.12 and my dsl is based on Xbase.

Thanks in advance
Re: Compute another type from inferredType [message #1765100 is a reply to message #1765092] Tue, 06 June 2017 15:23 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14665
Registered: July 2009
Senior Member
What is your problem with the lookup?

Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
Re: Compute another type from inferredType [message #1765108 is a reply to message #1765100] Tue, 06 June 2017 17:53 Go to previous messageGo to next message
anil chalil is currently offline anil chalilFriend
Messages: 38
Registered: October 2010
Member
Hi Christian,

Maybe i should give a pseudo code example. Suppose that this is my dsl:
val a=1
val b=2
val c= "Hello" + a
emit(a,b,c)


For the above emit expression i should generate
Class Foo{
public int a;
public int b;
public String c;
}

Class FooSerializer{ 
public IntSerializer a=IntSerializer.Instance;
public IntSerializer b=IntSerializer.Instance;
public StringSerializer c=StringSerializer.Instance;
}


I tried to do this in IJvmModelInferrer like:
def dispatch void infer(EmitExpression emit,IJvmDeclaredTypeAcceptor acceptor, boolean isPreIndexingPhase){
        acceptor.accept(emit.toClass("Foo")) [
			final = true
			// we could remove that preindexing checking since it is a late init
			members += emit.parameters.map [ xpr |
			    emit.toField(xpr.toString, xpr.inferredType)
            ]
		]
        acceptor.accept(emit.toClass("FooSerializer")) [
			final = true
			// we could remove that preindexing checking since it is a late init
			members += emit.parameters.map [ xpr |
			    emit.toField(xpr.toString, serializerName(xpr.inferredType.simpleName).inferredType)
            ]
		]
}


"serializerName(xpr.inferredType.simpleName)" this does not work it says java.lang.IllegalStateException: equivalent could not be computed. I understand i throws this exception
since 'xpr.inferredType' not used anywhere but i need also some typename (int,String eg) to generate serializer name.Could you recommend any other strategy ? Probably i am doing something wrong



Re: Compute another type from inferredType [message #1765110 is a reply to message #1765108] Tue, 06 June 2017 18:28 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14665
Registered: July 2009
Senior Member
Hi,

infortunately you dont share complete code.
this forces me to "guess". and i am a bad guesser.

(i have no idea what the construct if and what the var/val stuff is inferred to)

and the terms look like "xexpression" but you infer stuff from it. that makes me wonder....
shouldnt that become some inline code? or some runtime api code?

and maybe you should consider a different structure of code and stuff




Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
Re: Compute another type from inferredType [message #1765111 is a reply to message #1765110] Tue, 06 June 2017 18:31 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14665
Registered: July 2009
Senior Member
e.g what about a model like

val a=1
val b=2
val c= "Hello" + a
emit(a,b,c)
emit(a,b,c)
emit(a,b,c)


Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
Re: Compute another type from inferredType [message #1765133 is a reply to message #1765111] Tue, 06 June 2017 22:11 Go to previous messageGo to next message
anil chalil is currently offline anil chalilFriend
Messages: 38
Registered: October 2010
Member
Hi Christian,
You are not a bad guesser. I am bad at explaining :). Thank you for your patiance and help.

I attached my project. What actually i am trying to do is generating a valid apache flink job. In my model i have source,operator and sink entities. Source could be an input for operator,operator could be an input for another operator or an sink. Sink is a terminal like entity.Current flatmap operator entity corresponds to apache flink FlatmapFunction. Operator entity body is a XBlockExpression. I just override XPrimaryExpression to allow emit expression like this
@ Override XPrimaryExpression returns XExpression:
	{EmitExpression} 'emit' '(' (columns+=XsprColumn (',' columns+=XsprColumn)*) ')' |
	super;

terminal CREGEX:
	'/' !('\n' | '\r' | '/')+ '/';

XsprColumn returns XExpression:
	{ExpressionColumn} xpr=XExpression ('named' name=ID)? |
	{RegExColumn} regex=CREGEX;


With every emit expression i am generating a Pojo which corresponds to a row and in the body of flatmap function i am generating java expressions like this (row is input deneme2Row generated from emit expression):
			    deneme2Row _row = new deneme2Row();
			    _row.ageplus = ((row.age).intValue() + 1);
			    collector.out(_row);


Just to improve performance i want to generate a deneme2RowSerializer as well to improve performance.

Currently i am not checking whether two emit statement inside same operator have same structure but i will. So currently:
emit(a,b)
emit(a,b,c)

is allowed but it will be a validation error since one statement have two and other one
have three columns.

I thought that i can generate row like Pojo just by looking xexpressions inside an emit expression like "emit(a,b,c)". And It worked quite well since i just took "a.inferredType" JvmTypeReference and assing it to my pojo as a field type. There is no need to resolve type. But with serializer it is different. It will be a different pojo with serializer fields corresponds to my row like pojo(for and int field in row pojo serializer pojo will have IntSerializer field). I believe either i have to resolve "a.inferredType" and then lookup its serializer or i should transform 'a.inferredType' to my serializer type without resolving if i want to do that job inside IJvmModelInferrer. Or should i modify JvmModelGenerator?
Re: Compute another type from inferredType [message #1765134 is a reply to message #1765133] Tue, 06 June 2017 22:13 Go to previous messageGo to next message
anil chalil is currently offline anil chalilFriend
Messages: 38
Registered: October 2010
Member
In the mean time you can look at HDslParsingTest in henkan.dsl.parent/henkan.dsl/src/test/java/henkan/dsl/tests/ for what i am trying to accomplish.
Re: Compute another type from inferredType [message #1765167 is a reply to message #1765134] Wed, 07 June 2017 08:13 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14665
Registered: July 2009
Senior Member
Thanks to Sebastian here is an inferrer for Domain Model example that does the thing

package org.eclipse.xtext.example.domainmodel.jvmmodel

import com.google.inject.Inject
import org.eclipse.xtext.common.types.JvmField
import org.eclipse.xtext.common.types.JvmOperation
import org.eclipse.xtext.common.types.TypesFactory
import org.eclipse.xtext.example.domainmodel.domainmodel.Entity
import org.eclipse.xtext.example.domainmodel.domainmodel.Operation
import org.eclipse.xtext.example.domainmodel.domainmodel.Property
import org.eclipse.xtext.naming.IQualifiedNameProvider
import org.eclipse.xtext.xbase.jvmmodel.AbstractModelInferrer
import org.eclipse.xtext.xbase.jvmmodel.IJvmDeclaredTypeAcceptor
import org.eclipse.xtext.xbase.jvmmodel.IJvmModelAssociations
import org.eclipse.xtext.xbase.jvmmodel.JvmTypesBuilder
import org.eclipse.xtext.xbase.lib.Procedures.Procedure1
import org.eclipse.xtext.xbase.typesystem.util.AbstractReentrantTypeReferenceProvider
import org.eclipse.xtext.xtype.XComputedTypeReference
import org.eclipse.xtext.xtype.XtypeFactory
import org.eclipse.xtext.xtype.impl.XComputedTypeReferenceImplCustom

class DomainmodelJvmModelInferrer extends AbstractModelInferrer {
	
	@Inject extension JvmTypesBuilder
	@Inject extension IQualifiedNameProvider
	@Inject extension IJvmModelAssociations

	def dispatch infer(Entity entity, extension IJvmDeclaredTypeAcceptor acceptor, boolean prelinkingPhase) {
		accept(entity.toClass( entity.fullyQualifiedName )) [
			documentation = entity.documentation
			if (entity.superType !== null)
				superTypes += entity.superType.cloneWithProxies
			
			// let's add a default constructor
			members += entity.toConstructor []
			
			// and one which can be called with a lambda for initialization.
			val procedureType = typeRef(Procedure1, typeRef(it)) /* Procedure<MyEntity> */ 
			members += entity.toConstructor [
				parameters += entity.toParameter("initializer", procedureType)
				// here we implement the body using black box Java code.
				body = '''
					initializer.apply(this);
				'''
			]
			
			// now let's go over the features
			for ( f : entity.features ) {
				switch f {
			
					// for properties we create a field, a getter and a setter
					Property : {
						val field = f.toField(f.name, f.type)
						members += field
						members += f.toGetter(f.name, f.type)
						members += f.toSetter(f.name, f.type)
					}
			
					// operations are mapped to methods
					Operation : {
						members += f.toMethod(f.name, f.type ?: inferredType) [
							documentation = f.documentation
							for (p : f.params) {
								parameters += p.toParameter(p.name, p.parameterType)
							}
							// here the body is implemented using a user expression.
							// Note that by doing this we set the expression into the context of this method, 
							// The parameters, 'this' and all the members of this method will be visible for the expression. 
							body = f.body
						]
					}
				}
			}
			
			// finally we want to have a nice toString methods.
			members += entity.toToStringMethod(it)
		]
		accept(entity.toClass( entity.fullyQualifiedName + 'Serializer' )) [
			// now let's go over the features
			for ( f : entity.features ) {
				switch f {
					// for properties we create a field, a getter and a setter
					Property : {
						val field = f.toField(f.name + 'Serializer', XtypeFactory.eINSTANCE.createXComputedTypeReference)
						val fieldType = field.type as XComputedTypeReference
						fieldType.typeProvider = new AbstractReentrantTypeReferenceProvider() {
							override protected doGetTypeReference(XComputedTypeReferenceImplCustom context) {
								var fieldFromPrimaryClass = f.getPrimaryJvmElement as JvmField
								var simpleName = fieldFromPrimaryClass.type.simpleName
								// replace by type lookup
								var result = TypesFactory.eINSTANCE.createJvmUnknownTypeReference();
								result.qualifiedName = 'serializers.' + simpleName + 'Serializer';
								return result
							}
						} 
						field.static = true;
						field.final = true;
						field.initializer = '''null''';
						members += field
						
					}
					Operation case f.name.startsWith('emit'): {
						val field = f.toField(f.name + 'Serializer', XtypeFactory.eINSTANCE.createXComputedTypeReference)
						val fieldType = field.type as XComputedTypeReference
						fieldType.typeProvider = new AbstractReentrantTypeReferenceProvider() {
							override protected doGetTypeReference(XComputedTypeReferenceImplCustom context) {
								var fieldFromPrimaryClass = f.getPrimaryJvmElement as JvmOperation
								var simpleName = fieldFromPrimaryClass.returnType.simpleName
								// replace by type lookup
								var result = TypesFactory.eINSTANCE.createJvmUnknownTypeReference();
								result.qualifiedName = 'serializers.' + simpleName + 'Serializer';
								return result
							}
						}
						field.static = true;
						field.final = true;
						field.initializer = '''null''';
						members += field
					}
				}
			}
		]
	}
	
}


Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
Re: Compute another type from inferredType [message #1765182 is a reply to message #1765167] Wed, 07 June 2017 10:24 Go to previous messageGo to next message
anil chalil is currently offline anil chalilFriend
Messages: 38
Registered: October 2010
Member
Hi Christian,

I implemented serializers thanks to your feedback. But sometimes i got this exception:

java.lang.UnsupportedOperationException: TODO: import a functional handle on the type resolution that delegates to the best available (current, but evolving) result
at org.eclipse.xtext.xbase.typesystem.internal.DefaultReentrantTypeResolver.reentrantResolve(DefaultReentrantTypeResolver.java:133)
at org.eclipse.xtext.xbase.typesystem.internal.CompoundReentrantTypeResolver.getDelegate(CompoundReentrantTypeResolver.java:108)
at org.eclipse.xtext.xbase.typesystem.internal.CompoundReentrantTypeResolver.getDelegate(CompoundReentrantTypeResolver.java:161)
at org.eclipse.xtext.xbase.typesystem.internal.CompoundReentrantTypeResolver.getActualType(CompoundReentrantTypeResolver.java:153)
at org.eclipse.xtext.xbase.typesystem.internal.ForwardingResolvedTypes.getActualType(ForwardingResolvedTypes.java:40)
at org.eclipse.xtext.xbase.typesystem.internal.LogicalContainerAwareReentrantTypeResolver$DemandTypeReferenceProvider.doGetTypReferenceWithAnotherTypeReference(LogicalContainerAwareReentrantTypeResolver.java:200)
at org.eclipse.xtext.xbase.typesystem.internal.LogicalContainerAwareReentrantTypeResolver$DemandTypeReferenceProvider.doGetTypeReference(LogicalContainerAwareReentrantTypeResolver.java:192)
at org.eclipse.xtext.xbase.typesystem.util.AbstractReentrantTypeReferenceProvider.getTypeReference(AbstractReentrantTypeReferenceProvider.java:28)
at org.eclipse.xtext.xtype.impl.XComputedTypeReferenceImplCustom.getEquivalent(XComputedTypeReferenceImplCustom.java:46)
at org.eclipse.xtext.common.types.impl.JvmSpecializedTypeReferenceImplCustom.getSimpleName(JvmSpecializedTypeReferenceImplCustom.java:59)
at org.eclipse.xtext.common.types.impl.JvmSpecializedTypeReferenceImplCustom.getSimpleName(JvmSpecializedTypeReferenceImplCustom.java:61)
at henkan.dsl.jvmmodel.HDslJvmModelInferrer$20$1.doGetTypeReference(HDslJvmModelInferrer.java:536)
at org.eclipse.xtext.xbase.typesystem.util.AbstractReentrantTypeReferenceProvider.getTypeReference(AbstractReentrantTypeReferenceProvider.java:28)
at org.eclipse.xtext.xtype.impl.XComputedTypeReferenceImplCustom.getEquivalent(XComputedTypeReferenceImplCustom.java:46)
at org.eclipse.xtext.xbase.typesystem.references.LightweightTypeReferenceFactory.doVisitComputedTypeReference(LightweightTypeReferenceFactory.java:165)
at org.eclipse.xtext.xbase.typesystem.references.LightweightTypeReferenceFactory.doVisitComputedTypeReference(LightweightTypeReferenceFactory.java:52)
at org.eclipse.xtext.xtype.impl.XComputedTypeReferenceImplCustom.accept(XComputedTypeReferenceImplCustom.java:27)
at org.eclipse.xtext.common.types.util.AbstractTypeReferenceVisitor.visit(AbstractTypeReferenceVisitor.java:34)
at org.eclipse.xtext.xbase.typesystem.references.LightweightTypeReferenceFactory.toLightweightReference(LightweightTypeReferenceFactory.java:83)
at org.eclipse.xtext.xbase.typesystem.references.StandardTypeReferenceOwner.toLightweightTypeReference(StandardTypeReferenceOwner.java:117)
at org.eclipse.xtext.xbase.typesystem.internal.LogicalContainerAwareReentrantTypeResolver._doPrepare(LogicalContainerAwareReentrantTypeResolver.java:538)
at org.eclipse.xtext.xbase.typesystem.internal.LogicalContainerAwareReentrantTypeResolver.doPrepare(LogicalContainerAwareReentrantTypeResolver.java:463)
at org.eclipse.xtext.xbase.typesystem.internal.LogicalContainerAwareReentrantTypeResolver.prepareMembers(LogicalContainerAwareReentrantTypeResolver.java:500)
at org.eclipse.xtext.xbase.typesystem.internal.LogicalContainerAwareReentrantTypeResolver._doPrepare(LogicalContainerAwareReentrantTypeResolver.java:471)
at org.eclipse.xtext.xbase.typesystem.internal.LogicalContainerAwareReentrantTypeResolver.doPrepare(LogicalContainerAwareReentrantTypeResolver.java:459)
at org.eclipse.xtext.xbase.typesystem.internal.LogicalContainerAwareReentrantTypeResolver.prepare(LogicalContainerAwareReentrantTypeResolver.java:409)
at org.eclipse.xtext.xbase.typesystem.internal.LogicalContainerAwareReentrantTypeResolver.computeTypes(LogicalContainerAwareReentrantTypeResolver.java:696)
at org.eclipse.xtext.xbase.typesystem.internal.DefaultReentrantTypeResolver.resolve(DefaultReentrantTypeResolver.java:163)
at org.eclipse.xtext.xbase.typesystem.internal.DefaultReentrantTypeResolver.reentrantResolve(DefaultReentrantTypeResolver.java:139)
at org.eclipse.xtext.xbase.typesystem.internal.CompoundReentrantTypeResolver.reentrantResolve(CompoundReentrantTypeResolver.java:79)
at org.eclipse.xtext.xbase.typesystem.internal.CachingBatchTypeResolver$LazyResolvedTypes.resolveTypes(CachingBatchTypeResolver.java:80)
at org.eclipse.xtext.xbase.typesystem.internal.CachingBatchTypeResolver$2.process(CachingBatchTypeResolver.java:57)
at org.eclipse.xtext.xbase.typesystem.internal.CachingBatchTypeResolver$2.process(CachingBatchTypeResolver.java:53)
at org.eclipse.xtext.util.concurrent.IUnitOfWork$Void.exec(IUnitOfWork.java:37)
at org.eclipse.xtext.util.OnChangeEvictingCache.execWithoutCacheClear(OnChangeEvictingCache.java:129)
at org.eclipse.xtext.xbase.typesystem.internal.CachingBatchTypeResolver.doResolveTypes(CachingBatchTypeResolver.java:53)
at org.eclipse.xtext.xbase.typesystem.internal.AbstractBatchTypeResolver.resolveTypes(AbstractBatchTypeResolver.java:69)
at org.eclipse.xtext.xbase.typesystem.internal.AbstractBatchTypeResolver.resolveTypes(AbstractBatchTypeResolver.java:55)
at org.eclipse.xtext.xbase.typesystem.internal.LogicalContainerAwareReentrantTypeResolver$DemandTypeReferenceProvider.doGetTypReferenceWithAnotherTypeReference(LogicalContainerAwareReentrantTypeResolver.java:199)
at org.eclipse.xtext.xbase.typesystem.internal.LogicalContainerAwareReentrantTypeResolver$DemandTypeReferenceProvider.doGetTypeReference(LogicalContainerAwareReentrantTypeResolver.java:192)
at org.eclipse.xtext.xbase.typesystem.util.AbstractReentrantTypeReferenceProvider.getTypeReference(AbstractReentrantTypeReferenceProvider.java:28)
at org.eclipse.xtext.xtype.impl.XComputedTypeReferenceImplCustom.getEquivalent(XComputedTypeReferenceImplCustom.java:46)
at org.eclipse.xtext.xbase.typesystem.references.LightweightTypeReferenceFactory.doVisitComputedTypeReference(LightweightTypeReferenceFactory.java:165)
at org.eclipse.xtext.xbase.typesystem.references.LightweightTypeReferenceFactory.doVisitComputedTypeReference(LightweightTypeReferenceFactory.java:52)
at org.eclipse.xtext.xtype.impl.XComputedTypeReferenceImplCustom.accept(XComputedTypeReferenceImplCustom.java:27)
at org.eclipse.xtext.common.types.util.AbstractTypeReferenceVisitor.visit(AbstractTypeReferenceVisitor.java:34)
at org.eclipse.xtext.common.types.util.AbstractTypeReferenceVisitor.doVisitSpecializedTypeReference(AbstractTypeReferenceVisitor.java:50)
at org.eclipse.xtext.xtype.util.AbstractXtypeReferenceVisitor.doVisitComputedTypeReference(AbstractXtypeReferenceVisitor.java:26)
at org.eclipse.xtext.xbase.typesystem.references.LightweightTypeReferenceFactory.doVisitComputedTypeReference(LightweightTypeReferenceFactory.java:168)
at org.eclipse.xtext.xbase.typesystem.references.LightweightTypeReferenceFactory.doVisitComputedTypeReference(LightweightTypeReferenceFactory.java:52)
at org.eclipse.xtext.xtype.impl.XComputedTypeReferenceImplCustom.accept(XComputedTypeReferenceImplCustom.java:27)
at org.eclipse.xtext.common.types.util.AbstractTypeReferenceVisitor.visit(AbstractTypeReferenceVisitor.java:34)
at org.eclipse.xtext.xbase.typesystem.references.LightweightTypeReferenceFactory.toLightweightReference(LightweightTypeReferenceFactory.java:83)
at org.eclipse.xtext.xbase.typesystem.references.StandardTypeReferenceOwner.toLightweightTypeReference(StandardTypeReferenceOwner.java:117)
at org.eclipse.xtext.xbase.typesystem.internal.ResolvedTypes.doGetDeclaredType(ResolvedTypes.java:999)
at org.eclipse.xtext.xbase.typesystem.internal.StackedResolvedTypes.doGetDeclaredType(StackedResolvedTypes.java:279)
at org.eclipse.xtext.xbase.typesystem.internal.ResolvedTypes.doGetActualType(ResolvedTypes.java:962)
at org.eclipse.xtext.xbase.typesystem.internal.ResolvedTypes.getActualType(ResolvedTypes.java:950)
at org.eclipse.xtext.xbase.typesystem.internal.AbstractLinkingCandidate.getDeclaredType(AbstractLinkingCandidate.java:610)
at org.eclipse.xtext.xbase.typesystem.internal.FeatureLinkingCandidate.getDeclaredType(FeatureLinkingCandidate.java:1136)
at org.eclipse.xtext.xbase.typesystem.internal.AbstractLinkingCandidate.applyToComputationState(AbstractLinkingCandidate.java:288)
at org.eclipse.xtext.xbase.typesystem.internal.AbstractTypeComputationState$5.applyToComputationState(AbstractTypeComputationState.java:511)
at org.eclipse.xtext.xbase.typesystem.computation.XbaseTypeComputer._computeTypes(XbaseTypeComputer.java:1091)
at henkan.dsl.jvmmodel.HenkanTypeComputer.computeTypes(HenkanTypeComputer.java:84)
at org.eclipse.xtext.xbase.typesystem.internal.AbstractTypeComputationState.doComputeTypes(AbstractTypeComputationState.java:121)
at org.eclipse.xtext.xbase.typesystem.internal.AbstractTypeComputationState.computeTypes(AbstractTypeComputationState.java:109)
at org.eclipse.xtext.xbase.typesystem.computation.XbaseTypeComputer._computeTypes(XbaseTypeComputer.java:538)
at henkan.dsl.jvmmodel.HenkanTypeComputer.computeTypes(HenkanTypeComputer.java:141)
at org.eclipse.xtext.xbase.typesystem.internal.AbstractTypeComputationState.doComputeTypes(AbstractTypeComputationState.java:121)
at org.eclipse.xtext.xbase.typesystem.internal.AbstractTypeComputationState.computeTypes(AbstractTypeComputationState.java:109)
at org.eclipse.xtext.xbase.typesystem.computation.XbaseTypeComputer._computeTypes(XbaseTypeComputer.java:461)
at henkan.dsl.jvmmodel.HenkanTypeComputer.computeTypes(HenkanTypeComputer.java:90)
at org.eclipse.xtext.xbase.typesystem.internal.AbstractTypeComputationState.doComputeTypes(AbstractTypeComputationState.java:121)
at org.eclipse.xtext.xbase.typesystem.internal.AbstractTypeComputationState.computeTypes(AbstractTypeComputationState.java:109)
at org.eclipse.xtext.xbase.typesystem.internal.AbstractRootTypeComputationState.computeTypes(AbstractRootTypeComputationState.java:32)
at org.eclipse.xtext.xbase.typesystem.internal.LogicalContainerAwareReentrantTypeResolver._computeTypes(LogicalContainerAwareReentrantTypeResolver.java:827)
at org.eclipse.xtext.xbase.typesystem.internal.LogicalContainerAwareReentrantTypeResolver.computeTypes(LogicalContainerAwareReentrantTypeResolver.java:711)
at org.eclipse.xtext.xbase.typesystem.internal.LogicalContainerAwareReentrantTypeResolver.computeMemberTypes(LogicalContainerAwareReentrantTypeResolver.java:897)
at org.eclipse.xtext.xbase.typesystem.internal.LogicalContainerAwareReentrantTypeResolver._computeTypes(LogicalContainerAwareReentrantTypeResolver.java:886)
at org.eclipse.xtext.xbase.typesystem.internal.LogicalContainerAwareReentrantTypeResolver.computeTypes(LogicalContainerAwareReentrantTypeResolver.java:705)
at org.eclipse.xtext.xbase.typesystem.internal.LogicalContainerAwareReentrantTypeResolver.computeTypes(LogicalContainerAwareReentrantTypeResolver.java:697)
at org.eclipse.xtext.xbase.typesystem.internal.DefaultReentrantTypeResolver.resolve(DefaultReentrantTypeResolver.java:163)
at org.eclipse.xtext.xbase.typesystem.internal.DefaultReentrantTypeResolver.reentrantResolve(DefaultReentrantTypeResolver.java:139)
at org.eclipse.xtext.xbase.typesystem.internal.CompoundReentrantTypeResolver.reentrantResolve(CompoundReentrantTypeResolver.java:79)
at org.eclipse.xtext.xbase.typesystem.internal.CachingBatchTypeResolver$LazyResolvedTypes.resolveTypes(CachingBatchTypeResolver.java:80)
at org.eclipse.xtext.xbase.typesystem.internal.CachingBatchTypeResolver$2.process(CachingBatchTypeResolver.java:57)
at org.eclipse.xtext.xbase.typesystem.internal.CachingBatchTypeResolver$2.process(CachingBatchTypeResolver.java:53)
at org.eclipse.xtext.util.concurrent.IUnitOfWork$Void.exec(IUnitOfWork.java:37)
at org.eclipse.xtext.util.OnChangeEvictingCache.execWithoutCacheClear(OnChangeEvictingCache.java:129)
at org.eclipse.xtext.xbase.typesystem.internal.CachingBatchTypeResolver.doResolveTypes(CachingBatchTypeResolver.java:53)
at org.eclipse.xtext.xbase.typesystem.internal.AbstractBatchTypeResolver.resolveTypes(AbstractBatchTypeResolver.java:69)
at org.eclipse.xtext.xbase.typesystem.internal.AbstractBatchTypeResolver.resolveTypes(AbstractBatchTypeResolver.java:55)
at org.eclipse.xtext.xbase.typesystem.internal.LogicalContainerAwareReentrantTypeResolver$DemandTypeReferenceProvider.doGetTypReferenceWithAnotherTypeReference(LogicalContainerAwareReentrantTypeResolver.java:199)
at org.eclipse.xtext.xbase.typesystem.internal.LogicalContainerAwareReentrantTypeResolver$DemandTypeReferenceProvider.doGetTypeReference(LogicalContainerAwareReentrantTypeResolver.java:192)
at org.eclipse.xtext.xbase.typesystem.util.AbstractReentrantTypeReferenceProvider.getTypeReference(AbstractReentrantTypeReferenceProvider.java:28)
at org.eclipse.xtext.xtype.impl.XComputedTypeReferenceImplCustom.getEquivalent(XComputedTypeReferenceImplCustom.java:46)
at org.eclipse.xtext.common.types.impl.JvmSpecializedTypeReferenceImplCustom.getSimpleName(JvmSpecializedTypeReferenceImplCustom.java:59)
at org.eclipse.xtext.common.types.impl.JvmSpecializedTypeReferenceImplCustom.getSimpleName(JvmSpecializedTypeReferenceImplCustom.java:61)
at henkan.dsl.jvmmodel.HDslJvmModelInferrer$20$1.doGetTypeReference(HDslJvmModelInferrer.java:536)
at org.eclipse.xtext.xbase.typesystem.util.AbstractReentrantTypeReferenceProvider.getTypeReference(AbstractReentrantTypeReferenceProvider.java:28)
at org.eclipse.xtext.xtype.impl.XComputedTypeReferenceImplCustom.getEquivalent(XComputedTypeReferenceImplCustom.java:46)
at org.eclipse.xtext.xbase.typesystem.references.LightweightTypeReferenceFactory.doVisitComputedTypeReference(LightweightTypeReferenceFactory.java:165)
at org.eclipse.xtext.xbase.typesystem.references.LightweightTypeReferenceFactory.doVisitComputedTypeReference(LightweightTypeReferenceFactory.java:52)
at org.eclipse.xtext.xtype.impl.XComputedTypeReferenceImplCustom.accept(XComputedTypeReferenceImplCustom.java:27)
at org.eclipse.xtext.common.types.util.AbstractTypeReferenceVisitor.visit(AbstractTypeReferenceVisitor.java:34)
at org.eclipse.xtext.xbase.typesystem.references.LightweightTypeReferenceFactory.toLightweightReference(LightweightTypeReferenceFactory.java:83)
at org.eclipse.xtext.xbase.typesystem.references.StandardTypeReferenceOwner.toLightweightTypeReference(StandardTypeReferenceOwner.java:117)
at org.eclipse.xtext.xbase.typesystem.internal.LogicalContainerAwareReentrantTypeResolver._doPrepare(LogicalContainerAwareReentrantTypeResolver.java:538)
at org.eclipse.xtext.xbase.typesystem.internal.LogicalContainerAwareReentrantTypeResolver.doPrepare(LogicalContainerAwareReentrantTypeResolver.java:463)
at org.eclipse.xtext.xbase.typesystem.internal.LogicalContainerAwareReentrantTypeResolver.prepareMembers(LogicalContainerAwareReentrantTypeResolver.java:500)
at org.eclipse.xtext.xbase.typesystem.internal.LogicalContainerAwareReentrantTypeResolver._doPrepare(LogicalContainerAwareReentrantTypeResolver.java:471)
at org.eclipse.xtext.xbase.typesystem.internal.LogicalContainerAwareReentrantTypeResolver.doPrepare(LogicalContainerAwareReentrantTypeResolver.java:459)
at org.eclipse.xtext.xbase.typesystem.internal.LogicalContainerAwareReentrantTypeResolver.prepare(LogicalContainerAwareReentrantTypeResolver.java:409)
at org.eclipse.xtext.xbase.typesystem.internal.LogicalContainerAwareReentrantTypeResolver.computeTypes(LogicalContainerAwareReentrantTypeResolver.java:696)
at org.eclipse.xtext.xbase.typesystem.internal.DefaultReentrantTypeResolver.resolve(DefaultReentrantTypeResolver.java:163)
at org.eclipse.xtext.xbase.typesystem.internal.DefaultReentrantTypeResolver.reentrantResolve(DefaultReentrantTypeResolver.java:139)
at org.eclipse.xtext.xbase.typesystem.internal.CompoundReentrantTypeResolver.reentrantResolve(CompoundReentrantTypeResolver.java:79)
at org.eclipse.xtext.xbase.typesystem.internal.CachingBatchTypeResolver$LazyResolvedTypes.resolveTypes(CachingBatchTypeResolver.java:80)
at org.eclipse.xtext.xbase.typesystem.internal.CachingBatchTypeResolver$2.process(CachingBatchTypeResolver.java:57)
at org.eclipse.xtext.xbase.typesystem.internal.CachingBatchTypeResolver$2.process(CachingBatchTypeResolver.java:53)
at org.eclipse.xtext.util.concurrent.IUnitOfWork$Void.exec(IUnitOfWork.java:37)
at org.eclipse.xtext.util.OnChangeEvictingCache.execWithoutCacheClear(OnChangeEvictingCache.java:129)
at org.eclipse.xtext.xbase.typesystem.internal.CachingBatchTypeResolver.doResolveTypes(CachingBatchTypeResolver.java:53)
at org.eclipse.xtext.xbase.typesystem.internal.AbstractBatchTypeResolver.resolveTypes(AbstractBatchTypeResolver.java:69)
at org.eclipse.xtext.xbase.resource.BatchLinkingService.resolveBatched(BatchLinkingService.java:71)
at org.eclipse.xtext.xbase.resource.BatchLinkableResource.resolveLazyCrossReferences(BatchLinkableResource.java:165)
at org.eclipse.xtext.EcoreUtil2.resolveLazyCrossReferences(EcoreUtil2.java:498)
at org.eclipse.xtext.xbase.testing.CompilationTestHelper$Result.doLinking(CompilationTestHelper.java:507)
at org.eclipse.xtext.xbase.testing.CompilationTestHelper$Result.doValidation(CompilationTestHelper.java:513)
at org.eclipse.xtext.xbase.testing.CompilationTestHelper$Result.doGenerate(CompilationTestHelper.java:530)
at org.eclipse.xtext.xbase.testing.CompilationTestHelper.compile(CompilationTestHelper.java:245)
at org.eclipse.xtext.xbase.testing.CompilationTestHelper.compile(CompilationTestHelper.java:195)
at org.eclipse.xtext.xbase.testing.CompilationTestHelper.assertCompilesTo(CompilationTestHelper.java:174)
at henkan.dsl.tests.HDslParsingTest.testCompile(HDslParsingTest.java:269)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.eclipse.xtext.testing.XtextRunner$1.evaluate(XtextRunner.java:49)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

do you have any idea?
Re: Compute another type from inferredType [message #1765191 is a reply to message #1765182] Wed, 07 June 2017 11:36 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14665
Registered: July 2009
Senior Member
i am sure you did not implement it correct. how does your inferrer look like now

Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
Re: Compute another type from inferredType [message #1765193 is a reply to message #1765191] Wed, 07 June 2017 12:13 Go to previous messageGo to next message
anil chalil is currently offline anil chalilFriend
Messages: 38
Registered: October 2010
Member
I checked twice.To me it seems to be correct.But maybe i am missing something. You can run HDslParsingTest in henkan.dsl.parent/henkan.dsl/src/test/java/henkan/dsl/tests to see exception.
  • Attachment: henkan.tgz
    (Size: 8.79MB, Downloaded 88 times)
Re: Compute another type from inferredType [message #1765204 is a reply to message #1765193] Wed, 07 June 2017 13:54 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14665
Registered: July 2009
Senior Member
thats a different scenario.
and your code is extremely hard to read and cluttered with unrelated stuff.
where do you infer the original fields? what type do they have

i understand

- you have the original expression?
- you have some fields (which type inferred from what?
- you have some serializer fields? inferred from (2)
am i right


Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
Re: Compute another type from inferredType [message #1765207 is a reply to message #1765204] Wed, 07 June 2017 14:13 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14665
Registered: July 2009
Senior Member
some questions:

is it neccessary to have the serializers as separate type? maybe you can have local classes as well and move everything to the compiler

if yes i fear i have no idea besides hinting you to other places e.g.
org.eclipse.xtend.core.typesystem.XtendReentrantTypeResolver.InitializerParameterTypeReferenceProvider


Twitter : @chrdietrich
Blog : https://www.dietrich-it.de

[Updated on: Wed, 07 June 2017 14:14]

Report message to a moderator

Re: Compute another type from inferredType [message #1765213 is a reply to message #1765204] Wed, 07 June 2017 15:04 Go to previous messageGo to next message
anil chalil is currently offline anil chalilFriend
Messages: 38
Registered: October 2010
Member
Sorry for unrelated stuff. I cleaned up all the code in inferrer and wrote may comments regarding your questions. Also attached inferrer code as a seperate file. Thanks alot and sorry for inconvenience.
Re: Compute another type from inferredType [message #1765214 is a reply to message #1765207] Wed, 07 June 2017 15:08 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14665
Registered: July 2009
Senior Member
i just tried to nail down this to a more simple example.
but i cant

can you have a look

import "http://www.eclipse.org/xtext/xbase/Xbase"

Model:
	greetings+=Greeting*;
	
Greeting:
	'Hello' name=ID '=' expr=XBlockExpression;
	
@Override 
XExpressionOrVarDeclaration returns XExpression:
	super | EmitExpression;

EmitExpression:
	{EmitExpression}"emit" "(" (args+=XExpression ("," args+=XExpression)*)? ")"
;


import org.eclipse.xtext.xbase.XExpression;
import org.eclipse.xtext.xbase.compiler.XbaseCompiler;
import org.eclipse.xtext.xbase.compiler.output.ITreeAppendable;
import org.xtext.example.mydsl1.myDsl.EmitExpression;

public class MyDslCompiler extends XbaseCompiler {
	
	@Override
	protected void doInternalToJavaStatement(XExpression obj, ITreeAppendable appendable, boolean isReferenced) {
		if (obj instanceof EmitExpression) {
			//TODO
			return;
		}
		super.doInternalToJavaStatement(obj, appendable, isReferenced);
	}

}

import org.eclipse.xtext.xbase.XExpression;
import org.eclipse.xtext.xbase.typesystem.computation.ITypeComputationState;
import org.eclipse.xtext.xbase.typesystem.computation.XbaseTypeComputer;
import org.xtext.example.mydsl1.myDsl.EmitExpression;

public class MyDslTypeComputer extends XbaseTypeComputer {
	
	@Override
	public void computeTypes(XExpression expression, ITypeComputationState state) {
		if (expression instanceof EmitExpression) {
			for (XExpression p : ((EmitExpression) expression).getArgs()) {
				state.withNonVoidExpectation().computeTypes(p);
			}
			state.acceptActualType(state.getReferenceOwner().newReferenceTo(Void.TYPE));
			return;
		}
		super.computeTypes(expression, state);
	}

}
/*
 * generated by Xtext 2.12.0
 */
package org.xtext.example.mydsl1.jvmmodel

import com.google.common.base.Preconditions
import com.google.inject.Inject
import org.eclipse.xtext.common.types.JvmField
import org.eclipse.xtext.common.types.JvmTypeReference
import org.eclipse.xtext.common.types.TypesFactory
import org.eclipse.xtext.xbase.XExpression
import org.eclipse.xtext.xbase.jvmmodel.AbstractModelInferrer
import org.eclipse.xtext.xbase.jvmmodel.IJvmDeclaredTypeAcceptor
import org.eclipse.xtext.xbase.jvmmodel.IJvmModelAssociations
import org.eclipse.xtext.xbase.jvmmodel.JvmTypesBuilder
import org.eclipse.xtext.xbase.typesystem.util.AbstractReentrantTypeReferenceProvider
import org.eclipse.xtext.xtype.XComputedTypeReference
import org.eclipse.xtext.xtype.XtypeFactory
import org.eclipse.xtext.xtype.impl.XComputedTypeReferenceImplCustom
import org.xtext.example.mydsl1.myDsl.Model
import org.eclipse.xtext.EcoreUtil2
import org.xtext.example.mydsl1.myDsl.EmitExpression

class MyDslJvmModelInferrer extends AbstractModelInferrer {

	@Inject extension JvmTypesBuilder
	@Inject extension IJvmModelAssociations

	def dispatch void infer(Model model, IJvmDeclaredTypeAcceptor acceptor, boolean isPreIndexingPhase) {
		acceptor.accept(model.toClass('''demo.Demo''')) [
			var i = 0;
			for (g : model.greetings) {
				for (e : EcoreUtil2.getAllContentsOfType(g, EmitExpression)) {
					for (p : e.args) {
						i++
						System.err.println(e)
						members += p.toField("f_" + i, p.inferredType)[]
					}
				}
				members += model.toMethod("main_" + g.name, Void.TYPE.typeRef()) [
					body = g.expr
				]
			}
		]
		acceptor.accept(model.toClass('''demo.DemoSerializer''')) [

			var i = 0;
			for (g : model.greetings) {
				for (e : EcoreUtil2.getAllContentsOfType(g, EmitExpression)) {
					for (p : e.args) {
						i++
						System.err.println(e)

						val field = p.toField("demo2_"+i, XtypeFactory.eINSTANCE.createXComputedTypeReference)[]
						val fieldType = field.type as XComputedTypeReference
						fieldType.typeProvider = new AbstractReentrantTypeReferenceProvider() {
							override protected doGetTypeReference(XComputedTypeReferenceImplCustom context) {
								var fieldFromPrimaryClass = p.getPrimaryJvmElement as JvmField
								var simpleName = fieldFromPrimaryClass.type.simpleName
								// replace by type lookup
								var result = TypesFactory.eINSTANCE.createJvmUnknownTypeReference();
								result.qualifiedName = 'serializers.' + simpleName + 'Serializer';
								return result
							}
						}
						field.initializer = '''null''';
						members += field

					}
				}

			}

			
		]
	}

}



Hello x = {
			var a = 1;
			var b = "2";
			emit(a,b,3,"4")
		}


MULTIPLE FILES WERE GENERATED

File 1 : /myProject/./src-gen/demo/Demo.java

package demo;

@SuppressWarnings("all")
public class Demo {
  private int f_1;
  
  private String f_2;
  
  private int f_3;
  
  private String f_4;
  
  public void main_x() {
    int a = 1;
    String b = "2";
  }
}

File 2 : /myProject/./src-gen/demo/DemoSerializer.java

package demo;

@SuppressWarnings("all")
public class DemoSerializer {
  private serializers.intSerializer demo2_1 = null;
  
  private serializers.StringSerializer demo2_2 = null;
  
  private serializers.intSerializer demo2_3 = null;
  
  private serializers.StringSerializer demo2_4 = null;
}




Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
Re: Compute another type from inferredType [message #1765215 is a reply to message #1765213] Wed, 07 June 2017 15:08 Go to previous messageGo to next message
anil chalil is currently offline anil chalilFriend
Messages: 38
Registered: October 2010
Member
* is it neccessary to have the serializers as separate type? maybe you can have local classes as well and move everything to the compiler

You mean should i implement them as inner classes inside pojos and make that in compiler?
Re: Compute another type from inferredType [message #1765219 is a reply to message #1765215] Wed, 07 June 2017 15:41 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14665
Registered: July 2009
Senior Member
No create the classes as statement.
Where you generate the line for emit.

But first you should have a look st my example
I wonder where it differs from yours


Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
Re: Compute another type from inferredType [message #1765222 is a reply to message #1765214] Wed, 07 June 2017 16:08 Go to previous messageGo to next message
anil chalil is currently offline anil chalilFriend
Messages: 38
Registered: October 2010
Member
Himm yes this is more simple. Only difference is a greeting could take another greeting as input as well. Suppose:
Hello x = {
			var a = 1;
			var b = "2";
			emit(a named c1,b named c2,3 named c3 ,"4" named c4)
		} with source null

Hello y  = {
     // here c4 is refering to emit(a named c1,b named c2,3 named c3 ,"4"[color=orangered] named c4[/color])
     emit(row.c4)
} with source x 


In my case also below is working(with one operator):
source source1 with id="1";

flatmap operator deneme source source1 {
    emit(row.age named age,"other" named other)
}

sink mysink with id="2" source deneme;


But two operator case is not working. I think the problem is the stement i marked with blue

source source1 with id="1";

flatmap operator deneme source source1 {
emit(row.age named age,"other" named other)
}

flatmap operator deneme2 source deneme {
// here row is coming from 'deneme'
val myvalue = row.other
emit(myvalue named x)
}

sink mysink with id="2" source deneme2;


But below is working since i am not accesing row which is coming from deneme

source source1 with id="1";

flatmap operator deneme source source1 {
    emit(row.age named age,"other" named other)
}

flatmap operator deneme2 source deneme {
    //no reference to row(coming from deneme) so it is working 
    emit("myvalue" named x)
}

sink mysink with id="2" source deneme2;








Re: Compute another type from inferredType [message #1765228 is a reply to message #1765222] Wed, 07 June 2017 16:33 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14665
Registered: July 2009
Senior Member
You construct names make my head explode

=> can't concentrate on what you are doing
Can you extend that to greeting ?


Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
Re: Compute another type from inferredType [message #1765231 is a reply to message #1765228] Wed, 07 June 2017 17:03 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14665
Registered: July 2009
Senior Member
again it works in greeting example

Greeting:
	'Hello' name=ID ('from' from=[Greeting])? '=' expr=XBlockExpression;
/*
 * generated by Xtext 2.12.0
 */
package org.xtext.example.mydsl1.jvmmodel

import com.google.inject.Inject
import org.eclipse.xtext.EcoreUtil2
import org.eclipse.xtext.common.types.JvmField
import org.eclipse.xtext.common.types.TypesFactory
import org.eclipse.xtext.xbase.jvmmodel.AbstractModelInferrer
import org.eclipse.xtext.xbase.jvmmodel.IJvmDeclaredTypeAcceptor
import org.eclipse.xtext.xbase.jvmmodel.IJvmModelAssociations
import org.eclipse.xtext.xbase.jvmmodel.JvmTypesBuilder
import org.eclipse.xtext.xbase.typesystem.util.AbstractReentrantTypeReferenceProvider
import org.eclipse.xtext.xtype.XComputedTypeReference
import org.eclipse.xtext.xtype.XtypeFactory
import org.eclipse.xtext.xtype.impl.XComputedTypeReferenceImplCustom
import org.xtext.example.mydsl1.myDsl.EmitExpression
import org.xtext.example.mydsl1.myDsl.Model

class MyDslJvmModelInferrer extends AbstractModelInferrer {

	@Inject extension JvmTypesBuilder
	@Inject extension IJvmModelAssociations

	def dispatch void infer(Model model, IJvmDeclaredTypeAcceptor acceptor, boolean isPreIndexingPhase) {
			for (g : model.greetings) {
				acceptor.accept(model.toClass('''demo.«g.name»''')) [
					var i = 0;
						for (e : EcoreUtil2.getAllContentsOfType(g, EmitExpression)) {
							for (p : e.args) {
								i++
								System.err.println(e)
								members += p.toField("f_" + i, p.inferredType)[]
							}
						}
						members += model.toMethod("main_" + g.name, Void.TYPE.typeRef()) [
							if (g.from !== null) {
								parameters += g.toParameter("row", '''demo.«g.from.name»'''.toString.typeRef)
							}
							body = g.expr
						]
				]
				acceptor.accept(model.toClass('''demo.«g.name»Serializer''')) [
					var i = 0;
					for (e : EcoreUtil2.getAllContentsOfType(g, EmitExpression)) {
					for (p : e.args) {
						i++
						System.err.println(e)

						val field = p.toField("demo2_"+i, XtypeFactory.eINSTANCE.createXComputedTypeReference)[]
						val fieldType = field.type as XComputedTypeReference
						fieldType.typeProvider = new AbstractReentrantTypeReferenceProvider() {
							override protected doGetTypeReference(XComputedTypeReferenceImplCustom context) {
								var fieldFromPrimaryClass = p.getPrimaryJvmElement as JvmField
								var simpleName = fieldFromPrimaryClass.type.simpleName
								// replace by type lookup
								var result = TypesFactory.eINSTANCE.createJvmUnknownTypeReference();
								result.qualifiedName = 'serializers.' + simpleName + 'Serializer';
								return result
							}
						}
						field.initializer = '''null''';
						members += field

					}
				}
				]
			}

	}

}

Hello x = {
			var a = 1;
			var b = 2;
			var c = 1.0d;
			emit(a,b,3,"4",c)
		}
		Hello y from x = {
			var a2 = 1;
			var b2 = "2";
			var c3 = row.f_5
			emit(a2,b2,c3)
		}


Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
Re: Compute another type from inferredType [message #1765437 is a reply to message #1765231] Fri, 09 June 2017 13:29 Go to previous messageGo to next message
anil chalil is currently offline anil chalilFriend
Messages: 38
Registered: October 2010
Member
Hello Christian,

I can reproduce same problem on your domain model as well. Only change i made is , in my case i have to generate "main" function body in another class. So if you change inferrer code like this:
/*
 * generated by Xtext 2.12.0
 */
package org.xtext.example.mydsl1.jvmmodel

import com.google.inject.Inject
import org.eclipse.xtext.xbase.jvmmodel.AbstractModelInferrer
import org.eclipse.xtext.xbase.jvmmodel.IJvmDeclaredTypeAcceptor
import org.eclipse.xtext.xbase.jvmmodel.JvmTypesBuilder
import org.xtext.example.mydsl1.myDsl.Model
import org.eclipse.xtext.xbase.jvmmodel.IJvmModelAssociations
import org.eclipse.xtext.EcoreUtil2
import org.xtext.example.mydsl1.myDsl.EmitExpression
import org.eclipse.xtext.xtype.XtypeFactory
import org.eclipse.xtext.xtype.XComputedTypeReference
import org.eclipse.xtext.xbase.typesystem.util.AbstractReentrantTypeReferenceProvider
import org.eclipse.xtext.xtype.impl.XComputedTypeReferenceImplCustom
import org.eclipse.xtext.common.types.JvmField
import org.eclipse.xtext.common.types.TypesFactory

/**
 * <p>Infers a JVM model from the source model.</p> 
 * 
 * <p>The JVM model should contain all elements that would appear in the Java code 
 * which is generated from the source model. Other models link against the JVM model rather than the source model.</p>     
 */
class MyDslJvmModelInferrer extends AbstractModelInferrer {

	/**
	 * convenience API to build and initialize JVM types and their members.
	 */
	@Inject extension JvmTypesBuilder
	@Inject extension IJvmModelAssociations

	def dispatch void infer(Model model, IJvmDeclaredTypeAcceptor acceptor, boolean isPreIndexingPhase) {
		for (g : model.greetings) {
			acceptor.accept(model.toClass('''demo.«g.name»''')) [
				var i = 0;
				for (e : EcoreUtil2.getAllContentsOfType(g, EmitExpression)) {
					for (p : e.args) {
						i++
						// System.err.println(e)
						members += p.toField("f_" + i, p.inferredType)[]
					}
				}
				members += model.toMethod("main_" + g.name, Void.TYPE.typeRef()) [
					if (g.from !== null) {
						parameters += g.toParameter("row", '''demo.«g.from.name»'''.toString.typeRef)
					}
					body = g.expr
				]
			]
			acceptor.accept(model.toClass('''demo.«g.name»Serializer''')) [
				var i = 0;
				val allcontents = EcoreUtil2.getAllContentsOfType(g, EmitExpression)
				println('''allcontents size : «allcontents.size» and args «allcontents.get(0).args.size»''')
				for (e : EcoreUtil2.getAllContentsOfType(g, EmitExpression)) {
					for (p : e.args) {
						i++
						// System.err.println(e)
						val field = p.toField("demo2_" + i, XtypeFactory.eINSTANCE.createXComputedTypeReference)[]
						val fieldType = field.type as XComputedTypeReference
						fieldType.typeProvider = new AbstractReentrantTypeReferenceProvider() {
							override protected doGetTypeReference(XComputedTypeReferenceImplCustom context) {
								var fieldFromPrimaryClass = p.getPrimaryJvmElement as JvmField
								var simpleName = fieldFromPrimaryClass.type.simpleName
								// replace by type lookup
								var result = TypesFactory.eINSTANCE.createJvmUnknownTypeReference();
								result.qualifiedName = 'serializers.' + simpleName + 'Serializer';
								return result
							}
						}
						field.initializer = '''null''';
						members += field

					}
				}
			]
			// move function generator to here
		acceptor.accept(model.toClass('''demo.«g.name»Function''')) [
		  	members += model.toMethod("main_" + g.name, Void.TYPE.typeRef()) [
		  		if (g.from !== null) {
		  			parameters += g.toParameter("row", '''demo.«g.from.name»'''.toString.typeRef)
		  		}
		  		body = g.expr
		  	]
		 ]
		}

	}
}


and as a test dsl i used this
Hello x = {
					var a = 1;
					var b = 2;
					var c = 1.0d;
					emit(a,b,3,"4",c)
				}
				Hello y from x = {
					var a2 = 1;
					var b2 = "2";
					var c3 = row.f_5
					emit(a2,b2,c3)
				}
				Hello z from y = {
									var a2 = row.f_1+1;
									var b2 = row.f_2;
									var c3 = row.f_3;
									emit(a2,b2,c3)
								}



Re: Compute another type from inferredType [message #1765438 is a reply to message #1765437] Fri, 09 June 2017 13:42 Go to previous messageGo to next message
anil chalil is currently offline anil chalilFriend
Messages: 38
Registered: October 2010
Member
Also in my model found this. If i change my model inferrer code from:
                        generateFunctionBody(operator,operator.closure,acceptor,isPreIndexingPhase)
			for(e:EcoreUtil2.getAllContentsOfType(operator, EmitExpression)){
				emit(operator,e,acceptor,isPreIndexingPhase)
			}
			


to:
                        
			for(e:EcoreUtil2.getAllContentsOfType(operator, EmitExpression)){
				emit(operator,e,acceptor,isPreIndexingPhase)
			}
                        generateFunctionBody(operator,operator.closure,acceptor,isPreIndexingPhase)


it is working. But in first case it is not working

Re: Compute another type from inferredType [message #1765482 is a reply to message #1765437] Sat, 10 June 2017 18:20 Go to previous messageGo to next message
anil chalil is currently offline anil chalilFriend
Messages: 38
Registered: October 2010
Member
I forgot to remove main function from generated row. With this one you can generate same error
/*
 * generated by Xtext 2.12.0
 */
package org.xtext.example.mydsl1.jvmmodel

import com.google.inject.Inject
import org.eclipse.xtext.xbase.jvmmodel.AbstractModelInferrer
import org.eclipse.xtext.xbase.jvmmodel.IJvmDeclaredTypeAcceptor
import org.eclipse.xtext.xbase.jvmmodel.JvmTypesBuilder
import org.xtext.example.mydsl1.myDsl.Model
import org.eclipse.xtext.xbase.jvmmodel.IJvmModelAssociations
import org.eclipse.xtext.EcoreUtil2
import org.xtext.example.mydsl1.myDsl.EmitExpression
import org.eclipse.xtext.xtype.XtypeFactory
import org.eclipse.xtext.xtype.XComputedTypeReference
import org.eclipse.xtext.xbase.typesystem.util.AbstractReentrantTypeReferenceProvider
import org.eclipse.xtext.xtype.impl.XComputedTypeReferenceImplCustom
import org.eclipse.xtext.common.types.JvmField
import org.eclipse.xtext.common.types.TypesFactory

/**
 * <p>Infers a JVM model from the source model.</p> 
 * 
 * <p>The JVM model should contain all elements that would appear in the Java code 
 * which is generated from the source model. Other models link against the JVM model rather than the source model.</p>     
 */
class MyDslJvmModelInferrer extends AbstractModelInferrer {

	/**
	 * convenience API to build and initialize JVM types and their members.
	 */
	@Inject extension JvmTypesBuilder
	@Inject extension IJvmModelAssociations

	def dispatch void infer(Model model, IJvmDeclaredTypeAcceptor acceptor, boolean isPreIndexingPhase) {
		for (g : model.greetings) {
			acceptor.accept(model.toClass('''demo.«g.name»''')) [
				var i = 0;
				for (e : EcoreUtil2.getAllContentsOfType(g, EmitExpression)) {
					for (p : e.args) {
						i++
						// System.err.println(e)
						members += p.toField("f_" + i, p.inferredType)[]
					}
				}
			]
			acceptor.accept(model.toClass('''demo.«g.name»Serializer''')) [
				var i = 0;
				val allcontents = EcoreUtil2.getAllContentsOfType(g, EmitExpression)
				println('''allcontents size : «allcontents.size» and args «allcontents.get(0).args.size»''')
				for (e : EcoreUtil2.getAllContentsOfType(g, EmitExpression)) {
					for (p : e.args) {
						i++
						// System.err.println(e)
						val field = p.toField("demo2_" + i, XtypeFactory.eINSTANCE.createXComputedTypeReference)[]
						val fieldType = field.type as XComputedTypeReference
						fieldType.typeProvider = new AbstractReentrantTypeReferenceProvider() {
							override protected doGetTypeReference(XComputedTypeReferenceImplCustom context) {
								var fieldFromPrimaryClass = p.getPrimaryJvmElement as JvmField
								var simpleName = fieldFromPrimaryClass.type.simpleName
								// replace by type lookup
								var result = TypesFactory.eINSTANCE.createJvmUnknownTypeReference();
								result.qualifiedName = 'serializers.' + simpleName + 'Serializer';
								return result
							}
						}
						field.initializer = '''null''';
						members += field

					}
				}
			]
			// move function generator to here
		acceptor.accept(model.toClass('''demo.«g.name»Function''')) [
		  	members += model.toMethod("main_" + g.name, Void.TYPE.typeRef()) [
		  		if (g.from !== null) {
		  			parameters += g.toParameter("row", '''demo.«g.from.name»'''.toString.typeRef)
		  		}
		  		body = g.expr
		  	]
		 ]
		}

	}
}


Hello x = {
					var a = 1;
					var b = 2;
					var c = 1.0d;
					emit(a,b,3,"4",c)
				}
				Hello y from x = {
					var a2 = 1;
					var b2 = "2";
					var c3 = row.f_5
					emit(a2,b2,c3)
				}
				Hello z from y = {
									var a2 = row.f_1+1;
									var b2 = row.f_2;
									var c3 = row.f_3;
									emit(a2,b2,c3)
								}



Re: Compute another type from inferredType [message #1765483 is a reply to message #1765482] Sat, 10 June 2017 18:32 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14665
Registered: July 2009
Senior Member
as i said: i cannot help you out with this issue. sorry

Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
Re: Compute another type from inferredType [message #1765489 is a reply to message #1765483] Sat, 10 June 2017 22:21 Go to previous messageGo to next message
anil chalil is currently offline anil chalilFriend
Messages: 38
Registered: October 2010
Member
Anyway thank you for your kindness and helpfull feedback. If I can find something I will report it. Thanks again.
Re: Compute another type from inferredType [message #1765495 is a reply to message #1765489] Sun, 11 June 2017 05:53 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14665
Registered: July 2009
Senior Member
One last idea i have: infer the fields in both the main and the other class
And take the main classes fields to infer the type


Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
Re: Compute another type from inferredType [message #1765510 is a reply to message #1765495] Sun, 11 June 2017 16:56 Go to previous message
anil chalil is currently offline anil chalilFriend
Messages: 38
Registered: October 2010
Member
Hi Christian,

Solved my problem :) Now it is working... But as i understand order of mapping elements to java model is important. I mean first mapping row then row serializer or vice versa affecting behavior. Thank you for your help.
Previous Topic:JvmModelInferrer - Generate a method call
Next Topic:Custom Java extensions in Xtext
Goto Forum:
  


Current Time: Tue Apr 23 14:42:01 GMT 2024

Powered by FUDForum. Page generated in 0.05472 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top