a_star: don't crash on deserialization errors and limit static types
[nit.git] / lib / gen_nit.nit
index ea410a2..c80229b 100644 (file)
@@ -15,6 +15,8 @@
 # Support to generate and otherwise manipulate Nit code
 module gen_nit
 
+import template
+
 redef class Sys
        # Reserved keywords in the Nit language
        var keywords: Set[String] is lazy do return new HashSet[String].from([
@@ -39,3 +41,58 @@ redef class Sys
        var methods_in_pointer: Array[String] is lazy do return methods_in_object + [
                "free"]
 end
+
+# Template of a Nit module to generate Nit code
+class NitModule
+       super Template
+
+       # Header on top of the module, usually the documentation
+       var header: nullable Writable = null is writable
+
+       # The module's name
+       var name: Writable is writable
+
+       # Annotations on the module declaration
+       var annotations = new Array[Writable]
+
+       # Importation declarations
+       #
+       # Accepts two formats:
+       # * Module name only, short or qualified: `json`, `gamnit::flat`, etc.
+       # * Full importation declaration: `import json`, `private import gamnit::flat`, etc.
+       var imports = new Set[Writable]
+
+       # Main content of this module
+       var content = new Array[Writable]
+
+       redef fun rendering
+       do
+               var header = header
+               if header != null then add header
+
+               var name = name
+               if annotations.is_empty then
+                       add "module {name}\n\n"
+               else
+                       add "module {name} is\n"
+                       for annotation in annotations do add "\t{annotation}\n"
+                       add "end\n\n"
+               end
+
+               for i in imports do
+                       if i.to_s.has("import ") then
+                               add i
+                       else
+                               add "import "
+                               add i
+                       end
+                       add "\n"
+               end
+               add "\n"
+
+               for l in content do
+                       add l
+                       add "\n"
+               end
+       end
+end