Get CharSequence from JvmOperation object [message #1071067] |
Fri, 19 July 2013 05:25  |
Eclipse User |
|
|
|
Hi All,
I am new in Xtext and struggling with it.
I have a dsl that take function where the function body is a XBlockExpression.
Function:
{Function}
'function' name=QualifiedName '(' (params+=FullJvmFormalParameter (',' params+=FullJvmFormalParameter)*)? ')'
':' type = JvmTypeReference
body=XBlockExpression
;
I am using Generator to generate java code instead of using JvmModelInferrer as my dsl does not have a direct mapping with java. I have to do lot of textual templating.
In my generator I have the function and the body as XExpression. I am not able to fetch the java equivalent of it using xbaseCompiler. If anyone can guide me how can I get the equivalent java statements using xbasecompiler, will be really helpful.
Meanwhile I am trying it the Inferrer way. Inside my Generator I injected JvmTypesBuilder and using its extension methods in following way
@Inject protected extension JvmTypesBuilder;
...
def compileFunction(Function f)'''
«var JvmOperation function = f.toMethod(f.name, f.type)[
documentation = f.documentation
for(p : f.params){
parameters += p.toParameter(p.name, p.parameterType)
}
body = f.body
]»
«JvmOperation »
'''
Here I am getting my the whole function as a JvmOperation: getAbc(java.lang.String) ...
Is there a way to get the java equivalent statement from JvmOperation?
Thanks in advance.
Priya
|
|
|
|
|
|
Re: Get CharSequence from JvmOperation object [message #1071225 is a reply to message #1071110] |
Fri, 19 July 2013 11:39   |
Eclipse User |
|
|
|
HI,
the following works for me (if your would use jvmmodelinferrer completely it would even be more easy)
package org.xtext.example.mydsl.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.mydsl.myDsl.Function
import org.xtext.example.mydsl.myDsl.Model
class MyDslJvmModelInferrer extends AbstractModelInferrer {
@Inject extension JvmTypesBuilder
def dispatch void infer(Model element, IJvmDeclaredTypeAcceptor acceptor, boolean isPreIndexingPhase) {
acceptor.accept(
element.toClass("DontCare")
).initializeLater [
for (f : element.functs) {
val operation = f.toMethod(f.name, f.type ?: inferredType) [
documentation = f.documentation
for (p : f.params) {
parameters += p.toParameter(p.name, p.parameterType)
}
body = f.body
]
members += operation
}
]
}
}
package org.xtext.example.mydsl
import javax.inject.Inject
import org.eclipse.emf.ecore.EObject
import org.eclipse.emf.ecore.resource.Resource
import org.eclipse.xtext.common.types.JvmOperation
import org.eclipse.xtext.generator.IFileSystemAccess
import org.eclipse.xtext.generator.IGenerator
import org.eclipse.xtext.generator.trace.ITraceURIConverter
import org.eclipse.xtext.resource.ILocationInFileProvider
import org.eclipse.xtext.xbase.compiler.GeneratorConfig
import org.eclipse.xtext.xbase.compiler.ImportManager
import org.eclipse.xtext.xbase.compiler.JvmModelGenerator
import org.eclipse.xtext.xbase.compiler.output.ITreeAppendable
import org.eclipse.xtext.xbase.compiler.output.TreeAppendable
import org.eclipse.xtext.xbase.jvmmodel.IJvmModelAssociations
import org.xtext.example.mydsl.myDsl.Function
import org.xtext.example.mydsl.myDsl.Model
class DummyGen implements IGenerator {
@Inject JvmModelGenerator jmg
@Inject extension IJvmModelAssociations jma
@Inject
ILocationInFileProvider locationProvider
@Inject
ITraceURIConverter converter
override doGenerate(Resource input, IFileSystemAccess fsa) {
for (o : input.contents) {
o.compile(fsa)
}
}
def dispatch void compile(EObject o, IFileSystemAccess fsa) {
}
def dispatch void compile(Model o, IFileSystemAccess fsa) {
val im = new ImportManager()
val app = new TreeAppendable(im, converter, locationProvider, jma, o, "", "\n")
for (f : o.functs) {
f.compileFunction(app)
}
fsa.generateFile("test/Test.java",
'''
package test;
«im.imports.map["import " + it + ";"].join(("\n"))»
public class Test {
«app.toString»
}
''')
}
def compileFunction(Function f, ITreeAppendable app) {
val cfg = new GeneratorConfig
val operation = f.jvmElements.get(0) as JvmOperation
jmg.generateMember(operation, app, cfg)
}
}
|
|
|
|
|
|
|
Re: Get CharSequence from JvmOperation object [message #1075542 is a reply to message #1075536] |
Mon, 29 July 2013 12:00   |
Eclipse User |
|
|
|
I have tried the following as per your suggestion.
MyDsl.xtext
-----------
grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.xbase.Xbase
generate myDsl "http://www.xtext.org/example/mydsl/MyDsl"
DomainModel:
(functions += Function)+
;
Function:
{Function}
'function' name=QualifiedName '(' (params+=FullJvmFormalParameter (',' params+=FullJvmFormalParameter)*)? ')'
':' type = JvmTypeReference
body=XBlockExpression
;
MyDslGenerator.xtend //Generator
----------------------
/*
* generated by Xtext
*/
package org.xtext.example.mydsl2.generator
import org.eclipse.emf.ecore.EObject
import org.eclipse.emf.ecore.resource.Resource
import org.eclipse.xtext.common.types.JvmOperation
import org.eclipse.xtext.generator.IFileSystemAccess
import org.eclipse.xtext.generator.IGenerator
import org.eclipse.xtext.generator.trace.ITraceURIConverter
import org.eclipse.xtext.resource.ILocationInFileProvider
import org.eclipse.xtext.xbase.compiler.GeneratorConfig
import org.eclipse.xtext.xbase.compiler.ImportManager
import org.eclipse.xtext.xbase.compiler.JvmModelGenerator
import org.eclipse.xtext.xbase.compiler.output.ITreeAppendable
import org.eclipse.xtext.xbase.compiler.output.TreeAppendable
import org.eclipse.xtext.xbase.jvmmodel.IJvmModelAssociations
import org.xtext.example.mydsl2.myDsl.Function
import org.xtext.example.mydsl2.myDsl.DomainModel
import org.eclipse.xtext.xbase.compiler.XbaseCompiler
import com.google.inject.Inject
/**
* Generates code from your model files on save.
*
* see http://www.eclipse.org/Xtext/documentation.html#TutorialCodeGeneration
*/
class MyDslGenerator implements IGenerator {
@Inject protected XbaseCompiler compiler
@Inject JvmModelGenerator jmg
@Inject extension IJvmModelAssociations jma
@Inject
ILocationInFileProvider locationProvider
@Inject
ITraceURIConverter converter
override doGenerate(Resource input, IFileSystemAccess fsa) {
for (o : input.contents) {
o.compile(fsa)
}
}
def dispatch void compile(EObject o, IFileSystemAccess fsa) {
}
def dispatch void compile(DomainModel o, IFileSystemAccess fsa) {
val im = new ImportManager()
val app = new TreeAppendable(im, converter, locationProvider, jma, o, "", "\n")
for (f : o.functions) {
val a =f.compileFunction(app)
println(a)
}
fsa.generateFile("test/Test.java",
'''
package test;
«im.imports.map["import " + it + ";"].join(("\n"))»
public class Test {
«app.toString»
}
''')
}
def compileFunction(Function f, ITreeAppendable app) {
val cfg = new GeneratorConfig
val operation = f.jvmElements.get(0) as JvmOperation; // Exception ArrayIndexOutOfBound as jvmElements returning an empty string
jmg.generateMember(operation, app, cfg)
}
}
MyDslRuntimeModule.java //Binding IGenerator
------------------------
/*
* generated by Xtext
*/
package org.xtext.example.mydsl2;
import org.eclipse.xtext.generator.IGenerator;
import org.xtext.example.mydsl2.generator.MyDslGenerator;
/**
* Use this class to register components to be used at runtime / without the Equinox extension registry.
*/
public class MyDslRuntimeModule extends org.xtext.example.mydsl2.AbstractMyDslRuntimeModule {
@Override
public Class<? extends IGenerator> bindIGenerator() {
// TODO Auto-generated method stub
return MyDslGenerator.class;
}
}
|
|
|
|
|
|
|
|
|
|
|
|
Powered by
FUDForum. Page generated in 0.31965 seconds