From: Evan Nemerson Date: Wed, 10 Nov 2010 09:56:57 +0000 (-0800) Subject: girwriter: Flatten symbols nested in a way not supported by GIR X-Git-Tag: 0.11.3~84 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8d5cb8955010903a49d22dcba8c8e7d2e86bbb98;p=thirdparty%2Fvala.git girwriter: Flatten symbols nested in a way not supported by GIR Fixes bug 619865. --- diff --git a/codegen/valagirwriter.vala b/codegen/valagirwriter.vala index cf545fc2c..456ba3ad2 100644 --- a/codegen/valagirwriter.vala +++ b/codegen/valagirwriter.vala @@ -35,6 +35,8 @@ public class Vala.GIRWriter : CodeVisitor { FileStream stream; Vala.HashSet unannotated_namespaces = new Vala.HashSet(); Vala.HashSet our_namespaces = new Vala.HashSet(); + Vala.ArrayList hierarchy = new Vala.ArrayList(); + Vala.ArrayList deferred = new Vala.ArrayList(); int indent; @@ -153,13 +155,14 @@ public class Vala.GIRWriter : CodeVisitor { if (ns.name == null) { // global namespace + hierarchy.insert (0, ns); ns.accept_children (this); + hierarchy.remove_at (0); return; } if (ns.parent_symbol.name != null) { - // nested namespace - // not supported in GIR at the moment + ns.accept_children (this); return; } @@ -176,12 +179,16 @@ public class Vala.GIRWriter : CodeVisitor { write_annotations (ns); + hierarchy.insert (0, ns); ns.accept_children (this); + hierarchy.remove_at (0); indent--; write_indent (); buffer.append_printf ("\n"); our_namespaces.add(ns); + + visit_deferred (); } private void write_symbol_attributes (Symbol symbol) { @@ -202,11 +209,16 @@ public class Vala.GIRWriter : CodeVisitor { return; } + if (!(hierarchy[0] is Namespace)) { + deferred.add (cl); + return; + } + if (cl.is_subtype_of (gobject_type)) { string gtype_struct_name = cl.name + "Class"; write_indent (); - buffer.append_printf ("\n"); + hierarchy.insert (0, cl); cl.accept_children (this); + hierarchy.remove_at (0); indent--; write_indent (); @@ -301,19 +315,23 @@ public class Vala.GIRWriter : CodeVisitor { buffer.append_printf ("\n", cl.name, cl.get_cname ()); } else { write_indent (); - buffer.append_printf ("\n"); indent++; write_annotations (cl); + hierarchy.insert (0, cl); cl.accept_children (this); + hierarchy.remove_at (0); indent--; write_indent (); buffer.append_printf ("\n"); } + + visit_deferred (); } public override void visit_struct (Struct st) { @@ -325,19 +343,28 @@ public class Vala.GIRWriter : CodeVisitor { return; } + if (!(hierarchy[0] is Namespace)) { + deferred.add (st); + return; + } + write_indent (); - buffer.append_printf ("\n"); indent++; write_annotations (st); + hierarchy.insert (0, st); st.accept_children (this); + hierarchy.remove_at (0); indent--; write_indent (); buffer.append_printf ("\n"); + + visit_deferred (); } public override void visit_interface (Interface iface) { @@ -349,10 +376,15 @@ public class Vala.GIRWriter : CodeVisitor { return; } + if (!(hierarchy[0] is Namespace)) { + deferred.add (iface); + return; + } + string gtype_struct_name = iface.name + "Iface"; write_indent (); - buffer.append_printf ("\n"); + + visit_deferred (); + } + + private void visit_deferred () { + var nodes = this.deferred; + this.deferred = new Vala.ArrayList(); + + foreach (var node in nodes) { + node.accept (this); + } + } + + private string? get_gir_name (Symbol symbol) { + string? gir_name = null; + var h0 = hierarchy[0]; + + for (Symbol? cur_sym = symbol ; cur_sym != null ; cur_sym = cur_sym.parent_symbol) { + if (cur_sym == h0) { + break; + } + + gir_name = cur_sym.gir_name.concat (gir_name); + } + + return gir_name; } public override void visit_enum (Enum en) { @@ -401,8 +462,13 @@ public class Vala.GIRWriter : CodeVisitor { return; } + if (!(hierarchy[0] is Namespace)) { + deferred.add (en); + return; + } + write_indent (); - buffer.append_printf ("\n"); @@ -411,11 +477,15 @@ public class Vala.GIRWriter : CodeVisitor { write_annotations (en); enum_value = 0; + hierarchy.insert (0, en); en.accept_children (this); + hierarchy.remove_at (0); indent--; write_indent (); buffer.append_printf ("\n"); + + visit_deferred (); } private int enum_value; @@ -460,11 +530,15 @@ public class Vala.GIRWriter : CodeVisitor { indent++; enum_value = 0; + hierarchy.insert (0, edomain); edomain.accept_children (this); + hierarchy.remove_at (0); indent--; write_indent (); buffer.append_printf ("\n"); + + visit_deferred (); } public override void visit_error_code (ErrorCode ecode) { @@ -629,8 +703,13 @@ public class Vala.GIRWriter : CodeVisitor { } string tag_name = "method"; - var parent = m.parent_symbol; - if (parent is Namespace || m.binding == MemberBinding.STATIC) { + var parent = this.hierarchy.get (0); + if (parent is Enum) { + deferred.add (m); + return; + } + + if (parent is Namespace || m.binding == MemberBinding.STATIC || parent != m.parent_symbol) { tag_name = "function"; } @@ -642,16 +721,29 @@ public class Vala.GIRWriter : CodeVisitor { } private void write_signature (Method m, string tag_name, bool instance = false) { + var parent = this.hierarchy.get (0); + string name; + if (m.parent_symbol != parent) { + instance = false; + name = m.get_cname (); + var parent_prefix = parent.get_lower_case_cprefix (); + if (name.has_prefix (parent_prefix)) { + name = name.offset (parent_prefix.length); + } + } else { + name = m.name; + } + if (m.coroutine) { - string finish_name = m.name; + string finish_name = name; if (finish_name.has_suffix ("_async")) { finish_name = finish_name.substring (0, finish_name.length - "_async".length); } finish_name += "_finish"; - do_write_signature (m, tag_name, instance, m.name, m.get_cname (), m.get_async_begin_parameters (), new VoidType (), false); + do_write_signature (m, tag_name, instance, name, m.get_cname (), m.get_async_begin_parameters (), new VoidType (), false); do_write_signature (m, tag_name, instance, finish_name, m.get_finish_cname (), m.get_async_end_parameters (), m.return_type, m.tree_can_fail); } else { - do_write_signature (m, tag_name, instance, m.name, m.get_cname (), m.get_parameters (), m.return_type, m.tree_can_fail); + do_write_signature (m, tag_name, instance, name, m.get_cname (), m.get_parameters (), m.return_type, m.tree_can_fail); } } diff --git a/vala/valasymbol.vala b/vala/valasymbol.vala index 553544c0f..5228e0e43 100644 --- a/vala/valasymbol.vala +++ b/vala/valasymbol.vala @@ -215,10 +215,12 @@ public abstract class Vala.Symbol : CodeNode { return gir_name; } - if (name.has_prefix (".")) { - return "%s%s".printf (parent_symbol.get_full_gir_name (), gir_name); + string parent_gir_name = parent_symbol.get_full_gir_name (); + string self_gir_name = gir_name.has_prefix (".") ? gir_name.offset (1) : gir_name; + if (parent_gir_name.str (".") != null) { + return "%s%s".printf (parent_gir_name, self_gir_name); } else { - return "%s.%s".printf (parent_symbol.get_full_gir_name (), gir_name); + return "%s.%s".printf (parent_gir_name, self_gir_name); } }