end
end
+ # Evaluates dynamically a snippet of Nit code
+ # `nit_code` : Nit code to be executed
+ fun eval(nit_code: String)
+ do
+ var local_toolctx = modelbuilder.toolcontext
+ local_toolctx.dbg = self
+ var e = local_toolctx.parse_something(nit_code)
+ if e isa AExpr then
+ nit_code = "print " + nit_code
+ e = local_toolctx.parse_something(nit_code)
+ end
+ if e isa AModule then
+ local_toolctx.had_error = false
+ modelbuilder.load_rt_module(self.mainmodule, e, "rt_module")
+ local_toolctx.run_phases([e])
+ if local_toolctx.had_error then
+ modelbuilder.model.try_remove_module(e.mmodule.as(not null))
+ local_toolctx.dbg = null
+ return
+ end
+ var mmod = e.mmodule
+ if mmod != null then
+ self.mainmodule = mmod
+ var local_classdefs = mmod.mclassdefs
+ var sys_type = mmod.sys_type
+ if sys_type == null then
+ print "Fatal error, cannot find Class Sys !\nAborting"
+ abort
+ end
+ var mobj = new MutableInstance(sys_type)
+ init_instance(mobj)
+ var initprop = mmod.try_get_primitive_method("init", sys_type.mclass)
+ if initprop != null then
+ self.send(initprop, [mobj])
+ end
+ self.check_init_instance(mobj)
+ var mainprop = mmod.try_get_primitive_method("main", sys_type.mclass)
+ if mainprop != null then
+ self.rt_send(mainprop, [mobj])
+ end
+ else
+ print "Error while loading_rt_module"
+ end
+ else
+ print "Error when parsing, e = {e.class_name}"
+ end
+ local_toolctx.dbg = null
+ end
+
# Encpasulates the behaviour for step over/out
private fun steps_fun_call(n: AExpr)
do
var parser = new Parser(lexer)
var tree = parser.parse
file.close
+ var mod_name = filename.basename(".nit")
+ return load_module_commons(owner, tree, mod_name)
+ end
+
+ fun load_rt_module(owner: MModule, nmodule: AModule, mod_name: String): nullable AModule
+ do
+ # Create the module
+ var mmodule = new MModule(model, owner, mod_name, nmodule.location)
+ nmodule.mmodule = mmodule
+ nmodules.add(nmodule)
+ self.mmodule2nmodule[mmodule] = nmodule
+
+ var imported_modules = new Array[MModule]
+ imported_modules.add(owner)
+ mmodule.set_visibility_for(owner, intrude_visibility)
+
+ mmodule.set_imported_mmodules(imported_modules)
+
+ return nmodule
+ end
+
+ # Try to load a module using a path.
+ # Display an error if there is a problem (IO / lexer / parser) and return null
+ # Note: usually, you do not need this method, use `get_mmodule_by_name` instead.
+ private fun load_module_commons(owner: nullable MModule, tree: Start, mod_name: String): nullable AModule
+ do
# Handle lexer and parser error
var nmodule = tree.n_base
if nmodule == null then
end
# Check the module name
- var mod_name = filename.basename(".nit")
var decl = nmodule.n_moduledecl
if decl == null then
#warning(nmodule, "Warning: Missing 'module' keyword") #FIXME: NOT YET FOR COMPATIBILITY
nmodule.mmodule = mmodule
nmodules.add(nmodule)
self.mmodule2nmodule[mmodule] = nmodule
- self.loaded_nmodules[module_path] = nmodule
build_module_importation(nmodule)