]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
generate static get_type functions for non-public classes and interfaces,
authorJuerg Billeter <j@bitron.ch>
Mon, 27 Aug 2007 14:46:38 +0000 (14:46 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Mon, 27 Aug 2007 14:46:38 +0000 (14:46 +0000)
2007-08-27  Juerg Billeter  <j@bitron.ch>

* gobject/valaclassregisterfunction.vala,
  gobject/valacodegeneratorinterface.vala,
  gobject/valainterfaceregisterfunction.vala,
  gobject/valatyperegisterfunction.vala: generate static get_type
  functions for non-public classes and interfaces,
  patch by Ed Schouten, fixes bug 470428

svn path=/trunk/; revision=504

ChangeLog
gobject/valaclassregisterfunction.vala
gobject/valacodegeneratorinterface.vala
gobject/valainterfaceregisterfunction.vala
gobject/valatyperegisterfunction.vala

index b644a4a7ea5e51295bc7e5cdbcf6abf8f781b766..2d444204e6f480102a37c0da5fc894a6ac1742ec 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2007-08-27  Jürg Billeter  <j@bitron.ch>
+
+       * gobject/valaclassregisterfunction.vala,
+         gobject/valacodegeneratorinterface.vala,
+         gobject/valainterfaceregisterfunction.vala,
+         gobject/valatyperegisterfunction.vala: generate static get_type
+         functions for non-public classes and interfaces,
+         patch by Ed Schouten, fixes bug 470428
+
 2007-08-27  Jürg Billeter  <j@bitron.ch>
 
        * vala/valacreationmethod.vala, gobject/valacodegenerator.vala,
index 65bc28e4291c433c39b75ff7ec9f232c6fea0123..bb636031f7af822cc5d08cdbb32dea6e45fa58a7 100644 (file)
@@ -77,6 +77,10 @@ public class Vala.ClassRegisterFunction : TypeRegisterFunction {
                }
        }
 
