X-Git-Url: http://nitlanguage.org diff --git a/src/loader.nit b/src/loader.nit index 7f5a245..32749aa 100644 --- a/src/loader.nit +++ b/src/loader.nit @@ -375,6 +375,53 @@ redef class ModelBuilder end end + # Found nothing? maybe it is a qualified name + if path.chars.has(':') then + var ids = path.split("::") + var g = identify_group(ids.first) + if g != null then + scan_group(g) + var ms = g.mmodules_by_name(ids.last) + + # Return exact match + for m in ms do + if m.full_name == path then + return m + end + end + + # Where there is only one or two names `foo::bar` + # then accept module that matches `foo::*::bar` + if ids.length <= 2 then + if ms.length == 1 then return ms.first + if ms.length > 1 then + var l = new Array[String] + for m in ms do + var fp = m.filepath + if fp != null then fp = " ({fp})" else fp = "" + l.add "`{m.full_name}`{fp}" + end + last_loader_error = "Error: conflicting module for `{path}`: {l.join(", ")} " + return null + end + end + + var bests = new BestDistance[String](path.length / 2) + # We found nothing. But propose something in the package? + for sg in g.mpackage.mgroups do + for m in sg.mmodules do + var d = path.levenshtein_distance(m.full_name) + bests.update(d, m.full_name) + end + end + var last_loader_error = "Error: cannot find module `{path}`." + if bests.best_items.not_empty then + last_loader_error += " Did you mean " + bests.best_items.join(", ", " or ") + "?" + end + self.last_loader_error = last_loader_error + return null + end + end return null end @@ -998,7 +1045,7 @@ redef class ModelBuilder # (and `build_module_importation` that calls it). # # TODO (when the loader will be rewritten): use a better representation and move up rules in the model. - private var conditional_importations = new Array[SequenceRead[MModule]] + var conditional_importations = new Array[SequenceRead[MModule]] # Extends the current importations according to imported rules about conditional importation fun apply_conditional_importations(mmodule: MModule) @@ -1014,7 +1061,7 @@ redef class ModelBuilder for i in [1..ci.length[ do var m = ci[i] # Is imported? - if not mmodule.in_importation.greaters.has(m) then continue label + if mmodule == m or not mmodule.in_importation.greaters.has(m) then continue label end # Still here? It means that all conditions modules are loaded and imported