X-Git-Url: http://nitlanguage.org diff --git a/src/loader.nit b/src/loader.nit index b8572a4..d1626cb 100644 --- a/src/loader.nit +++ b/src/loader.nit @@ -379,11 +379,18 @@ redef class ModelBuilder var mgrouppath = path.join_path("..").simplify_path var mgroup = identify_group(mgrouppath) + if mgroup != null then + var mpackage = mgroup.mpackage + if not mpackage.accept(path) then + mgroup = null + toolcontext.info("module `{path}` excluded from package `{mpackage}`", 2) + end + end if mgroup == null then # singleton package - var mpackage = new MPackage(pn, model) - mgroup = new MGroup(pn, mpackage, null) # same name for the root group - mgroup.filepath = path + var loc = new Location.opaque_file(path) + var mpackage = new MPackage(pn, model, loc) + mgroup = new MGroup(pn, loc, mpackage, null) # same name for the root group mpackage.root = mgroup toolcontext.info("found singleton package `{pn}` at {path}", 2) @@ -395,10 +402,8 @@ redef class ModelBuilder end end - var src = new SourceFile.from_string(path, "") - var loc = new Location(src, 0, 0, 0, 0) + var loc = new Location.opaque_file(path) var res = new MModule(model, mgroup, pn, loc) - res.filepath = path identified_modules_by_path[rp] = res identified_modules_by_path[path] = res @@ -475,6 +480,13 @@ redef class ModelBuilder if not stopper.file_exists then # Recursively get the parent group parent = identify_group(parentpath) + if parent != null then do + var mpackage = parent.mpackage + if not mpackage.accept(dirpath) then + toolcontext.info("directory `{dirpath}` excluded from package `{mpackage}`", 2) + parent = null + end + end if parent == null then # Parent is not a group, thus we are not a group either mgroups[rdp] = null @@ -483,17 +495,18 @@ redef class ModelBuilder end end + var loc = new Location.opaque_file(dirpath) var mgroup if parent == null then # no parent, thus new package if ini != null then pn = ini["package.name"] or else pn - var mpackage = new MPackage(pn, model) - mgroup = new MGroup(pn, mpackage, null) # same name for the root group + var mpackage = new MPackage(pn, model, loc) + mgroup = new MGroup(pn, loc, mpackage, null) # same name for the root group mpackage.root = mgroup toolcontext.info("found package `{mpackage}` at {dirpath}", 2) mpackage.ini = ini else - mgroup = new MGroup(pn, parent.mpackage, parent) + mgroup = new MGroup(pn, loc, parent.mpackage, parent) toolcontext.info("found sub group `{mgroup.full_name}` at {dirpath}", 2) end @@ -507,7 +520,6 @@ redef class ModelBuilder mdoc.original_mentity = mgroup end - mgroup.filepath = dirpath mgroups[rdp] = mgroup return mgroup end @@ -688,7 +700,7 @@ redef class ModelBuilder if decl != null then var decl_name = decl.n_name.n_id.text if decl_name != mmodule.name then - error(decl.n_name, "Error: module name mismatch; declared {decl_name} file named {mmodule.name}.") + warning(decl.n_name, "module-name-mismatch", "Error: module name mismatch; declared {decl_name} file named {mmodule.name}.") end end @@ -1066,6 +1078,27 @@ redef class MPackage # # Some packages, like stand-alone packages or virtual packages have no `ini` file associated. var ini: nullable ConfigTree = null + + # Array of relative source paths excluded according to the `source.exclude` key of the `ini` + var excludes: nullable Array[String] is lazy do + var ini = self.ini + if ini == null then return null + var exclude = ini["source.exclude"] + if exclude == null then return null + var excludes = exclude.split(":") + return excludes + end + + # Does the source inclusion/inclusion rules of the package `ini` accept such path? + fun accept(filepath: String): Bool + do + var excludes = self.excludes + if excludes != null then + var relpath = root.filepath.relpath(filepath) + if excludes.has(relpath) then return false + end + return true + end end redef class MGroup