From 4d19e5ac2a87229735e1cdd43e33997a5a3436b4 Mon Sep 17 00:00:00 2001 From: Bertrand Lorentz Date: Sun, 21 Oct 2012 18:10:34 +0200 Subject: [PATCH] generator: Properly handle boolean attributes when parsing the XML In a lot of places, we were only checking the presence of boolean attributes, like "array", automatically assuming they were true. This meant that we didn't allow setting them explicitly to false, which apparently is needed for some bindings. For all boolean attributes, we now use the GetAttributeAsBoolean method added in the previous commit, to correctly check the value of the attribute. As before, if the attribute is not present, it is considered to be false. Thanks to Stephan Sundermann for noticing this issue. --- generator/ClassBase.cs | 15 ++++----------- generator/Ctor.cs | 3 +-- generator/FieldBase.cs | 4 ++-- generator/GenBase.cs | 6 +----- generator/InterfaceGen.cs | 2 +- generator/Method.cs | 10 +++------- generator/MethodBase.cs | 2 +- generator/ObjectBase.cs | 4 ++-- generator/ObjectField.cs | 2 +- generator/ObjectGen.cs | 5 +++-- generator/OpaqueGen.cs | 2 +- generator/Parameters.cs | 6 +++--- generator/Parser.cs | 7 ++----- generator/Property.cs | 9 ++++----- generator/PropertyBase.cs | 4 ++-- generator/ReturnValue.cs | 8 ++++---- generator/Signal.cs | 4 ++-- generator/StructBase.cs | 2 +- 18 files changed, 38 insertions(+), 57 deletions(-) diff --git a/generator/ClassBase.cs b/generator/ClassBase.cs index 95d5df8c6..ca79e486e 100644 --- a/generator/ClassBase.cs +++ b/generator/ClassBase.cs @@ -61,20 +61,13 @@ namespace GtkSharp.Generation { protected ClassBase (XmlElement ns, XmlElement elem) : base (ns, elem) { - if (elem.HasAttribute ("deprecated")) { - string attr = elem.GetAttribute ("deprecated"); - deprecated = attr == "1" || attr == "true"; - } - - if (elem.HasAttribute ("abstract")) { - string attr = elem.GetAttribute ("abstract"); - isabstract = attr == "1" || attr == "true"; - } + deprecated = elem.GetAttributeAsBoolean ("deprecated"); + isabstract = elem.GetAttributeAsBoolean ("abstract"); foreach (XmlNode node in elem.ChildNodes) { if (!(node is XmlElement)) continue; XmlElement member = (XmlElement) node; - if (member.HasAttribute ("hidden")) + if (member.GetAttributeAsBoolean ("hidden")) continue; string name; @@ -227,7 +220,7 @@ namespace GtkSharp.Generation { if (node.Name != "interface") continue; XmlElement element = (XmlElement) node; - if (element.HasAttribute ("hidden")) + if (element.GetAttributeAsBoolean ("hidden")) continue; if (element.HasAttribute ("cname")) interfaces.Add (element.GetAttribute ("cname")); diff --git a/generator/Ctor.cs b/generator/Ctor.cs index 53d583607..a819043f8 100644 --- a/generator/Ctor.cs +++ b/generator/Ctor.cs @@ -35,8 +35,7 @@ namespace GtkSharp.Generation { public Ctor (XmlElement elem, ClassBase implementor) : base (elem, implementor) { - if (elem.HasAttribute ("preferred")) - preferred = true; + preferred = elem.GetAttributeAsBoolean ("preferred"); if (implementor is ObjectGen) needs_chaining = true; name = implementor.Name; diff --git a/generator/FieldBase.cs b/generator/FieldBase.cs index 6a9b78294..7e18bbb36 100644 --- a/generator/FieldBase.cs +++ b/generator/FieldBase.cs @@ -62,7 +62,7 @@ namespace GtkSharp.Generation { public bool IsArray { get { - return elem.HasAttribute("array_len") || elem.HasAttribute("array"); + return elem.HasAttribute ("array_len") || elem.GetAttributeAsBoolean ("array"); } } @@ -153,7 +153,7 @@ namespace GtkSharp.Generation { SymbolTable table = SymbolTable.Table; StreamWriter sw = gen_info.Writer; - string modifiers = elem.HasAttribute ("new_flag") ? "new " : ""; + string modifiers = elem.GetAttributeAsBoolean ("new_flag") ? "new " : ""; bool is_struct = table.IsStruct (CType) || table.IsBoxed (CType); sw.WriteLine (indent + "public " + modifiers + CSType + " " + Name + " {"); diff --git a/generator/GenBase.cs b/generator/GenBase.cs index 378e3c845..d64497d96 100644 --- a/generator/GenBase.cs +++ b/generator/GenBase.cs @@ -58,11 +58,7 @@ namespace GtkSharp.Generation { public bool IsInternal { get { - if (elem.HasAttribute ("internal")) { - string attr = elem.GetAttribute ("internal"); - return attr == "1" || attr == "true"; - } - return false; + return elem.GetAttributeAsBoolean ("internal"); } } diff --git a/generator/InterfaceGen.cs b/generator/InterfaceGen.cs index 9978c7ae4..92e13f614 100644 --- a/generator/InterfaceGen.cs +++ b/generator/InterfaceGen.cs @@ -33,7 +33,7 @@ namespace GtkSharp.Generation { public InterfaceGen (XmlElement ns, XmlElement elem) : base (ns, elem, true) { - consume_only = elem.HasAttribute ("consume_only"); + consume_only = elem.GetAttributeAsBoolean ("consume_only"); foreach (XmlNode node in elem.ChildNodes) { if (!(node is XmlElement)) continue; XmlElement member = (XmlElement) node; diff --git a/generator/Method.cs b/generator/Method.cs index c2444bb0f..39758ef82 100644 --- a/generator/Method.cs +++ b/generator/Method.cs @@ -40,15 +40,11 @@ namespace GtkSharp.Generation { { this.retval = new ReturnValue (elem["return-type"]); - if (!container_type.IsDeprecated && elem.HasAttribute ("deprecated")) { - string attr = elem.GetAttribute ("deprecated"); - deprecated = attr == "1" || attr == "true"; + if (!container_type.IsDeprecated) { + deprecated = elem.GetAttributeAsBoolean ("deprecated"); } - if (elem.HasAttribute ("win32_utf8_variant")) { - string attr = elem.GetAttribute ("win32_utf8_variant"); - win32_utf8_variant = attr == "1" || attr.ToLower () == "true"; - } + win32_utf8_variant = elem.GetAttributeAsBoolean ("win32_utf8_variant"); if (Name == "GetType") Name = "GetGType"; diff --git a/generator/MethodBase.cs b/generator/MethodBase.cs index ce6aa726c..882045c2b 100644 --- a/generator/MethodBase.cs +++ b/generator/MethodBase.cs @@ -41,7 +41,7 @@ namespace GtkSharp.Generation { this.name = elem.GetAttribute ("name"); parms = new Parameters (elem ["parameters"]); IsStatic = elem.GetAttribute ("shared") == "true"; - if (elem.HasAttribute ("new_flag")) + if (elem.GetAttributeAsBoolean ("new_flag")) mods = "new "; if (elem.HasAttribute ("accessibility")) { string attr = elem.GetAttribute ("accessibility"); diff --git a/generator/ObjectBase.cs b/generator/ObjectBase.cs index 31a86db27..3ddf333fd 100644 --- a/generator/ObjectBase.cs +++ b/generator/ObjectBase.cs @@ -69,7 +69,7 @@ namespace GtkSharp.Generation { else signal_vms.Add (member.GetAttribute ("field_name"), member); - if (member.GetAttribute ("hidden") != "1") { + if (!member.GetAttributeAsBoolean ("hidden")) { string name = member.GetAttribute("name"); while (sigs.ContainsKey(name)) name += "mangled"; @@ -130,7 +130,7 @@ namespace GtkSharp.Generation { } else vm = new GObjectVM (vm_elem, this); - if (vm_elem.GetAttribute ("padding") == "true" || vm_elem.GetAttribute ("hidden") == "1") + if (vm_elem.GetAttributeAsBoolean ("padding") || vm_elem.GetAttributeAsBoolean ("hidden")) hidden_vms.Add (vm); else { if (vm is GObjectVM) diff --git a/generator/ObjectField.cs b/generator/ObjectField.cs index 47e015623..f0edd1a5e 100644 --- a/generator/ObjectField.cs +++ b/generator/ObjectField.cs @@ -34,7 +34,7 @@ namespace GtkSharp.Generation { protected override bool Writable { get { - return elem.GetAttribute ("writeable") == "true"; + return elem.GetAttributeAsBoolean ("writeable"); } } diff --git a/generator/ObjectGen.cs b/generator/ObjectGen.cs index f841d5328..0900f9fde 100644 --- a/generator/ObjectGen.cs +++ b/generator/ObjectGen.cs @@ -40,7 +40,8 @@ namespace GtkSharp.Generation { foreach (XmlNode node in elem.ChildNodes) { if (!(node is XmlElement)) continue; XmlElement member = (XmlElement) node; - if (member.HasAttribute ("hidden") && member.GetAttribute ("hidden") == "1") continue; + if (member.GetAttributeAsBoolean ("hidden")) + continue; switch (node.Name) { case "callback": @@ -93,7 +94,7 @@ namespace GtkSharp.Generation { private bool DisableVoidCtor { get { - return Elem.HasAttribute ("disable_void_ctor"); + return Elem.GetAttributeAsBoolean ("disable_void_ctor"); } } diff --git a/generator/OpaqueGen.cs b/generator/OpaqueGen.cs index 89b175c3f..1926f7dc2 100644 --- a/generator/OpaqueGen.cs +++ b/generator/OpaqueGen.cs @@ -37,7 +37,7 @@ namespace GtkSharp.Generation { private bool DisableRawCtor { get { - return Elem.HasAttribute ("disable_raw_ctor"); + return Elem.GetAttributeAsBoolean ("disable_raw_ctor"); } } diff --git a/generator/Parameters.cs b/generator/Parameters.cs index f599d5222..c2d353de6 100644 --- a/generator/Parameters.cs +++ b/generator/Parameters.cs @@ -81,13 +81,13 @@ namespace GtkSharp.Generation { public bool IsArray { get { - return elem.HasAttribute("array") || elem.HasAttribute("null_term_array"); + return elem.GetAttributeAsBoolean ("array") || elem.GetAttributeAsBoolean ("null_term_array"); } } public bool IsEllipsis { get { - return elem.HasAttribute("ellipsis"); + return elem.GetAttributeAsBoolean ("ellipsis"); } } @@ -330,7 +330,7 @@ namespace GtkSharp.Generation { public ArrayParameter (XmlElement elem) : base (elem) { - null_terminated = elem.HasAttribute ("null_term_array"); + null_terminated = elem.GetAttributeAsBoolean ("null_term_array"); } public override string MarshalType { diff --git a/generator/Parser.cs b/generator/Parser.cs index 99581fc52..e5c1816b2 100644 --- a/generator/Parser.cs +++ b/generator/Parser.cs @@ -107,13 +107,10 @@ namespace GtkSharp.Generation { if (elem == null) continue; - if (elem.HasAttribute("hidden")) + if (elem.GetAttributeAsBoolean ("hidden")) continue; - bool is_opaque = false; - if (elem.GetAttribute ("opaque") == "true" || - elem.GetAttribute ("opaque") == "1") - is_opaque = true; + bool is_opaque = elem.GetAttributeAsBoolean ("opaque"); switch (def.Name) { case "alias": diff --git a/generator/Property.cs b/generator/Property.cs index 91dd066e4..5842df869 100644 --- a/generator/Property.cs +++ b/generator/Property.cs @@ -45,22 +45,21 @@ namespace GtkSharp.Generation { bool Readable { get { - return elem.GetAttribute ("readable") == "true"; + return elem.GetAttributeAsBoolean ("readable"); } } bool Writable { get { - return elem.GetAttribute ("writeable") == "true" && - !elem.HasAttribute ("construct-only"); + return elem.GetAttributeAsBoolean ("writeable") && + !elem.GetAttributeAsBoolean ("construct-only"); } } bool IsDeprecated { get { return !container_type.IsDeprecated && - (elem.GetAttribute ("deprecated") == "1" || - elem.GetAttribute ("deprecated") == "true"); + elem.GetAttributeAsBoolean ("deprecated"); } } diff --git a/generator/PropertyBase.cs b/generator/PropertyBase.cs index ef106f6bc..a673b7100 100644 --- a/generator/PropertyBase.cs +++ b/generator/PropertyBase.cs @@ -74,13 +74,13 @@ namespace GtkSharp.Generation { public bool Hidden { get { - return elem.HasAttribute("hidden"); + return elem.GetAttributeAsBoolean ("hidden"); } } protected bool IsNew { get { - return elem.HasAttribute("new_flag"); + return elem.GetAttributeAsBoolean ("new_flag"); } } diff --git a/generator/ReturnValue.cs b/generator/ReturnValue.cs index 6da64f364..bbe55a080 100644 --- a/generator/ReturnValue.cs +++ b/generator/ReturnValue.cs @@ -40,11 +40,11 @@ namespace GtkSharp.Generation { public ReturnValue (XmlElement elem) { if (elem != null) { - is_null_term = elem.HasAttribute ("null_term_array"); - is_array = elem.HasAttribute ("array") || elem.HasAttribute ("array_length_param"); + is_null_term = elem.GetAttributeAsBoolean ("null_term_array"); + is_array = elem.GetAttributeAsBoolean ("array") || elem.HasAttribute ("array_length_param"); array_length_param = elem.GetAttribute ("array_length_param"); - elements_owned = elem.GetAttribute ("elements_owned") == "true"; - owned = elem.GetAttribute ("owned") == "true"; + elements_owned = elem.GetAttributeAsBoolean ("elements_owned"); + owned = elem.GetAttributeAsBoolean ("owned"); ctype = elem.GetAttribute("type"); default_value = elem.GetAttribute ("default_value"); element_ctype = elem.GetAttribute ("element_type"); diff --git a/generator/Signal.cs b/generator/Signal.cs index ee61c98b4..de4d601b0 100644 --- a/generator/Signal.cs +++ b/generator/Signal.cs @@ -76,7 +76,7 @@ namespace GtkSharp.Generation { public void GenerateDecl (StreamWriter sw) { - if (elem.HasAttribute("new_flag") || (container_type != null && container_type.GetSignalRecursively (Name) != null)) + if (elem.GetAttributeAsBoolean ("new_flag") || (container_type != null && container_type.GetSignalRecursively (Name) != null)) sw.Write("new "); sw.WriteLine ("\t\tevent " + EventHandlerQualifiedName + " " + Name + ";"); @@ -242,7 +242,7 @@ namespace GtkSharp.Generation { private bool NeedNew (ObjectBase implementor) { - return elem.HasAttribute ("new_flag") || + return elem.GetAttributeAsBoolean ("new_flag") || (container_type != null && container_type.GetSignalRecursively (Name) != null) || (implementor != null && implementor.GetSignalRecursively (Name) != null); } diff --git a/generator/StructBase.cs b/generator/StructBase.cs index 9a0b380c7..38bbdc7d8 100644 --- a/generator/StructBase.cs +++ b/generator/StructBase.cs @@ -103,7 +103,7 @@ namespace GtkSharp.Generation { private bool DisableNew { get { - return Elem.HasAttribute ("disable_new"); + return Elem.GetAttributeAsBoolean ("disable_new"); } }