Code Generation idioms with Xtend
-
Upload
holger-schill -
Category
Presentations & Public Speaking
-
view
172 -
download
1
Transcript of Code Generation idioms with Xtend
// Generates Java classes source code // by using Apache Velocity GeneratorUtility utility = new GeneratorUtility(); for (int i = 0; i < classes.size(); i++) {
VelocityContext context = new VelocityContext(); ClassDescriptor cl = (ClassDescriptor) classes.get(i); context.put("class", cl); context.put("utility", utility);
Template template = Velocity.getTemplate(templateFile);
BufferedWriter writer = new BufferedWriter(new FileWriter(cl.getName()+”.java”));
template.merge(context, writer); writer.flush(); writer.close();
Template using Velocity
// Generates Java classes source code // by using Apache Velocity GeneratorUtility utility = new GeneratorUtility(); for (int i = 0; i < classes.size(); i++) {
VelocityContext context = new VelocityContext(); ClassDescriptor cl = (ClassDescriptor) classes.get(i); context.put("class", cl); context.put("utility", utility);
Template template = Velocity.getTemplate(templateFile);
BufferedWriter writer = new BufferedWriter(new FileWriter(cl.getName()+”.java”));
template.merge(context, writer); writer.flush(); writer.close();
Template using Velocity
And there are many more…
XpandAcceleo
…
Every whitespace goes into the output
Interpreted
Bad tooling
Slow
And there are many more…
Jet…
Every whitespace goes into the output
Translates to Java
Bad tooling
Fast
Model Navigation
val eClasses = myEPackage.EClassifiers.filter(EClass)
val abstractEClasses = eClasses.filter[isAbstract]
val namesOfAbstractClasses = abstractEClasses.map[name]
val commaSeparatedNamesOfAbstractClasses = namesOfAbstractClasses.join(',')
CommaSeparatedNamesOfAbstractClasses
Model Navigation
IDE Support
Extract methodRenameRefactoring
Content AssistQuick Assist
Formatting
Type Hierarchy
Call Hierarchy
Syntax Coloring
Outline
etc…
’s easy usage
No Engine needed
No ContextObject needed
At the end it’s feels like using Java
but better…
The m - 1 Problem
BeanBeanObject
Reso
urce
Configuration File
BeanBeanObject
Reso
urce
BeanBeanObject
Reso
urce
ResourceSet
ResourceSet
The m - 1 Problem
BeanBeanObject
Reso
urce
Configuration File
BeanBeanObject
Reso
urce
BeanBeanObject
Reso
urce
It’s worth to think about a merging strategy
Incremental code generators in Xtext// generator APIfragment = generator.GeneratorFragment auto-inject {}
Incremental code generators in Xtext// generator APIfragment = generator.GeneratorFragment auto-inject {}
class MyDslGenerator implements IGenerator {
override void doGenerate(Resource resource, IFileSystemAccess fsa) {// fsa.generateFile('greetings.txt', 'People to greet: ' + // resource.allContents// .filter(typeof(Greeting))// .map[name]// .join(', '))
}}
Incremental code generators in Xtext// generator APIfragment = generator.GeneratorFragment auto-inject {}
class MyDslGenerator implements IGenerator {
override void doGenerate(Resource resource, IFileSystemAccess fsa) {// fsa.generateFile('greetings.txt', 'People to greet: ' + // resource.allContents// .filter(typeof(Greeting))// .map[name]// .join(', '))
}}
Customisable mechanism is taking care to recompile affected resources
Incremental code generators in Xtext// generator APIfragment = generator.GeneratorFragment auto-inject {}
class MyDslGenerator implements IGenerator {
override void doGenerate(Resource resource, IFileSystemAccess fsa) {// fsa.generateFile('greetings.txt', 'People to greet: ' + // resource.allContents// .filter(typeof(Greeting))// .map[name]// .join(', '))
}}
http://www.eclipse.org/Xtext/documentation/350_continuous_integration.html
Get Maven integration for free