]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
libvaladoc: ModuleLoader cleanups
authorFlorian Brosch <flo.brosch@gmail.com>
Sat, 14 Jan 2012 22:49:16 +0000 (23:49 +0100)
committerFlorian Brosch <flo.brosch@gmail.com>
Sat, 14 Jan 2012 22:49:16 +0000 (23:49 +0100)
src/libvaladoc/moduleloader.vala
src/libvaladoc/taglets/tagletinit.vala
src/valadoc/valadoc.vala

index bee1114290b910bd2d25ff5518d307f089e7a9a1..123d0e4d72829dcb1bde2178cf408ee8e52f6097 100755 (executable)
@@ -31,63 +31,77 @@ public delegate void Valadoc.TagletRegisterFunction (ModuleLoader loader);
 
 
 public class Valadoc.ModuleLoader : Object {
-       public HashMap<string, GLib.Type> taglets = new HashMap<string, GLib.Type> (GLib.str_hash, GLib.str_equal);
+       private HashMap<string, ModuleData> doclets = new HashMap<string, ModuleData> ();
+       private HashMap<string, ModuleData> drivers = new HashMap<string, ModuleData> ();
+       private HashMap<string, GLib.Type> taglets = new HashMap<string, GLib.Type> ();
 
-       private Module drivermodule;
-       private Type drivertype;
-       public Driver driver;
-
-       private Module docletmodule;
-       private Type doclettype;
-       public Doclet doclet;
-
-       ~ModuleLoader () {
-               // TODO: Why Do I have to do this?
-               driver = null;
-               doclet = null;
+       private class ModuleData : Object {
+               public Module module;
+               public Type type;
        }
 
        public Content.Taglet? create_taglet (string keyword) {
                return (taglets.has_key (keyword))? (Content.Taglet) GLib.Object.new (taglets.get (keyword)) : null;
        }
 
-       public bool load_doclet (string path) {
-               void* function;
+       public void register_taglet (string keyword, Type type) {
+               taglets.set (keyword, type);
+       }
+
+       public Doclet? create_doclet (string _path) {
+               string path = realpath (_path);
 
-               docletmodule = Module.open (Module.build_path (path, "libdoclet"), ModuleFlags.BIND_LAZY | ModuleFlags.BIND_LOCAL);
-               if (docletmodule == null) {
-                       return false;
-               }
+               ModuleData? data = doclets.get (path);
+               if (data == null) {
+                       void* function;
+
+                       Module? module = Module.open (Module.build_path (path, "libdoclet"), ModuleFlags.BIND_LAZY | ModuleFlags.BIND_LOCAL);
+                       if (module == null) {
+                               return null;
+                       }
 
-               docletmodule.symbol("register_plugin", out function);
-               if (function == null) {
-                       return false;
+                       module.symbol("register_plugin", out function);
+                       if (function == null) {
+                               return null;
+                       }
+
+                       Valadoc.DocletRegisterFunction register_func = (Valadoc.DocletRegisterFunction) function;
+                       data = new ModuleData ();
+                       doclets.set (path, data);
+
+                       data.type = register_func (this);
+                       data.module = (owned) module;
                }
 
-               Valadoc.DocletRegisterFunction doclet_register_function = (Valadoc.DocletRegisterFunction) function;
-               doclettype = doclet_register_function (this);
-               this.doclet = (Doclet) GLib.Object.new (doclettype);
-               return true;
+               return (Doclet) GLib.Object.new (data.type);
        }
 
+       public Driver? create_driver (string _path) {
+               string path = realpath (_path);
 
-       public bool load_driver (string path) {
-               void* function;
+               ModuleData? data = drivers.get (path);
+               if (data == null) {
+                       void* function;
 
-               drivermodule = Module.open (Module.build_path (path, "libdriver"), ModuleFlags.BIND_LAZY | ModuleFlags.BIND_LOCAL);
-               if (drivermodule == null) {
-                       return false;
-               }
+                       Module? module = Module.open (Module.build_path (path, "libdriver"), ModuleFlags.BIND_LAZY | ModuleFlags.BIND_LOCAL);
+                       if (module == null) {
+                               return null;
+                       }
+
+                       module.symbol("register_plugin", out function);
+                       if (function == null) {
+                               return null;
+                       }
+
+                       Valadoc.DriverRegisterFunction register_func = (Valadoc.DriverRegisterFunction) function;
+                       data = new ModuleData ();
+                       drivers.set (path, data);
 
-               drivermodule.symbol("register_plugin", out function);
-               if (function == null) {
-                       return false;
+                       data.type = register_func (this);
+                       data.module = (owned) module;
                }
 
-               Valadoc.DriverRegisterFunction driver_register_function = (Valadoc.DriverRegisterFunction) function;
-               drivertype = driver_register_function (this);
-               this.driver = (Driver) GLib.Object.new (drivertype);
-               return true;
+               return (Driver) GLib.Object.new (data.type);
        }
 }
 
index 17a5121edf7d77d462b83fc79735f27705c96217..7e88126aa16440a6a79ffbbc62fc0fb59634e4c1 100755 (executable)
 
 namespace Valadoc.Taglets {
        public void init (ModuleLoader loader) {
-               loader.taglets.set ("see", typeof (Valadoc.Taglets.See));
-               loader.taglets.set ("since", typeof (Valadoc.Taglets.Since));
-               loader.taglets.set ("link", typeof (Valadoc.Taglets.Link));
-               loader.taglets.set ("throws", typeof (Valadoc.Taglets.Throws));
-               loader.taglets.set ("return", typeof (Valadoc.Taglets.Return));
-               loader.taglets.set ("param", typeof (Valadoc.Taglets.Param));
-               loader.taglets.set ("deprecated", typeof (Valadoc.Taglets.Deprecated));
-               loader.taglets.set ("inheritDoc", typeof (Valadoc.Taglets.InheritDoc));
+               loader.register_taglet ("see", typeof (Valadoc.Taglets.See));
+               loader.register_taglet ("since", typeof (Valadoc.Taglets.Since));
+               loader.register_taglet ("link", typeof (Valadoc.Taglets.Link));
+               loader.register_taglet ("throws", typeof (Valadoc.Taglets.Throws));
+               loader.register_taglet ("return", typeof (Valadoc.Taglets.Return));
+               loader.register_taglet ("param", typeof (Valadoc.Taglets.Param));
+               loader.register_taglet ("deprecated", typeof (Valadoc.Taglets.Deprecated));
+               loader.register_taglet ("inheritDoc", typeof (Valadoc.Taglets.InheritDoc));
        }
 }
index e284e4483cd1f236ba36288d04e743df9243f839..380da9eb716dad32b02e381d163cde47c0d7210c 100755 (executable)
@@ -268,10 +268,12 @@ public class ValaDoc : Object {
                return null;
        }
 
-       private ModuleLoader? create_module_loader (ErrorReporter reporter) {
+       private ModuleLoader? create_module_loader (ErrorReporter reporter, out Doclet? doclet, out Driver? driver) {
                ModuleLoader modules = new ModuleLoader ();
                Taglets.init (modules);
 
+               doclet = null;
+               driver = null;
 
                // doclet:
                string? pluginpath = get_doclet_path (reporter);
@@ -279,8 +281,8 @@ public class ValaDoc : Object {
                        return null;
                }
 
-               bool tmp = modules.load_doclet (pluginpath);
-               if (tmp == false) {
+               doclet = modules.create_doclet (pluginpath);
+               if (doclet == null) {
                        reporter.simple_error ("failed to load doclet");
                        return null;
                }
@@ -292,13 +294,13 @@ public class ValaDoc : Object {
                        return null;
                }
 
-               tmp = modules.load_driver (pluginpath);
-               if (tmp == false) {
+               driver = modules.create_driver (pluginpath);
+               if (driver == null) {
                        reporter.simple_error ("failed to load driver");
                        return null;
                }
 
-               assert (modules.driver != null && modules.doclet != null);
+               assert (driver != null && doclet != null);
 
                return modules;
        }
@@ -343,17 +345,20 @@ public class ValaDoc : Object {
 
 
                // load plugins:
-               ModuleLoader? modules = create_module_loader (reporter);
+               Doclet? doclet = null;
+               Driver? driver = null;
+
+               ModuleLoader? modules = create_module_loader (reporter, out doclet, out driver);
                if (reporter.errors > 0 || modules == null) {
                        return quit (reporter);
                }
 
 
                // Create tree:
-               Valadoc.Driver driver = modules.driver;
                Valadoc.Api.Tree doctree = driver.build (settings, reporter);
-
                if (reporter.errors > 0) {
+                       driver = null;
+                       doclet = null;
                        return quit (reporter);
                }
 
@@ -389,7 +394,7 @@ public class ValaDoc : Object {
                        }
                }
 
-               modules.doclet.process (settings, doctree, reporter);
+               doclet.process (settings, doctree, reporter);
                return quit (reporter);
        }