X-Git-Url: http://nitlanguage.org diff --git a/src/model/mmodule.nit b/src/model/mmodule.nit index f6ff6ff..ab71dce 100644 --- a/src/model/mmodule.nit +++ b/src/model/mmodule.nit @@ -17,7 +17,6 @@ # modules and module hierarchies in the metamodel module mmodule -import location import mpackage private import more_collections @@ -76,11 +75,20 @@ class MModule super MConcern # The model considered - redef var model: Model + redef var model # The group of module in the package if any var mgroup: nullable MGroup + # The path of the module source, if any + # + # safe alias to `location.file.filepath` + fun filepath: nullable String do + var res = self.location.file + if res == null then return null + return res.filename + end + # The package of the module if any # Safe alias for `mgroup.mpackage` fun mpackage: nullable MPackage @@ -90,10 +98,9 @@ class MModule end # The short name of the module - redef var name: String + redef var name - # The origin of the definition - var location: Location is writable + redef var location is writable # Alias for `name` redef fun to_s do return self.name @@ -106,11 +113,13 @@ class MModule # It is usually the `name` prefixed by the package's name. # Example: `"package::name"` # - # If both names are the same (of if the module is package-less), then - # the short-name is used alone. + # Default modules use a doubled name to distinguish them from the package name. + # E.g.: `"core::core"` + # + # If the module is package-less, then the short-name is used alone. redef var full_name is lazy do var mgroup = self.mgroup - if mgroup == null or mgroup.mpackage.name == self.name then + if mgroup == null then return self.name else return "{mgroup.mpackage.name}::{self.name}" @@ -135,7 +144,7 @@ class MModule # Return the name of the global C identifier associated to `self`. # This name is used to prefix files and other C identifiers associated with `self`. - redef var c_name: String is lazy do + redef var c_name is lazy do var g = mgroup var res if g != null and g.mpackage.name != name then @@ -176,12 +185,19 @@ class MModule self.in_importation = model.mmodule_importation_hierarchy.add_node(self) end - # Register the imported modules (ie "import some_module") + # Register the imported modules (ie "import some_module") and packages importation graph + # In the same time it register the imported package # The visibility must be set with `set_visibility_for`. fun set_imported_mmodules(imported_mmodules: Array[MModule]) do for m in imported_mmodules do self.model.mmodule_importation_hierarchy.add_edge(self, m) + var actual_mpackage = self.mpackage + var imported_mpackage = m.mpackage + if actual_mpackage != null and imported_mpackage != null then + # Register the imported package + self.model.mpackage_importation_graph.add_arc(actual_mpackage, imported_mpackage) + end end end @@ -239,18 +255,19 @@ class MModule end end - # Is `self` a unit test module used by `nitunit`? - var is_test_suite: Bool = false is writable + # Is `self` a module generated by a tool? + # + # This flag has no effect on the semantic. + # It is only intended on software engineering software to discriminate computer-generated modules from human-written ones. + var is_generated: Bool = false is writable - # Get the first non `is_fictive` module greater than self - fun first_real_mmodule: MModule - do - var mmodule = self - while mmodule.is_fictive do - mmodule = mmodule.in_importation.direct_greaters.first - end - return mmodule - end + # Get the non-`is_fictive` module on which `self` is based on. + # + # On non-fictive module, this returns `self`. + # On fictive modules, this is used to refer the module which `self` is based on. + # + # This attribute should be set when a fictive module is created. See `is_fictive`. + var first_real_mmodule: MModule = self is writable redef fun parent_concern do return mgroup end