Combine module to make a single one if required.

Property definitions

nitc :: modelbuilder $ ToolContext :: make_main_module
	# Combine module to make a single one if required.
	fun make_main_module(mmodules: Array[MModule]): MModule
	do
		assert not mmodules.is_empty
		var mainmodule
		# We need a main module, so we build it by importing all modules
		mainmodule = new MModule(modelbuilder.model, null, mmodules.first.name + "-m", new Location(mmodules.first.location.file, 0, 0, 0, 0))
		mainmodule.is_fictive = true
		mainmodule.first_real_mmodule = mmodules.first.first_real_mmodule
		mainmodule.set_imported_mmodules(mmodules)
		modelbuilder.apply_conditional_importations(mainmodule)
		if mainmodule.in_importation.direct_greaters.length == 1 and mainmodule.in_importation.direct_greaters.first == mmodules.first then
			# Drop the fictive module if not needed
			mainmodule = mmodules.first
		else
			# Or else run phases on it
			modelbuilder.run_phases
		end
		return mainmodule
	end
src/modelbuilder.nit:36,2--55,4

nitc :: mixin $ ToolContext :: make_main_module
	redef fun make_main_module(mmodules)
	do
		var mixins = opt_mixins.value
		if not mixins.is_empty then
			mmodules.add_all modelbuilder.parse(opt_mixins.value)
			modelbuilder.run_phases
		end

		var mainmodule = super

		var defines = opt_defines.value
		if not defines.is_empty then
			var location = mainmodule.location
			var model = mainmodule.model

			# Create a fictive module if needed
			if mainmodule == mmodules.first then
				mainmodule = new MModule(model, null, mainmodule.name + "-d", location)
				mainmodule.set_imported_mmodules(mmodules)
				mainmodule.is_fictive = true
				mainmodule.first_real_mmodule = mmodules.first
			end

			var recv = mainmodule.sys_type
			assert recv != null
			var mclassdef = new MClassDef(mainmodule, recv, location)
			mclassdef.add_in_hierarchy

			for define in defines do
				var spl = define.split_once_on('=')
				var name = spl.first
				var val = null
				if spl.length > 1 then val = spl[1]
				var prop = mainmodule.try_get_primitive_method(name, recv.mclass)
				if prop == null then
					error(null, "Error: --define: no top-level function `{name}`.")
					continue
				end
				var ret = prop.intro.msignature.return_mtype
				var v
				if ret == null then
					error(null, "Error: --define: method `{prop}` is not a function.")
					continue
				else if ret.to_s == "Bool" then
					if val == null or val == "true" then
						v = true
					else if val == "false" then
						v = false
					else
						error(null, "Error: --define: method `{prop}` needs a Bool.")
						continue
					end
				else if ret.to_s == "Int" then
					if val != null and val.is_numeric then
						v = val.to_i
					else
						error(null, "Error: --define: method `{prop}` needs a Int.")
						continue
					end
				else if ret.to_s == "String" then
					if val != null then
						v = val
					else
						error(null, "Error: --define: method `{prop}` needs a String.")
						continue
					end
				else
					error(null, "Error: --define: method `{prop}` returns an unsupported type `{ret}`.")
					continue
				end
				var pd = new MMethodDef(mclassdef, prop, location)
				pd.msignature = prop.intro.msignature
				pd.constant_value = v
			end
			check_errors
		end

		return mainmodule
	end
src/mixin.nit:34,2--112,4