Successfully reported this slideshow.

Codegeneration Goodies

7

Share

Loading in …3
×
1 of 78
1 of 78

More Related Content

Related Books

Free with a 14 day trial from Scribd

See all

Codegeneration Goodies

  1. 1. Codegeneration Goodies Moritz.Eysholdt@itemis.de These slides have been presented at the EclipseCon 2011 conference in Santa Clara: http://www.eclipsecon.org/2011/sessions/?page=sessions&id=2253 They have been modified for slideshare.net to contain additional explanatory comments. The source code of the demos is available at http://github.com/meysholdt/codegeneration-goodies-demos
  2. 2. Generate Code... ...customize?
  3. 3. We can edit the generated source code!
  4. 4. We can edit the generated source code! actually, NO.
  5. 5. We can edit the generated source code! actually, NO. • complicated to merge generated/handwritten code
  6. 6. We can edit the generated source code! actually, NO. • complicated to merge generated/handwritten code • handwritten code “gets lost” within generated code
  7. 7. We can edit the generated source code! actually, NO. • complicated to merge generated/handwritten code • handwritten code “gets lost” within generated code • requires to put generated source code under version control
  8. 8. We can edit the generated source code! actually, NO. • complicated to merge generated/handwritten code • handwritten code “gets lost” within generated code • requires to put generated source code under version control • generated version of source code is lost once modified
  9. 9. JMerge
  10. 10. JMerge • Unneeded files are not removed
  11. 11. JMerge • Unneeded files are not removed • easy to forget to remove @Generated
  12. 12. JMerge • Unneeded files are not removed • easy to forget to remove @Generated • Handwritten, but orphaned code can easily be forgotten
  13. 13. JMerge • Unneeded files are not removed • easy to forget to remove @Generated • Handwritten, but orphaned code can easily be forgotten • Import statements are not organized
  14. 14. JMerge • Unneeded files are not removed • easy to forget to remove @Generated • Handwritten, but orphaned code can easily be forgotten • Import statements are not organized • etc.
  15. 15. Solution: Generation Gap
  16. 16. Solution: Generation Gap • inheritance + Java’s @Override instead of @Generated
  17. 17. Solution: Generation Gap • inheritance + Java’s @Override instead of @Generated • two folders: “src”and “src-gen”
  18. 18. Solution: Generation Gap • inheritance + Java’s @Override instead of @Generated • two folders: “src”and “src-gen” • use MWE’s EcoreGenerator instead of JMerge
  19. 19. This is the famous library- example that ships with EMF.
  20. 20. - interfaces - impl-classes - util (all generated) This is the famous library- example that ships with EMF.
  21. 21. - interfaces - impl-classes - util (all generated) This is the - Ecore Model famous library- example that - Genmodel ships with EMF.
  22. 22. - interfaces - impl-classes - util (all generated) This is the - Ecore Model famous library- example that - Genmodel ships with EMF.
  23. 23. - interfaces - impl-classes - util (all generated) This is the - Ecore Model famous library- example that - Genmodel ships with EMF. Impl implements interface
  24. 24. unmodified library- library-example with example from EMF Generation Gap
  25. 25. unmodified library- library-example with example from EMF Generation Gap
  26. 26. unmodified library- library-example with example from EMF Generation Gap
  27. 27. unmodified library- library-example with example from EMF Generation Gap
  28. 28. unmodified library- library-example with example from EMF Generation Gap
  29. 29. unmodified library- library-example with example from EMF Generation Gap
  30. 30. unmodified library- library-example with example from EMF Generation Gap
  31. 31. Form the “Library”-EClass, EMF generates a “Library”-Interface and a “LibraryImpl”-Class. With the GenerationGap-Pattern, we additionally have a “LibraryImplCustom”-Class
  32. 32. Form the “Library”-EClass, EMF generates a “Library”-Interface and a “LibraryImpl”-Class. With the GenerationGap-Pattern, we additionally have a “LibraryImplCustom”-Class
  33. 33. Form the “Library”-EClass, EMF generates a “Library”-Interface and a “LibraryImpl”-Class. With the GenerationGap-Pattern, we additionally have a “LibraryImplCustom”-Class
  34. 34. Form the “Library”-EClass, EMF generates a “Library”-Interface and a “LibraryImpl”-Class. With the GenerationGap-Pattern, we additionally have a “LibraryImplCustom”-Class
  35. 35. generated code refers to “custom” classes as super types In the code that is generated by EMF, the “Custom”-Classes are automatically used instead of the “Impl”-Classes, when - another “Impl” class extends them. - the EFactory instantiated them.
  36. 36. generated code refers to “custom” classes as super types In the code that is generated by EMF, the “Custom”-Classes are automatically used instead of the “Impl”-Classes, when - another “Impl” class extends them. - the EFactory instantiated them. in the EFactory
  37. 37. JMerge generation gap files in VCS results of “git clean -fdX && tree” Here we can see which files need to be put under version control. - on the left-hand side, the unmodified library-example. - on the right-hand side, the example with generation gap. Please note that here no generated source code is being put under version control.
  38. 38. How does this work? hack’ed EMFGen’s ImportManager The EMF-Generator has an ImportManaged that returns a SimpleName for each QualifiedName of a Java-Element that is used within the generated source code. Now, if there is a “Custom”-Class/Interface for a certain generated Java Class/ Interface, the name of the “Custom”-Class/Interface is returned instead.
  39. 39. Generating Code... ...without a Template Language
  40. 40. hey, we can generate this!
  41. 41. hey, we can generate this! yes! I know a good template language.
  42. 42. hey, we can generate this! yes! I know a good template language. yeah, let’s do it.
  43. 43. hey, we can generate this! yes! I know a good template language. yeah, let’s do it. ! not so fast...
  44. 44. code generation == map models to text
  45. 45. code generation == map models to text
  46. 46. code generation == map models to text Template
  47. 47. code generation == map models to text Template XML Schema
  48. 48. code generation == map models to text Template Grammar XML Schema
  49. 49. code generation == map models to text Template Grammar XML Schema
  50. 50. EMF provides a wizard to convert XML-Schema to Ecore. XSD Ecore
  51. 51. EMF provides a wizard to convert XML-Schema to Ecore. XSD Ecore
  52. 52. EMF provides a wizard to convert XML-Schema to Ecore. XSD Ecore
  53. 53. EMF provides a wizard to convert XML-Schema to Ecore. XSD Ecore
  54. 54. The Package Explorer shows a minimal example that generates RSS, which is in fact XML. rss-2.0.xsd has been downloaded from the internet and ecore/ genmodel have been derived from it. The Java code shows is a complete example of what is needed to run the code generation. The Console shows the output of this this example.
  55. 55. The Package Explorer shows a minimal example that generates RSS, which is in fact XML. rss-2.0.xsd has been downloaded from the internet and ecore/ genmodel have been derived from it. The Java code shows is a complete example of what is needed to run the code generation. The Console shows the output of this this example.
  56. 56. The Package Explorer shows a minimal example that generates RSS, which is in fact XML. rss-2.0.xsd has been downloaded from the internet and ecore/ genmodel have been derived from it. The Java code shows is a complete example of what is needed to run the code generation. The Console shows the output of this this example.
  57. 57. what you get for free if you generate code via... template v.s. XSD
  58. 58. what you get for free if you generate code via... template v.s. XSD • well-formed-ness • xsd-compliance • formatting • escaping • typed Java-model • headers • namespaces
  59. 59. Grammar Text Model Most people probably know Xtext as a technology that can parse text into models. But it also works the other way around - models can be serialized into text!
  60. 60. parse Grammar Text Model Most people probably know Xtext as a technology that can parse text into models. But it also works the other way around - models can be serialized into text!
  61. 61. parse Grammar Text Model serialize Most people probably know Xtext as a technology that can parse text into models. But it also works the other way around - models can be serialized into text!
  62. 62. parse Grammar Text Model serialize Most people probably know Xtext as a technology that can parse text into models. But it also works the other way around - models can be serialized into text!
  63. 63. This example is a modified version of the arithmetics- example that ships with Xtext. It has been extended to allow serialization. The new*-Methods in the java code are utilities that simplify constructing a model. They delegate to the generated EFactory.
  64. 64. This example is a modified version of the arithmetics- example that ships with Xtext. It has been extended to allow serialization. The new*-Methods in the java code are utilities that simplify constructing a model. They delegate to the generated EFactory.
  65. 65. This example is a modified version of the arithmetics- example that ships with Xtext. It has been extended to allow serialization. The new*-Methods in the java code are utilities that simplify constructing a model. They delegate to the generated EFactory.
  66. 66. what you get for free if you generate code via... template v.s. Grammar
  67. 67. what you get for free if you generate code via... template v.s. Grammar • correct syntax • error messages for invalid models • good separation of concerns (see next slide) • typed Java-model • an Xtext-editor ;)
  68. 68. serialization - separation of concerns
  69. 69. serialization - separation of concerns model: Ecore (can be derived from grammar)
  70. 70. serialization - separation of concerns model: Ecore (can be derived from grammar) syntactical structure: Xtext Grammar
  71. 71. serialization - separation of concerns model: Ecore (can be derived from grammar) syntactical structure: Xtext Grammar transient values: ITransientValueService
  72. 72. serialization - separation of concerns model: Ecore (can be derived from grammar) syntactical structure: Xtext Grammar transient values: ITransientValueService token syntax: IValueConverter
  73. 73. serialization - separation of concerns model: Ecore (can be derived from grammar) syntactical structure: Xtext Grammar transient values: ITransientValueService token syntax: IValueConverter formatting: IFormatter
  74. 74. serialization - separation of concerns model: Ecore (can be derived from grammar) syntactical structure: Xtext Grammar transient values: ITransientValueService token syntax: IValueConverter formatting: IFormatter identifiers: IQualifiedNameProvider,
  75. 75. serialization - separation of concerns model: Ecore (can be derived from grammar) syntactical structure: Xtext Grammar transient values: ITransientValueService token syntax: IValueConverter formatting: IFormatter identifiers: IQualifiedNameProvider, IScopeProvider
  76. 76. Xtext’s serializer: status Xtext 1.0 (Helios) Xtext 2.0 (Indigo) • algorithm: backtracking • algorithm: object-tree-parser • improves: • customizability • error messages new • performance
  77. 77. Xtext’s serializer: status Xtext 1.0 (Helios) Xtext 2.0 (Indigo) • algorithm: backtracking • algorithm: object-tree-parser • improves: • customizability • error messages new • performance complete re-implementation
  78. 78. Questions? Moritz.Eysholdt@itemis.de

Editor's Notes

  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • ×