]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
GIR parser: Add support for package and c:include tags 63e4647aaefdfdacc11fcb015a970a9bd925d457
authorJürg Billeter <j@bitron.ch>
Fri, 27 Feb 2009 21:38:29 +0000 (22:38 +0100)
committerJürg Billeter <j@bitron.ch>
Fri, 27 Feb 2009 21:38:29 +0000 (22:38 +0100)
Based on patch by Didier Villevalois, fixes part of bug 559704

vala/valanamespace.vala
vapigen/valagirparser.vala
vapigen/valavapigen.vala

index 1c0d9ad457742522a7be5fff363c58926182dd51..bdda6c85a8afd14237d2a4dc05a9551d507425e6 100644 (file)
@@ -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 (","))
index e23e14c0667a431f58d155f7029bf66623c0ed2f..0f8e4372f5dee16442c7f3aa6cd8dab1eda74321 100644 (file)
@@ -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<string,string> attributes_map = new HashMap<string,string> (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) {
index 4160302002fe6a1bf8d69d0fd93f857ae04fa254..05d144d7a471abfee347b51c87eb7a02a1992ba1 100644 (file)
@@ -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 ()) {