Streamlining Python Development: A Guide to a Modern Project Setup
Codegeneration Goodies
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
4. We can edit the generated source code!
actually, NO.
5. We can edit the generated source code!
actually, NO.
• complicated to merge generated/handwritten code
6. We can edit the generated source code!
actually, NO.
• complicated to merge generated/handwritten code
• handwritten code “gets lost” within generated code
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. 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
12. JMerge
• Unneeded files are not removed
• easy to forget to remove @Generated
• Handwritten, but orphaned code can
easily be forgotten
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. 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.
17. Solution: Generation Gap
• inheritance + Java’s @Override instead of @Generated
• two folders: “src”and “src-gen”
18. Solution: Generation Gap
• inheritance + Java’s @Override instead of @Generated
• two folders: “src”and “src-gen”
• use MWE’s EcoreGenerator instead of JMerge
20. - interfaces
- impl-classes
- util
(all generated)
This is the
famous library-
example that
ships with EMF.
21. - interfaces
- impl-classes
- util
(all generated)
This is the - Ecore Model
famous library-
example that - Genmodel
ships with EMF.
22. - interfaces
- impl-classes
- util
(all generated)
This is the - Ecore Model
famous library-
example that - Genmodel
ships with EMF.
23. - interfaces
- impl-classes
- util
(all generated)
This is the - Ecore Model
famous library-
example that - Genmodel
ships with EMF.
Impl implements
interface
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. Form the “Library”-EClass, EMF generates a
“Library”-Interface and a “LibraryImpl”-Class.
With the GenerationGap-Pattern, we
additionally have a “LibraryImplCustom”-Class
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. Form the “Library”-EClass, EMF generates a
“Library”-Interface and a “LibraryImpl”-Class.
With the GenerationGap-Pattern, we
additionally have a “LibraryImplCustom”-Class
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. 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. 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. 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.
50. EMF provides a wizard to convert XML-Schema to Ecore.
XSD
Ecore
51. EMF provides a wizard to convert XML-Schema to Ecore.
XSD
Ecore
52. EMF provides a wizard to convert XML-Schema to Ecore.
XSD
Ecore
53. EMF provides a wizard to convert XML-Schema to Ecore.
XSD
Ecore
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. 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. 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. what you get for free if you generate code via...
template v.s. XSD
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. 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. 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. 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. 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. 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. 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. 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. what you get for free if you generate code via...
template v.s. Grammar
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 ;)