core :: union_find
union–find algorithm using an efficient disjoint-set data structuregamnit :: texture_atlas_parser
Tool to parse XML texture atlas and generated Nit code to access subtextures
# 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([
		"abort", "abstract", "and", "assert", "break", "class", "continue",
		"do", "else", "end", "enum", "extern", "false", "implies", "import",
		"init", "interface", "intrude", "if", "in", "is", "isa", "isset",
		"for", "label", "loop", "module", "new", "not", "null",	"nullable",
		"or", "package", "private", "protected", "public", "return", "self",
		"super", "then", "true", "type", "var", "while"])
	# Top-level methods from the `Object` class
	#
	# This is a non-exaustive list that targets conflict-prone names.
	var methods_in_object: Array[String] is lazy do return [
		"class_name", "get_time", "hash", "inspect", "inspect_head",
		"is_same_type", "is_same_instance", "object_id", "output",
		"output_class_name", "sys", "to_s"]
	# Methods in the `Pointer` class
	#
	# This is a non-exaustive list that targets conflict-prone names.
	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
lib/gen_nit/gen_nit.nit:15,1--98,3