X-Git-Url: http://nitlanguage.org diff --git a/src/model/mmodule.nit b/src/model/mmodule.nit index d88a0ba..4cdd340 100644 --- a/src/model/mmodule.nit +++ b/src/model/mmodule.nit @@ -17,12 +17,15 @@ # modules and module hierarchies in the metamodel module mmodule -import location -import mproject +import mpackage private import more_collections # The container class of a Nit object-oriented model. +# # A model knows modules, classes and properties and can retrieve them. +# +# However, a model is not a program or a library as it can contains modules +# found by the system (including broken ones) but not used. redef class Model # All known modules var mmodules = new Array[MModule] @@ -61,6 +64,7 @@ redef class MGroup redef fun mdoc_or_fallback do if mdoc != null then return mdoc + var default_mmodule = self.default_mmodule if default_mmodule == null then return null return default_mmodule.mdoc_or_fallback end @@ -71,24 +75,32 @@ class MModule super MConcern # The model considered - redef var model: Model + redef var model - # The group of module in the project if any + # The group of module in the package if any var mgroup: nullable MGroup - # The project of the module if any - # Safe alias for `mgroup.mproject` - fun mproject: nullable MProject + # 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 do var g = mgroup - if g == null then return null else return g.mproject + if g == null then return null else return g.mpackage end # The short name of the module - redef var name: String + redef var name - # The origin of the definition - var location: Location + redef var location is writable # Alias for `name` redef fun to_s do return self.name @@ -98,24 +110,26 @@ class MModule # The canonical name of the module. # - # It is usually the `name` prefixed by the project's name. - # Example: `"project::name"` + # It is usually the `name` prefixed by the package's name. + # Example: `"package::name"` + # + # Default modules use a doubled name to distinguish them from the package name. + # E.g.: `"core::core"` # - # If both names are the same (of if the module is project-less), then - # the short-name is used alone. + # 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.mproject.name == self.name then + if mgroup == null then return self.name else - return "{mgroup.mproject.name}::{self.name}" + return "{mgroup.mpackage.name}::{self.name}" end end # The namespace used for entities according to their visibility `v`. # - # Public entities use only the project as a namespace. - # Private entities use the `full_name` (i.e. "project::module") + # Public entities use only the package as a namespace. + # Private entities use the `full_name` (i.e. "package::module") # # This method is used by entities to implement their `full_name`. fun namespace_for(v: MVisibility): String do @@ -124,17 +138,17 @@ class MModule if mgroup == null then return full_name else - return mgroup.mproject.full_name + return mgroup.mpackage.full_name end end # 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.mproject.name != name then - res = g.mproject.name.to_cmangle + "__" + name.to_cmangle + if g != null and g.mpackage.name != name then + res = g.mpackage.name.to_cmangle + "__" + name.to_cmangle else res = name.to_cmangle end @@ -151,7 +165,7 @@ class MModule if mgroup == null then return c_name else - return mgroup.mproject.c_name + return mgroup.mpackage.c_name end end @@ -160,6 +174,7 @@ class MModule do model.mmodules_by_name.add_one(name, self) model.mmodules.add(self) + var mgroup = self.mgroup if mgroup != null then mgroup.mmodules.add(self) if mgroup.name == name then @@ -171,11 +186,9 @@ class MModule end # Register the imported modules (ie "import some_module") - # This function can only invoked once by mmodule. # The visibility must be set with `set_visibility_for`. fun set_imported_mmodules(imported_mmodules: Array[MModule]) do - assert unique_invocation: self.in_importation.direct_greaters.is_empty for m in imported_mmodules do self.model.mmodule_importation_hierarchy.add_edge(self, m) end @@ -235,13 +248,18 @@ class MModule end end - # Is `self` created for internal purpose? - # Fictive modules are instantiated internally but they should not be - # exposed to the final user. - var is_fictive: Bool = false is writable - # Is `self` a unit test module used by `nitunit`? var is_test_suite: 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 + redef fun parent_concern do return mgroup end