diff --git a/ChangeLog b/ChangeLog index 023fe7b18..2433b7175 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2009-04-25 Mike Kestner + + * parser/gapi-fixup.cs: add remove-attr and change-node-type + fixup rules. [Fixes #494194] + 2009-04-25 Mike Kestner * generator/OpaqueGen.cs: support declaring managed ifaces. diff --git a/parser/gapi-fixup.cs b/parser/gapi-fixup.cs index 315e6cea9..67a9d82bb 100644 --- a/parser/gapi-fixup.cs +++ b/parser/gapi-fixup.cs @@ -120,6 +120,30 @@ namespace GtkSharp.Parsing { if (!matched) Console.WriteLine ("Warning: matched no nodes", path); } + + XPathNodeIterator change_node_type_iter = meta_nav.Select ("/metadata/change-node-type"); + while (change_node_type_iter.MoveNext ()) { + string path = change_node_type_iter.Current.GetAttribute ("path", ""); + XPathNodeIterator api_iter = api_nav.Select (path); + bool matched = false; + while (api_iter.MoveNext ()) { + XmlElement node = ( (IHasXmlNode) api_iter.Current).GetNode () as XmlElement; + XmlElement parent = node.ParentNode as XmlElement; + XmlElement new_node = api_doc.CreateElement (change_node_type_iter.Current.Value); + + foreach (XmlNode child in node.ChildNodes) + new_node.AppendChild (child.Clone ()); + foreach (XmlAttribute attribute in node.Attributes) + new_node.Attributes.Append ( (XmlAttribute) attribute.Clone ()); + + parent.ReplaceChild (new_node, node); + matched = true; + } + + if (!matched) + Console.WriteLine ("Warning: matched no nodes", path); + } + XPathNodeIterator attr_iter = meta_nav.Select ("/metadata/attr"); while (attr_iter.MoveNext ()) { @@ -156,6 +180,24 @@ namespace GtkSharp.Parsing { if (!matched) Console.WriteLine ("Warning: matched no nodes", path); } + + XPathNodeIterator remove_attr_iter = meta_nav.Select ("/metadata/remove-attr"); + while (remove_attr_iter.MoveNext ()) { + string path = remove_attr_iter.Current.GetAttribute ("path", ""); + string name = remove_attr_iter.Current.GetAttribute ("name", ""); + XPathNodeIterator api_iter = api_nav.Select (path); + bool matched = false; + + while (api_iter.MoveNext ()) { + XmlElement node = ( (IHasXmlNode) api_iter.Current).GetNode () as XmlElement; + + node.RemoveAttribute (name); + matched = true; + } + + if (!matched) + Console.WriteLine ("Warning: matched no nodes", path); + } if (symbol_doc != null) { XPathNavigator symbol_nav = symbol_doc.CreateNavigator ();