# modules and module hierarchies in the metamodel
module mmodule
-import poset
import location
import mproject
private import more_collections
redef class MGroup
# The loaded modules of this group
var mmodules = new Array[MModule]
+
+ # The default module of a group (if any, and if loaded)
+ #
+ # The default module of a group is the one that has the same name.
+ # Return `null` if the group has no default module or if the default
+ # module is not loaded.
+ var default_mmodule: nullable MModule = null
end
# A Nit module is usually associated with a Nit source file.
class MModule
- # The model considered
- var model: Model
+ super MConcern
- # placebo for old module nesting hierarchy
- # return null if self is not nested (ie. is a top-level module)
- #
- # TODO REMOVE, rely on mgroup instead
- var direct_owner: nullable MModule
+ # The model considered
+ redef var model: Model
# The group of module in the project if any
var mgroup: nullable MGroup
# The short name of the module
- var name: String
+ redef var name: String
# The origin of the definition
var location: Location
self.mgroup = mgroup
if mgroup != null then
mgroup.mmodules.add(self)
+ if mgroup.name == name then
+ assert mgroup.default_mmodule == null
+ mgroup.default_mmodule = self
+ end
# placebo for old module nesting hierarchy
- var direct_owner = mgroup.mmodules.first
- if direct_owner == self and mgroup.parent != null and not mgroup.parent.mmodules.is_empty then
- direct_owner = mgroup.parent.mmodules.first
+ var direct_owner = mgroup.default_mmodule
+ if direct_owner == self then
+ # The module is the new owner of its own group, thus adopt the other modules
+ for m in mgroup.mmodules do
+ if m == self then continue
+ model.mmodule_nesting_hierarchy.add_edge(self, m)
+ end
+ # The potential owner is the default_mmodule of the parent group
+ if mgroup.parent != null then direct_owner = mgroup.parent.default_mmodule
end
- if direct_owner != self then
- self.direct_owner = direct_owner
+ if direct_owner != self and direct_owner != null then
model.mmodule_nesting_hierarchy.add_edge(direct_owner, self)
end
end
end
end
- # placebo for old module nesting hierarchy
- fun public_owner: nullable MModule
- do
- var mgroup = self.mgroup
- if mgroup == null then return null
- mgroup = mgroup.mproject.root
- if mgroup.mmodules.is_empty then return null
- var res = mgroup.mmodules.first
- if res == self then return null
- return res
- end
-
# Return true if a class or a property introduced in `intro_mmodule` with a visibility of `visibility` is visible in self.
fun is_visible(intro_mmodule: MModule, visibility: MVisibility): Bool
do
abort
end
end
+
+ # Is the mmodule created for internal purpose?
+ # Fictive module are instantied internally but they should not be
+ # exposed to the final user
+ var is_fictive: Bool = false is writable
+
+ redef fun parent_concern do return mgroup
end