Top Banner
Code Generation with Sven Efftinge - itemis
39

Codegeneration With Xtend

May 22, 2015

Download

Technology

Sven Efftinge

Why you should implement Code Generators with Xtend.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Codegeneration With Xtend

Code Generation with

Sven Efftinge - itemis

Page 2: Codegeneration With Xtend

What is it?

Page 3: Codegeneration With Xtend

Successor to Xpand

Built with

Page 4: Codegeneration With Xtend

Why ?much faster (as fast as Java)

much better IDE support

generalized set of features

simpler

Page 5: Codegeneration With Xtend

Code Generation Essentials

Page 6: Codegeneration With Xtend

Template Expression(aka string concatenation)

same syntax as in Xpand

just an expression

greyspace support!

Page 7: Codegeneration With Xtend
Page 8: Codegeneration With Xtend

static typingsimply Java

no pluggable type system

can be emulated withactive annotations

Page 9: Codegeneration With Xtend

longitude & latitude

Page 10: Codegeneration With Xtend
Page 11: Codegeneration With Xtend
Page 12: Codegeneration With Xtend
Page 13: Codegeneration With Xtend
Page 14: Codegeneration With Xtend
Page 15: Codegeneration With Xtend

higher-order functions

map, filter, flatten, etc.it’s just library!

Page 16: Codegeneration With Xtend

class TypeProviderExample { def getHourlyData() { data.weather.hourlys } def getTimeWithHighestSwell() { hourlyData.sortBy[swellheightM].head.time } def getAverageWindSpeed() { hourlyData.map[windspeedkmph].reduce[a,b|a+b] / hourlyData.size }}

Page 17: Codegeneration With Xtend

dynamic dispatch

Page 18: Codegeneration With Xtend

dynamic dispatch

Page 19: Codegeneration With Xtend

dynamic dispatch

easily debuggable & extendable

Page 20: Codegeneration With Xtend

dynamic dispatch

def generate(ETypedElement e) { switch e { EAttribute : ''' attribute ''' EReference case e.isContainment: ''' containment reference ''' EReference : ''' reference ''' EOperation : ''' operation ''' default : throw new IllegalArgumentException("not handled : "+e) } }

dispatch over type and state

first come first serve

Page 21: Codegeneration With Xtend

modularization

Page 22: Codegeneration With Xtend

AOP?

Page 23: Codegeneration With Xtend

Dependency Injection!

Page 24: Codegeneration With Xtend

class MainGenerator { @Inject extension EcoreGen ecoreGenerator def doGenerate(EClass it) ''' class «name» { «FOR f : EStructuralFeatures» «f.generate» «ENDFOR» } '''}

class EcoreGen { def dispatch generate(EAttribute attribute) ''' generate attribute ''' def dispatch generate(EReference reference) ''' generate reference ''' def dispatch generate(EOperation operation) ''' generate operation '''}

declare the dependency

Page 25: Codegeneration With Xtend

class MySpecialEcoreGen extends EcoreGen { override dispatch generate(EAttribute attribute) ''' special EAttribute ''' def dispatch generate(EParameter param) ''' parameter '''}

class CustomizedGenerator { def static void main(String[] args) { val injector = Guice::createInjector [ bind(typeof(EcoreGen)).to(typeof(MySpecialEcoreGen)) ] val mainGenerator = injector.getInstance(typeof(MainGenerator)) mainGenerator.doGenerate(EcorePackage::eINSTANCE.EClass) }}

Extend the class you want to modify

Use Guice to wire up the generator

Page 26: Codegeneration With Xtend

content assistsyntax coloring

quick assist outline

rename refactoring

formating

call hierarchytype hierarchy

extract method

debugging

etc...

IDE Support

Page 27: Codegeneration With Xtend

But why always a DSL?

Page 28: Codegeneration With Xtend

MyBean

String value

class

Page 29: Codegeneration With Xtend

MyBeanString value

class {

}

@Observable

Page 30: Codegeneration With Xtend
Page 31: Codegeneration With Xtend
Page 32: Codegeneration With Xtend
Page 33: Codegeneration With Xtend
Page 34: Codegeneration With Xtend
Page 35: Codegeneration With Xtend
Page 36: Codegeneration With Xtend
Page 37: Codegeneration With Xtend
Page 38: Codegeneration With Xtend

future work

tooling via librarymore macro supportembedded languages

snappiness!

Page 39: Codegeneration With Xtend

Thank you!

@svenefftinge / @xtext / @xtendlang (c) 2013 by