# 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([
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