AModuleName
.This method handles qualified names as used in AModuleName
.
# Resolve the module identification for a given `AModuleName`.
#
# This method handles qualified names as used in `AModuleName`.
fun search_module_by_amodule_name(n_name: AModuleName, mgroup: nullable MGroup): nullable MModule
do
var mod_name = n_name.n_id.text
# If a quad is given, we ignore the starting group (go from path)
if n_name.n_quad != null then mgroup = null
# If name not qualified, just search the name
if n_name.n_path.is_empty then
# Fast search if no n_path
return search_mmodule_by_name(n_name, mgroup, mod_name)
end
# If qualified and in a group
if mgroup != null then
# First search in the package
var r = mgroup.mpackage.root
assert r != null
scan_group(r)
# Get all modules with the final name
var res = r.mmodules_by_name(mod_name)
# Filter out the name that does not match the qualifiers
res = [for x in res do if match_amodulename(n_name, x) then x]
if res.not_empty then
if res.length > 1 then
error(n_name, "Error: conflicting module files for `{mod_name}`: `{[for x in res do x.filepath or else x.full_name].join("`, `")}`")
end
return res.first
end
end
# If no module yet, then assume that the first element of the path
# Is to be searched in the path.
var root_name = n_name.n_path.first.text
# Search for an alias in required external packages
if mgroup != null then
var alias = mgroup.mpackage.import_alias(root_name)
if alias != null then root_name = alias
end
var roots = search_group_in_paths(root_name, paths)
if roots.is_empty then
error(n_name, "Error: cannot find `{root_name}`. Tried: {paths.join(", ")}.")
return null
end
var res = new ArraySet[MModule]
for r in roots do
# Then, for each root, collect modules that matches the qualifiers
scan_group(r)
var root_res = r.mmodules_by_name(mod_name)
for x in root_res do if match_amodulename(n_name, x) then res.add x
end
if res.not_empty then
if res.length > 1 then
error(n_name, "Error: conflicting module files for `{mod_name}`: `{[for x in res do x.filepath or else x.full_name].join("`, `")}`")
end
return res.first
end
# If still nothing, just call a basic search that will fail and will produce an error message
error(n_name, "Error: cannot find module `{mod_name}` from `{root_name}`. Tried: {paths.join(", ")}.")
return null
end
src/loader.nit:836,2--902,4