[valadoc] libvaladoc: ModuleLoader cleanups



commit ff94c631c9826c114928c8549186d9747b0b6079
Author: Florian Brosch <flo brosch gmail com>
Date:   Sat Jan 14 23:49:16 2012 +0100

    libvaladoc: ModuleLoader cleanups

 src/libvaladoc/moduleloader.vala       |   92 ++++++++++++++++++-------------
 src/libvaladoc/taglets/tagletinit.vala |   16 +++---
 src/valadoc/valadoc.vala               |   25 +++++----
 3 files changed, 76 insertions(+), 57 deletions(-)
---
diff --git a/src/libvaladoc/moduleloader.vala b/src/libvaladoc/moduleloader.vala
index bee1114..123d0e4 100755
--- a/src/libvaladoc/moduleloader.vala
+++ b/src/libvaladoc/moduleloader.vala
@@ -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);
 	}
 }
 
diff --git a/src/libvaladoc/taglets/tagletinit.vala b/src/libvaladoc/taglets/tagletinit.vala
index 17a5121..7e88126 100755
--- a/src/libvaladoc/taglets/tagletinit.vala
+++ b/src/libvaladoc/taglets/tagletinit.vala
@@ -23,13 +23,13 @@
 
 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));
 	}
 }
diff --git a/src/valadoc/valadoc.vala b/src/valadoc/valadoc.vala
index e284e44..380da9e 100755
--- a/src/valadoc/valadoc.vala
+++ b/src/valadoc/valadoc.vala
@@ -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);
 	}
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]