[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;
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" },
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)) {
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;
}
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);
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 ();
}
valaforeachstatement.vala \
valaformalparameter.vala \
valaforstatement.vala \
+ valagirparser.vala \
valagenerictype.vala \
valagenieparser.vala \
valageniescanner.vala \
valalockable.vala \
valalockstatement.vala \
valaloop.vala \
+ valamarkupreader.vala \
valamember.vala \
valamemberaccess.vala \
valamemberinitializer.vala \
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;
}
* Code visitor parsing all Vala source files.
*/
public class Vala.GirParser : CodeVisitor {
- public string package_name { get; private set; }
-
MarkupReader reader;
CodeContext context;
MarkupTokenType current_token;
string[] cheader_filenames;
+ string[] package_names;
HashMap<string,string> attributes_map = new HashMap<string,string> (str_hash, str_equal);
void parse_package () {
start_element ("package");
- package_name = reader.get_attribute ("name");
+ add_package_name (reader.get_attribute ("name"));
next ();
end_element ("package");
}
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;
+ }
}
vapigen_VALASOURCES = \
valagidlparser.vala \
- valagirparser.vala \
- valamarkupreader.vala \
valavapigen.vala \
$(NULL)
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) {