NOTICE: Update author list and years
[nit.git] / src / loader.nit
index aa88cdc..967d335 100644 (file)
@@ -42,13 +42,13 @@ import ini
 
 redef class ToolContext
        # Option --path
-       var opt_path = new OptionArray("Set include path for loaders (may be used more than once)", "-I", "--path")
+       var opt_path = new OptionArray("Add an additional include path (may be used more than once)", "-I", "--path")
 
        # Option --only-metamodel
        var opt_only_metamodel = new OptionBool("Stop after meta-model processing", "--only-metamodel")
 
        # Option --only-parse
-       var opt_only_parse = new OptionBool("Only proceed to parse step of loaders", "--only-parse")
+       var opt_only_parse = new OptionBool("Only proceed to parse files", "--only-parse")
 
        redef init
        do
@@ -104,7 +104,7 @@ redef class ModelBuilder
 
                if toolcontext.opt_only_parse.value then
                        self.toolcontext.info("*** ONLY PARSE...", 1)
-                       exit(0)
+                       self.toolcontext.quit
                end
 
                return mmodules.to_a
@@ -152,6 +152,11 @@ redef class ModelBuilder
 
                        var mmodule = identify_module(a)
                        if mmodule == null then
+                               if a.file_exists then
+                                       toolcontext.error(null, "Error: `{a}` is not a Nit source file.")
+                               else
+                                       toolcontext.error(null, "Error: cannot find module `{a}`.")
+                               end
                                continue
                        end
 
@@ -194,7 +199,7 @@ redef class ModelBuilder
 
                if toolcontext.opt_only_parse.value then
                        self.toolcontext.info("*** ONLY PARSE...", 1)
-                       exit(0)
+                       self.toolcontext.quit
                end
 
                return mmodules.to_a
@@ -238,7 +243,9 @@ redef class ModelBuilder
                        end
                end
 
-               var candidate = search_module_in_paths(anode.hot_location, name, lookpaths)
+               var loc = null
+               if anode != null then loc = anode.hot_location
+               var candidate = search_module_in_paths(loc, name, lookpaths)
 
                if candidate == null then
                        if mgroup != null then
@@ -374,9 +381,9 @@ redef class ModelBuilder
 
                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)
 
@@ -388,10 +395,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
@@ -476,17 +481,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
 
@@ -500,7 +506,6 @@ redef class ModelBuilder
                        mdoc.original_mentity = mgroup
                end
 
-               mgroup.filepath = dirpath
                mgroups[rdp] = mgroup
                return mgroup
        end
@@ -605,6 +610,11 @@ redef class ModelBuilder
                var keep = new Array[String]
                var res = new Array[String]
                for a in args do
+                       var stat = a.to_path.stat
+                       if stat != null and stat.is_dir then
+                               res.add a
+                               continue
+                       end
                        var l = identify_module(a)
                        if l == null then
                                keep.add a
@@ -650,6 +660,7 @@ redef class ModelBuilder
                var mmodule = new MModule(model, mgroup, mod_name, nmodule.location)
                nmodule.mmodule = mmodule
                nmodules.add(nmodule)
+               parsed_modules.add mmodule
                self.mmodule2nmodule[mmodule] = nmodule
 
                if parent!= null then
@@ -708,8 +719,6 @@ redef class ModelBuilder
                                var mdoc = ndoc.to_mdoc
                                mmodule.mdoc = mdoc
                                mdoc.original_mentity = mmodule
-                       else
-                               advice(decl, "missing-doc", "Documentation warning: Undocumented module `{mmodule}`")
                        end
                        # Is the module a test suite?
                        mmodule.is_test_suite = not decl.get_annotations("test_suite").is_empty
@@ -1005,9 +1014,6 @@ redef class ModelBuilder
 end
 
 redef class MModule
-       # The path of the module source
-       var filepath: nullable String = null
-
        # Force the parsing of the module using `modelbuilder`.
        #
        # If the module was already parsed, the existing ASI is returned.
@@ -1031,6 +1037,7 @@ redef class MModule
 
                # build the mmodule
                nmodule.mmodule = self
+               self.location = nmodule.location
                modelbuilder.build_a_mmodule(mgroup, nmodule)
 
                modelbuilder.parsed_modules.add self