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.
This commit is contained in:
Bertrand Lorentz 2012-10-21 18:10:34 +02:00
parent d35ef48f86
commit 4d19e5ac2a
18 changed files with 38 additions and 57 deletions

View File

@ -61,20 +61,13 @@ namespace GtkSharp.Generation {
protected ClassBase (XmlElement ns, XmlElement elem) : base (ns, elem) { protected ClassBase (XmlElement ns, XmlElement elem) : base (ns, elem) {
if (elem.HasAttribute ("deprecated")) { deprecated = elem.GetAttributeAsBoolean ("deprecated");
string attr = elem.GetAttribute ("deprecated"); isabstract = elem.GetAttributeAsBoolean ("abstract");
deprecated = attr == "1" || attr == "true";
}
if (elem.HasAttribute ("abstract")) {
string attr = elem.GetAttribute ("abstract");
isabstract = attr == "1" || attr == "true";
}
foreach (XmlNode node in elem.ChildNodes) { foreach (XmlNode node in elem.ChildNodes) {
if (!(node is XmlElement)) continue; if (!(node is XmlElement)) continue;
XmlElement member = (XmlElement) node; XmlElement member = (XmlElement) node;
if (member.HasAttribute ("hidden")) if (member.GetAttributeAsBoolean ("hidden"))
continue; continue;
string name; string name;
@ -227,7 +220,7 @@ namespace GtkSharp.Generation {
if (node.Name != "interface") if (node.Name != "interface")
continue; continue;
XmlElement element = (XmlElement) node; XmlElement element = (XmlElement) node;
if (element.HasAttribute ("hidden")) if (element.GetAttributeAsBoolean ("hidden"))
continue; continue;
if (element.HasAttribute ("cname")) if (element.HasAttribute ("cname"))
interfaces.Add (element.GetAttribute ("cname")); interfaces.Add (element.GetAttribute ("cname"));

View File

@ -35,8 +35,7 @@ namespace GtkSharp.Generation {
public Ctor (XmlElement elem, ClassBase implementor) : base (elem, implementor) public Ctor (XmlElement elem, ClassBase implementor) : base (elem, implementor)
{ {
if (elem.HasAttribute ("preferred")) preferred = elem.GetAttributeAsBoolean ("preferred");
preferred = true;
if (implementor is ObjectGen) if (implementor is ObjectGen)
needs_chaining = true; needs_chaining = true;
name = implementor.Name; name = implementor.Name;

View File

@ -62,7 +62,7 @@ namespace GtkSharp.Generation {
public bool IsArray { public bool IsArray {
get { 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; SymbolTable table = SymbolTable.Table;
StreamWriter sw = gen_info.Writer; 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); bool is_struct = table.IsStruct (CType) || table.IsBoxed (CType);
sw.WriteLine (indent + "public " + modifiers + CSType + " " + Name + " {"); sw.WriteLine (indent + "public " + modifiers + CSType + " " + Name + " {");

View File

@ -58,11 +58,7 @@ namespace GtkSharp.Generation {
public bool IsInternal { public bool IsInternal {
get { get {
if (elem.HasAttribute ("internal")) { return elem.GetAttributeAsBoolean ("internal");
string attr = elem.GetAttribute ("internal");
return attr == "1" || attr == "true";
}
return false;
} }
} }

View File

@ -33,7 +33,7 @@ namespace GtkSharp.Generation {
public InterfaceGen (XmlElement ns, XmlElement elem) : base (ns, elem, true) 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) { foreach (XmlNode node in elem.ChildNodes) {
if (!(node is XmlElement)) continue; if (!(node is XmlElement)) continue;
XmlElement member = (XmlElement) node; XmlElement member = (XmlElement) node;

View File

@ -40,15 +40,11 @@ namespace GtkSharp.Generation {
{ {
this.retval = new ReturnValue (elem["return-type"]); this.retval = new ReturnValue (elem["return-type"]);
if (!container_type.IsDeprecated && elem.HasAttribute ("deprecated")) { if (!container_type.IsDeprecated) {
string attr = elem.GetAttribute ("deprecated"); deprecated = elem.GetAttributeAsBoolean ("deprecated");
deprecated = attr == "1" || attr == "true";
} }
if (elem.HasAttribute ("win32_utf8_variant")) { win32_utf8_variant = elem.GetAttributeAsBoolean ("win32_utf8_variant");
string attr = elem.GetAttribute ("win32_utf8_variant");
win32_utf8_variant = attr == "1" || attr.ToLower () == "true";
}
if (Name == "GetType") if (Name == "GetType")
Name = "GetGType"; Name = "GetGType";

View File

@ -41,7 +41,7 @@ namespace GtkSharp.Generation {
this.name = elem.GetAttribute ("name"); this.name = elem.GetAttribute ("name");
parms = new Parameters (elem ["parameters"]); parms = new Parameters (elem ["parameters"]);
IsStatic = elem.GetAttribute ("shared") == "true"; IsStatic = elem.GetAttribute ("shared") == "true";
if (elem.HasAttribute ("new_flag")) if (elem.GetAttributeAsBoolean ("new_flag"))
mods = "new "; mods = "new ";
if (elem.HasAttribute ("accessibility")) { if (elem.HasAttribute ("accessibility")) {
string attr = elem.GetAttribute ("accessibility"); string attr = elem.GetAttribute ("accessibility");

View File

@ -69,7 +69,7 @@ namespace GtkSharp.Generation {
else else
signal_vms.Add (member.GetAttribute ("field_name"), member); signal_vms.Add (member.GetAttribute ("field_name"), member);
if (member.GetAttribute ("hidden") != "1") { if (!member.GetAttributeAsBoolean ("hidden")) {
string name = member.GetAttribute("name"); string name = member.GetAttribute("name");
while (sigs.ContainsKey(name)) while (sigs.ContainsKey(name))
name += "mangled"; name += "mangled";
@ -130,7 +130,7 @@ namespace GtkSharp.Generation {
} else } else
vm = new GObjectVM (vm_elem, this); 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); hidden_vms.Add (vm);
else { else {
if (vm is GObjectVM) if (vm is GObjectVM)

View File

@ -34,7 +34,7 @@ namespace GtkSharp.Generation {
protected override bool Writable { protected override bool Writable {
get { get {
return elem.GetAttribute ("writeable") == "true"; return elem.GetAttributeAsBoolean ("writeable");
} }
} }

View File

@ -40,7 +40,8 @@ namespace GtkSharp.Generation {
foreach (XmlNode node in elem.ChildNodes) { foreach (XmlNode node in elem.ChildNodes) {
if (!(node is XmlElement)) continue; if (!(node is XmlElement)) continue;
XmlElement member = (XmlElement) node; XmlElement member = (XmlElement) node;
if (member.HasAttribute ("hidden") && member.GetAttribute ("hidden") == "1") continue; if (member.GetAttributeAsBoolean ("hidden"))
continue;
switch (node.Name) { switch (node.Name) {
case "callback": case "callback":
@ -93,7 +94,7 @@ namespace GtkSharp.Generation {
private bool DisableVoidCtor { private bool DisableVoidCtor {
get { get {
return Elem.HasAttribute ("disable_void_ctor"); return Elem.GetAttributeAsBoolean ("disable_void_ctor");
} }
} }

View File

@ -37,7 +37,7 @@ namespace GtkSharp.Generation {
private bool DisableRawCtor { private bool DisableRawCtor {
get { get {
return Elem.HasAttribute ("disable_raw_ctor"); return Elem.GetAttributeAsBoolean ("disable_raw_ctor");
} }
} }

View File

@ -81,13 +81,13 @@ namespace GtkSharp.Generation {
public bool IsArray { public bool IsArray {
get { get {
return elem.HasAttribute("array") || elem.HasAttribute("null_term_array"); return elem.GetAttributeAsBoolean ("array") || elem.GetAttributeAsBoolean ("null_term_array");
} }
} }
public bool IsEllipsis { public bool IsEllipsis {
get { get {
return elem.HasAttribute("ellipsis"); return elem.GetAttributeAsBoolean ("ellipsis");
} }
} }
@ -330,7 +330,7 @@ namespace GtkSharp.Generation {
public ArrayParameter (XmlElement elem) : base (elem) public ArrayParameter (XmlElement elem) : base (elem)
{ {
null_terminated = elem.HasAttribute ("null_term_array"); null_terminated = elem.GetAttributeAsBoolean ("null_term_array");
} }
public override string MarshalType { public override string MarshalType {

View File

@ -107,13 +107,10 @@ namespace GtkSharp.Generation {
if (elem == null) if (elem == null)
continue; continue;
if (elem.HasAttribute("hidden")) if (elem.GetAttributeAsBoolean ("hidden"))
continue; continue;
bool is_opaque = false; bool is_opaque = elem.GetAttributeAsBoolean ("opaque");
if (elem.GetAttribute ("opaque") == "true" ||
elem.GetAttribute ("opaque") == "1")
is_opaque = true;
switch (def.Name) { switch (def.Name) {
case "alias": case "alias":

View File

@ -45,22 +45,21 @@ namespace GtkSharp.Generation {
bool Readable { bool Readable {
get { get {
return elem.GetAttribute ("readable") == "true"; return elem.GetAttributeAsBoolean ("readable");
} }
} }
bool Writable { bool Writable {
get { get {
return elem.GetAttribute ("writeable") == "true" && return elem.GetAttributeAsBoolean ("writeable") &&
!elem.HasAttribute ("construct-only"); !elem.GetAttributeAsBoolean ("construct-only");
} }
} }
bool IsDeprecated { bool IsDeprecated {
get { get {
return !container_type.IsDeprecated && return !container_type.IsDeprecated &&
(elem.GetAttribute ("deprecated") == "1" || elem.GetAttributeAsBoolean ("deprecated");
elem.GetAttribute ("deprecated") == "true");
} }
} }

View File

@ -74,13 +74,13 @@ namespace GtkSharp.Generation {
public bool Hidden { public bool Hidden {
get { get {
return elem.HasAttribute("hidden"); return elem.GetAttributeAsBoolean ("hidden");
} }
} }
protected bool IsNew { protected bool IsNew {
get { get {
return elem.HasAttribute("new_flag"); return elem.GetAttributeAsBoolean ("new_flag");
} }
} }

View File

@ -40,11 +40,11 @@ namespace GtkSharp.Generation {
public ReturnValue (XmlElement elem) public ReturnValue (XmlElement elem)
{ {
if (elem != null) { if (elem != null) {
is_null_term = elem.HasAttribute ("null_term_array"); is_null_term = elem.GetAttributeAsBoolean ("null_term_array");
is_array = elem.HasAttribute ("array") || elem.HasAttribute ("array_length_param"); is_array = elem.GetAttributeAsBoolean ("array") || elem.HasAttribute ("array_length_param");
array_length_param = elem.GetAttribute ("array_length_param"); array_length_param = elem.GetAttribute ("array_length_param");
elements_owned = elem.GetAttribute ("elements_owned") == "true"; elements_owned = elem.GetAttributeAsBoolean ("elements_owned");
owned = elem.GetAttribute ("owned") == "true"; owned = elem.GetAttributeAsBoolean ("owned");
ctype = elem.GetAttribute("type"); ctype = elem.GetAttribute("type");
default_value = elem.GetAttribute ("default_value"); default_value = elem.GetAttribute ("default_value");
element_ctype = elem.GetAttribute ("element_type"); element_ctype = elem.GetAttribute ("element_type");

View File

@ -76,7 +76,7 @@ namespace GtkSharp.Generation {
public void GenerateDecl (StreamWriter sw) 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.Write("new ");
sw.WriteLine ("\t\tevent " + EventHandlerQualifiedName + " " + Name + ";"); sw.WriteLine ("\t\tevent " + EventHandlerQualifiedName + " " + Name + ";");
@ -242,7 +242,7 @@ namespace GtkSharp.Generation {
private bool NeedNew (ObjectBase implementor) private bool NeedNew (ObjectBase implementor)
{ {
return elem.HasAttribute ("new_flag") || return elem.GetAttributeAsBoolean ("new_flag") ||
(container_type != null && container_type.GetSignalRecursively (Name) != null) || (container_type != null && container_type.GetSignalRecursively (Name) != null) ||
(implementor != null && implementor.GetSignalRecursively (Name) != null); (implementor != null && implementor.GetSignalRecursively (Name) != null);
} }

View File

@ -103,7 +103,7 @@ namespace GtkSharp.Generation {
private bool DisableNew { private bool DisableNew {
get { get {
return Elem.HasAttribute ("disable_new"); return Elem.GetAttributeAsBoolean ("disable_new");
} }
} }