Home » Modeling » TMF (Xtext) » Compute another type from inferredType
| | |
Re: Compute another type from inferredType [message #1765110 is a reply to message #1765108] |
Tue, 06 June 2017 18:28 |
|
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 #1765167 is a reply to message #1765134] |
Wed, 07 June 2017 08:13 |
|
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 #1765204 is a reply to message #1765193] |
Wed, 07 June 2017 13:54 |
|
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 #1765214 is a reply to message #1765207] |
Wed, 07 June 2017 15:08 |
|
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 #1765222 is a reply to message #1765214] |
Wed, 07 June 2017 16:08 |
anil chalil 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 #1765231 is a reply to message #1765228] |
Wed, 07 June 2017 17:03 |
|
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 |
anil chalil 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 |
anil chalil 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 |
anil chalil 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)
}
|
|
| | | | |
Goto Forum:
Current Time: Tue Apr 23 14:42:01 GMT 2024
Powered by FUDForum. Page generated in 0.05472 seconds
|