From 63e4647aaefdfdacc11fcb015a970a9bd925d457 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=BCrg=20Billeter?= Date: Fri, 27 Feb 2009 22:38:29 +0100 Subject: [PATCH] GIR parser: Add support for package and c:include tags Based on patch by Didier Villevalois, fixes part of bug 559704 --- vala/valanamespace.vala | 9 +++++++++ vapigen/valagirparser.vala | 27 ++++++++++++++++++++++++--- vapigen/valavapigen.vala | 4 ++++ 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/vala/valanamespace.vala b/vala/valanamespace.vala index 1c0d9ad45..bdda6c85a 100644 --- a/vala/valanamespace.vala +++ b/vala/valanamespace.vala @@ -512,6 +512,15 @@ public class Vala.Namespace : Symbol { cheader_filenames.add (cheader_filename); } + /** + * Adds a C header filename of this namespace. + * + * @param cheader_filename header filename + */ + public void add_cheader_filename (string cheader_filename) { + cheader_filenames.add (cheader_filename); + } + private void process_ccode_attribute (Attribute a) { if (a.has_argument ("cprefix")) { foreach (string name in a.get_string ("cprefix").split (",")) diff --git a/vapigen/valagirparser.vala b/vapigen/valagirparser.vala index e23e14c06..0f8e4372f 100644 --- a/vapigen/valagirparser.vala +++ b/vapigen/valagirparser.vala @@ -27,6 +27,8 @@ using Gee; * Code visitor parsing all Vala source files. */ public class Vala.GirParser : CodeVisitor { + public string package_name { get; private set; } + MarkupReader reader; CodeContext context; @@ -37,6 +39,8 @@ public class Vala.GirParser : CodeVisitor { SourceLocation end; MarkupTokenType current_token; + string[] cheader_filenames; + HashMap attributes_map = new HashMap (str_hash, str_equal); /** @@ -134,6 +138,10 @@ public class Vala.GirParser : CodeVisitor { } } else if (reader.name == "include") { parse_include (); + } else if (reader.name == "package") { + parse_package (); + } else if (reader.name == "c:include") { + parse_c_include (); } else { // error Report.error (get_current_src (), "unknown child element `%s' in `repository'".printf (reader.name)); @@ -149,6 +157,20 @@ public class Vala.GirParser : CodeVisitor { end_element ("include"); } + void parse_package () { + start_element ("package"); + package_name = reader.get_attribute ("name"); + next (); + end_element ("package"); + } + + void parse_c_include () { + start_element ("c:include"); + cheader_filenames += reader.get_attribute ("name"); + next (); + end_element ("c:include"); + } + Namespace? parse_namespace () { start_element ("namespace"); @@ -165,9 +187,8 @@ public class Vala.GirParser : CodeVisitor { } } - string cheader = get_attribute (ns.name, "c:header-filename"); - if (cheader != null) { - ns.set_cheader_filename (cheader); + foreach (string c_header in cheader_filenames) { + ns.add_cheader_filename (c_header); } next (); while (current_token == MarkupTokenType.START_ELEMENT) { diff --git a/vapigen/valavapigen.vala b/vapigen/valavapigen.vala index 416030200..05d144d7a 100644 --- a/vapigen/valavapigen.vala +++ b/vapigen/valavapigen.vala @@ -190,6 +190,10 @@ class Vala.VAPIGen : Object { return quit (); } + if (library == null && girparser.package_name != null) { + library = girparser.package_name; + } + if (library != null) { // interface writer ignores external packages foreach (SourceFile file in context.get_source_files ()) { -- 2.47.2