+       public override MemberAccessibility get_accessibility () {
+               return class_reference.access;
+       }
+
        public override CCodeFragment! get_type_interface_init_declaration () {
                var frag = new CCodeFragment ();
                
index 58516ee46fbfb2ea132fa4de4e59bdcb5c073816..da15e945ccc53cc3d112a9f27e345ba569ca45ea 100644 (file)
@@ -28,35 +28,45 @@ public class Vala.CodeGenerator {
                current_symbol = iface;
                current_type_symbol = iface;
 
+               CCodeFragment decl_frag;
+               CCodeFragment def_frag;
+               if (iface.access != MemberAccessibility.PRIVATE) {
+                       decl_frag = header_type_declaration;
+                       def_frag = header_type_definition;
+               } else {
+                       decl_frag = source_type_member_declaration;
+                       def_frag = source_type_member_declaration;
+               }
+
                if (!iface.is_static && !iface.declaration_only) {
                        type_struct = new CCodeStruct ("_%s".printf (iface.get_type_cname ()));
                        
-                       header_type_declaration.append (new CCodeNewline ());
+                       decl_frag.append (new CCodeNewline ());
                        var macro = "(%s_get_type ())".printf (iface.get_lower_case_cname (null));
-                       header_type_declaration.append (new CCodeMacroReplacement (iface.get_upper_case_cname ("TYPE_"), macro));
+                       decl_frag.append (new CCodeMacroReplacement (iface.get_upper_case_cname ("TYPE_"), macro));
 
                        macro = "(G_TYPE_CHECK_INSTANCE_CAST ((obj), %s, %s))".printf (iface.get_upper_case_cname ("TYPE_"), iface.get_cname ());
-                       header_type_declaration.append (new CCodeMacroReplacement ("%s(obj)".printf (iface.get_upper_case_cname (null)), macro));
+                       decl_frag.append (new CCodeMacroReplacement ("%s(obj)".printf (iface.get_upper_case_cname (null)), macro));
 
                        macro = "(G_TYPE_CHECK_INSTANCE_TYPE ((obj), %s))".printf (iface.get_upper_case_cname ("TYPE_"));
-                       header_type_declaration.append (new CCodeMacroReplacement ("%s(obj)".printf (iface.get_upper_case_cname ("IS_")), macro));
+                       decl_frag.append (new CCodeMacroReplacement ("%s(obj)".printf (iface.get_upper_case_cname ("IS_")), macro));
 
                        macro = "(G_TYPE_INSTANCE_GET_INTERFACE ((obj), %s, %s))".printf (iface.get_upper_case_cname ("TYPE_"), iface.get_type_cname ());
-                       header_type_declaration.append (new CCodeMacroReplacement ("%s_GET_INTERFACE(obj)".printf (iface.get_upper_case_cname (null)), macro));
-                       header_type_declaration.append (new CCodeNewline ());
+                       decl_frag.append (new CCodeMacroReplacement ("%s_GET_INTERFACE(obj)".printf (iface.get_upper_case_cname (null)), macro));
+                       decl_frag.append (new CCodeNewline ());
 
 
                        if (iface.source_reference.file.cycle == null) {
-                               header_type_declaration.append (new CCodeTypeDefinition ("struct _%s".printf (iface.get_cname ()), new CCodeVariableDeclarator (iface.get_cname ())));
-                               header_type_declaration.append (new CCodeTypeDefinition ("struct %s".printf (type_struct.name), new CCodeVariableDeclarator (iface.get_type_cname ())));
+                               decl_frag.append (new CCodeTypeDefinition ("struct _%s".printf (iface.get_cname ()), new CCodeVariableDeclarator (iface.get_cname ())));
+                               decl_frag.append (new CCodeTypeDefinition ("struct %s".printf (type_struct.name), new CCodeVariableDeclarator (iface.get_type_cname ())));
                        }
                        
                        type_struct.add_field ("GTypeInterface", "parent");
 
                        if (iface.source_reference.comment != null) {
-                               header_type_definition.append (new CCodeComment (iface.source_reference.comment));
+                               def_frag.append (new CCodeComment (iface.source_reference.comment));
                        }
-                       header_type_definition.append (type_struct);
+                       def_frag.append (type_struct);
                }
 
                iface.accept_children (this);
@@ -66,7 +76,11 @@ public class Vala.CodeGenerator {
 
                        var type_fun = new InterfaceRegisterFunction (iface);
                        type_fun.init_from_type ();
-                       header_type_member_declaration.append (type_fun.get_declaration ());
+                       if (iface.access != MemberAccessibility.PRIVATE) {
+                               header_type_member_declaration.append (type_fun.get_declaration ());
+                       } else {
+                               source_type_member_declaration.append (type_fun.get_declaration ());
+                       }
                        source_type_member_definition.append (type_fun.get_definition ());
                }
 
index b5a26a012213891a3485b5522cce2b9ea2b20e05..824b917dc9c8eab2c0dd3e32b1860caa53e37677 100644 (file)
@@ -64,6 +64,10 @@ public class Vala.InterfaceRegisterFunction : TypeRegisterFunction {
                return "G_TYPE_INTERFACE";
        }
 
+       public override MemberAccessibility get_accessibility () {
+               return interface_reference.access;
+       }
+
        public override CCodeFragment! get_type_interface_init_statements () {
                var frag = new CCodeFragment ();
                
index 389f9da7efac6c62a1750e4f6877c26b76c04738..57ef2ec23e23b0276c8063f40d5ccbe0292aee1d 100644 (file)
@@ -49,11 +49,18 @@ public abstract class Vala.TypeRegisterFunction {
                CCodeFunction fun;
                if (!plugin) {
                        fun = new CCodeFunction ("%s_get_type".printf (get_type_declaration ().get_lower_case_cname (null)), "GType");
+                       /* Function will not be prototyped anyway */
+                       if (get_accessibility () == MemberAccessibility.PRIVATE) {
+                               fun.modifiers = CCodeModifiers.STATIC;
+                       }
                } else {
                        fun = new CCodeFunction ("%s_register_type".printf (get_type_declaration ().get_lower_case_cname (null)), "GType");
                        fun.add_parameter (new CCodeFormalParameter ("module", "GTypeModule *"));
 
                        var get_fun = new CCodeFunction ("%s_get_type".printf (get_type_declaration ().get_lower_case_cname (null)), "GType");
+                       if (get_accessibility () == MemberAccessibility.PRIVATE) {
+                               fun.modifiers = CCodeModifiers.STATIC;
+                       }
 
                        declaration_fragment.append (get_fun.copy ());
 
@@ -195,4 +202,9 @@ public abstract class Vala.TypeRegisterFunction {
        public CCodeFragment! get_definition () {
                return definition_fragment;
        }
+
+       /**
+        * Returns the accessibility for this type.
+        */
+       public abstract MemberAccessibility get_accessibility ();
 }