[vala] Allow use of .gir directly from valac



commit 6f628ff5668fb8b819460ab0def4a06ec8d32434
Author: Ryan Lortie <desrt desrt ca>
Date:   Sat Oct 17 18:46:15 2009 -0400

    Allow use of .gir directly from valac
    
      - add a --girdir parameter to the compiler
      - make --pkg fall back to searching for a .gir file if it can't find
        a .vapi file
    
    also:
    
      - change the search order for .vapi files: XDG dirs are searched
        before the compiled-in (--prefix) data directory, now.
    
    Fixes bug 598817.

 compiler/valacompiler.vala              |   31 ++++++++++++++++++++++++--
 vala/Makefile.am                        |    2 +
 vala/valacodecontext.vala               |   36 ++++++++++++++++++++----------
 {vapigen => vala}/valagirparser.vala    |   23 +++++++++++++++++--
 {vapigen => vala}/valamarkupreader.vala |    0
 vapigen/Makefile.am                     |    2 -
 vapigen/valavapigen.vala                |   11 +++++++-
 7 files changed, 83 insertions(+), 22 deletions(-)
---
diff --git a/compiler/valacompiler.vala b/compiler/valacompiler.vala
index b7e5350..4ce0744 100644
--- a/compiler/valacompiler.vala
+++ b/compiler/valacompiler.vala
@@ -33,6 +33,9 @@ class Vala.Compiler {
 	[CCode (array_length = false, array_null_terminated = true)]
 	[NoArrayLength]
 	static string[] vapi_directories;
+	[CCode (array_length = false, array_null_terminated = true)]
+	[NoArrayLength]
+	static string[] gir_directories;
 	static string vapi_filename;
 	static string library;
 	static string gir;
@@ -76,6 +79,7 @@ class Vala.Compiler {
 	private CodeContext context;
 
 	const OptionEntry[] options = {
+		{ "girdir", 0, 0, OptionArg.FILENAME_ARRAY, ref gir_directories, "Look for .gir files in DIRECTORY", "DIRECTORY..." },
 		{ "vapidir", 0, 0, OptionArg.FILENAME_ARRAY, ref vapi_directories, "Look for package bindings in DIRECTORY", "DIRECTORY..." },
 		{ "pkg", 0, 0, OptionArg.STRING_ARRAY, ref packages, "Include binding for PACKAGE", "PACKAGE..." },
 		{ "vapi", 0, 0, OptionArg.FILENAME, ref vapi_filename, "Output VAPI file name", "FILE" },
@@ -131,6 +135,18 @@ class Vala.Compiler {
 			return 1;
 		}
 	}
+
+	private bool add_gir (CodeContext context, string gir) {
+		var gir_path = context.get_gir_path (gir, gir_directories);
+
+		if (gir_path == null) {
+			return false;
+		}
+
+		context.add_source_file (new SourceFile (context, gir_path, true));
+
+		return true;
+	}
 	
 	private bool add_package (CodeContext context, string pkg) {
 		if (context.has_package (pkg)) {
@@ -265,8 +281,8 @@ class Vala.Compiler {
 
 		if (packages != null) {
 			foreach (string package in packages) {
-				if (!add_package (context, package)) {
-					Report.error (null, "%s not found in specified Vala API directories".printf (package));
+				if (!add_package (context, package) && !add_gir (context, package)) {
+					Report.error (null, "%s not found in specified Vala API directories or GObject-Introspection GIR directories".printf (package));
 				}
 			}
 			packages = null;
@@ -295,7 +311,7 @@ class Vala.Compiler {
 					}
 
 					context.add_source_file (source_file);
-				} else if (source.has_suffix (".vapi")) {
+				} else if (source.has_suffix (".vapi") || source.has_suffix (".gir")) {
 					context.add_source_file (new SourceFile (context, rpath, true));
 				} else if (source.has_suffix (".c")) {
 					context.add_c_source_file (rpath);
@@ -318,6 +334,15 @@ class Vala.Compiler {
 		var genie_parser = new Genie.Parser ();
 		genie_parser.parse (context);
 
+		var gir_parser = new GirParser ();
+		gir_parser.parse (context);
+
+		if (gir_parser.get_package_names != null) {
+			foreach (var pkg in gir_parser.get_package_names ()) {
+				context.add_package (pkg);
+			}
+		}
+
 		if (context.report.get_errors () > 0) {
 			return quit ();
 		}
diff --git a/vala/Makefile.am b/vala/Makefile.am
index 3955061..685bab2 100644
--- a/vala/Makefile.am
+++ b/vala/Makefile.am
@@ -74,6 +74,7 @@ libvalacore_la_VALASOURCES = \
 	valaforeachstatement.vala \
 	valaformalparameter.vala \
 	valaforstatement.vala \
+	valagirparser.vala \
 	valagenerictype.vala \
 	valagenieparser.vala \
 	valageniescanner.vala \
@@ -91,6 +92,7 @@ libvalacore_la_VALASOURCES = \
 	valalockable.vala \
 	valalockstatement.vala \
 	valaloop.vala \
+	valamarkupreader.vala \
 	valamember.vala \
 	valamemberaccess.vala \
 	valamemberinitializer.vala \
diff --git a/vala/valacodecontext.vala b/vala/valacodecontext.vala
index b079d9f..5f57323 100644
--- a/vala/valacodecontext.vala
+++ b/vala/valacodecontext.vala
@@ -298,26 +298,38 @@ public class Vala.CodeContext {
 		return (define in defines);
 	}
 
-	public string? get_package_path (string pkg, string[] vapi_directories) {
-		string basename = "%s.vapi".printf (pkg);
+	public string? get_package_path (string pkg, string[] directories) {
+		var path = get_file_path (pkg + ".vapi", "vala/vapi", directories);
+
+		if (path == null) {
+			/* last chance: try the package compiled-in vapi dir */
+			var filename = Path.build_filename (Config.PACKAGE_DATADIR, "vapi", pkg + ".vapi");
+			if (FileUtils.test (filename, FileTest.EXISTS)) {
+				path = filename;
+			}
+		}
+
+		return path;
+	}
+
+	public string? get_gir_path (string gir, string[] directories) {
+		return get_file_path (gir + ".gir", "gir-1.0", directories);
+	}
+
+	string? get_file_path (string basename, string data_dir, string[] directories) {
 		string filename = null;
 
-		if (vapi_directories != null) {
-			foreach (string vapidir in vapi_directories) {
-				filename = Path.build_filename (vapidir, basename);
+		if (directories != null) {
+			foreach (string dir in directories) {
+				filename = Path.build_filename (dir, basename);
 				if (FileUtils.test (filename, FileTest.EXISTS)) {
 					return filename;
 				}
 			}
 		}
 
-		filename = Path.build_filename (Config.PACKAGE_DATADIR, "vapi", basename);
-		if (FileUtils.test (filename, FileTest.EXISTS)) {
-			return filename;
-		}
-
-		foreach (string vapidir in Environment.get_system_data_dirs ()) {
-			filename = Path.build_filename (vapidir, "vala/vapi", basename);
+		foreach (string dir in Environment.get_system_data_dirs ()) {
+			filename = Path.build_filename (dir, data_dir, basename);
 			if (FileUtils.test (filename, FileTest.EXISTS)) {
 				return filename;
 			}
diff --git a/vapigen/valagirparser.vala b/vala/valagirparser.vala
similarity index 98%
rename from vapigen/valagirparser.vala
rename to vala/valagirparser.vala
index 49ad98f..7b06233 100644
--- a/vapigen/valagirparser.vala
+++ b/vala/valagirparser.vala
@@ -26,8 +26,6 @@ using GLib;
  * Code visitor parsing all Vala source files.
  */
 public class Vala.GirParser : CodeVisitor {
-	public string package_name { get; private set; }
-
 	MarkupReader reader;
 
 	CodeContext context;
@@ -39,6 +37,7 @@ public class Vala.GirParser : CodeVisitor {
 	MarkupTokenType current_token;
 
 	string[] cheader_filenames;
+	string[] package_names;
 
 	HashMap<string,string> attributes_map = new HashMap<string,string> (str_hash, str_equal);
 
@@ -160,7 +159,7 @@ public class Vala.GirParser : CodeVisitor {
 
 	void parse_package () {
 		start_element ("package");
-		package_name = reader.get_attribute ("name");
+		add_package_name (reader.get_attribute ("name"));
 		next ();
 		end_element ("package");
 	}
@@ -1125,5 +1124,23 @@ public class Vala.GirParser : CodeVisitor {
 			Report.error (null, "Metadata file `%s' not found".printf (metadata_filename));
 		}
 	}
+
+	void add_package_name (string name) {
+		if (package_names == null) {
+			package_names = new string[0];
+		}
+
+		foreach (var existing in package_names) {
+			if (name == existing) {
+				return;
+			}
+		}
+
+		package_names += name;
+	}
+
+	public string[]? get_package_names () {
+		return package_names;
+	}
 }
 
diff --git a/vapigen/valamarkupreader.vala b/vala/valamarkupreader.vala
similarity index 100%
rename from vapigen/valamarkupreader.vala
rename to vala/valamarkupreader.vala
diff --git a/vapigen/Makefile.am b/vapigen/Makefile.am
index ef42080..c71f508 100644
--- a/vapigen/Makefile.am
+++ b/vapigen/Makefile.am
@@ -23,8 +23,6 @@ BUILT_SOURCES = vapigen.vala.stamp vapicheck.vala.stamp
 
 vapigen_VALASOURCES = \
 	valagidlparser.vala \
-	valagirparser.vala \
-	valamarkupreader.vala \
 	valavapigen.vala \
 	$(NULL)
 
diff --git a/vapigen/valavapigen.vala b/vapigen/valavapigen.vala
index e5e640b..d56a592 100644
--- a/vapigen/valavapigen.vala
+++ b/vapigen/valavapigen.vala
@@ -226,8 +226,15 @@ class Vala.VAPIGen : Object {
 			return quit ();
 		}
 		
-		if (library == null && girparser.package_name != null) {
-			library = girparser.package_name;
+		if (library == null && girparser.get_package_names () != null) {
+			var names = girparser.get_package_names ();
+
+			if (names.length != 1) {
+				Report.error (null, "multiple packages encountered and no library name given");
+				return quit ();
+			}
+
+			library = names[0];
 		}
 
 		if (library != null) {



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