nitc :: 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
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