# modules and module hierarchies in the metamodel
module mmodule
-import location
import mpackage
private import more_collections
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
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
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
# 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}"
# 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
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
# 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
+ # 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 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