39
Code Generation with Sven Efftinge - itemis

Codegeneration With Xtend

Embed Size (px)

DESCRIPTION

Why you should implement Code Generators with Xtend.

Citation preview

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