Improved override/overload lookup

The lookup for function overrides and overloads now tries to work
around extension case mismatches (e.g. IBM vs Ibm). This fixes a few
specific cases of missing overrides.
This commit is contained in:
Stefanos A 2013-11-14 11:31:36 +01:00
parent d28c428e99
commit 5f7008d746

View file

@ -79,10 +79,12 @@ namespace Bind
{ {
foreach (var d in signatures) foreach (var d in signatures)
{ {
var replace = GetFuncOverride(nav, d, apiname, apiversion);
TranslateExtension(d); TranslateExtension(d);
TranslateReturnType(enum_processor, nav, d, enums, apiname, version); TranslateReturnType(d, replace, nav, enum_processor, enums, apiname, version);
TranslateParameters(enum_processor, nav, d, enums, apiname, version); TranslateParameters(d, replace, nav, enum_processor, enums, apiname, version);
TranslateAttributes(nav, d, enums, apiname, version); TranslateAttributes(d, replace, nav, apiname, version);
} }
} }
@ -95,8 +97,9 @@ namespace Bind
foreach (XPathNavigator overload_element in overload_elements) foreach (XPathNavigator overload_element in overload_elements)
{ {
var overload = new Delegate(d); var overload = new Delegate(d);
ApplyParameterReplacement(overload, overload_element); TranslateReturnType(overload, overload_element, nav, enum_processor, enums, apiname, version);
ApplyReturnTypeReplacement(overload, overload_element); TranslateParameters(overload, overload_element, nav, enum_processor, enums, apiname, version);
TranslateAttributes(overload, overload_element, nav, apiname, version);
overload_list.Add(overload); overload_list.Add(overload);
} }
} }
@ -196,7 +199,9 @@ namespace Bind
return GetPath("replace", apiname, apiversion, function, extension); return GetPath("replace", apiname, apiversion, function, extension);
} }
void TranslateType(Bind.Structures.Type type, EnumProcessor enum_processor, XPathNavigator overrides, EnumCollection enums, void TranslateType(Bind.Structures.Type type,
XPathNavigator function_override, XPathNavigator overrides,
EnumProcessor enum_processor, EnumCollection enums,
string category, string apiname) string category, string apiname)
{ {
Bind.Structures.Enum @enum; Bind.Structures.Enum @enum;
@ -209,6 +214,7 @@ namespace Bind
bool normal = enums.TryGetValue(type.CurrentType, out @enum); bool normal = enums.TryGetValue(type.CurrentType, out @enum);
// Translate enum types // Translate enum types
type.IsEnum = false;
if (normal && @enum.Name != "GLenum" && @enum.Name != "Boolean") if (normal && @enum.Name != "GLenum" && @enum.Name != "Boolean")
{ {
type.IsEnum = true; type.IsEnum = true;
@ -256,8 +262,6 @@ namespace Bind
} }
else else
{ {
type.IsEnum = false;
// Todo: what is the point of this here? It is overwritten below. // Todo: what is the point of this here? It is overwritten below.
// A few translations for consistency // A few translations for consistency
switch (type.CurrentType.ToLower()) switch (type.CurrentType.ToLower())
@ -300,16 +304,29 @@ namespace Bind
"[Error] Type '{0}' has a high pointer level. Bindings will be incorrect.", "[Error] Type '{0}' has a high pointer level. Bindings will be incorrect.",
type)); type));
} }
if (!type.IsEnum)
{
// Remove qualifier if type is not an enum
// Resolves issues when replacing / overriding
// an enum parameter with a non-enum type
type.QualifiedType = type.CurrentType;
}
} }
void TranslateExtension(Delegate d) static string TranslateExtension(string extension)
{ {
var extension = d.Extension.ToUpper(); extension = extension.ToUpper();
if (extension.Length > 2) if (extension.Length > 2)
{ {
extension = extension[0] + extension.Substring(1).ToLower(); extension = extension[0] + extension.Substring(1).ToLower();
} }
d.Extension = extension; return extension;
}
void TranslateExtension(Delegate d)
{
d.Extension = TranslateExtension(d.Extension);
} }
static string GetTrimmedExtension(string name, string extension) static string GetTrimmedExtension(string name, string extension)
@ -375,28 +392,47 @@ namespace Bind
static XPathNodeIterator GetFuncOverload(XPathNavigator nav, Delegate d, string apiname, string apiversion) static XPathNodeIterator GetFuncOverload(XPathNavigator nav, Delegate d, string apiname, string apiversion)
{ {
string ext = d.Extension; // Try a few different extension variations that appear in the overrides xml file
string[] extensions = { d.Extension, TranslateExtension(d.Extension), d.Extension.ToUpper() };
string trimmed_name = GetTrimmedName(d); string trimmed_name = GetTrimmedName(d);
string extensionless_name = GetTrimmedExtension(d.Name, ext); XPathNodeIterator function_overload = null;
var function_overload = nav.Select(GetOverloadsPath(apiname, apiversion, d.Name, ext)); foreach (var ext in extensions)
if (function_overload.Count == 0) {
string extensionless_name = GetTrimmedExtension(d.Name, ext);
function_overload = nav.Select(GetOverloadsPath(apiname, apiversion, d.Name, ext));
if (function_overload.Count != 0)
break;
function_overload = nav.Select(GetOverloadsPath(apiname, apiversion, extensionless_name, ext)); function_overload = nav.Select(GetOverloadsPath(apiname, apiversion, extensionless_name, ext));
if (function_overload.Count == 0) if (function_overload.Count != 0)
break;
function_overload = nav.Select(GetOverloadsPath(apiname, apiversion, trimmed_name, ext)); function_overload = nav.Select(GetOverloadsPath(apiname, apiversion, trimmed_name, ext));
if (function_overload.Count != 0)
break;
}
return function_overload; return function_overload;
} }
static XPathNavigator GetFuncOverride(XPathNavigator nav, Delegate d, string apiname, string apiversion) static XPathNavigator GetFuncOverride(XPathNavigator nav, Delegate d, string apiname, string apiversion)
{ {
string ext = d.Extension; // Try a few different extension variations that appear in the overrides xml file
string[] extensions = { d.Extension, TranslateExtension(d.Extension), d.Extension.ToUpper() };
string trimmed_name = GetTrimmedName(d); string trimmed_name = GetTrimmedName(d);
string extensionless_name = GetTrimmedExtension(d.Name, ext); XPathNavigator function_override = null;
var function_override = foreach (var ext in extensions)
{
string extensionless_name = GetTrimmedExtension(d.Name, ext);
function_override =
nav.SelectSingleNode(GetOverridesPath(apiname, apiversion, d.Name, ext)) ?? nav.SelectSingleNode(GetOverridesPath(apiname, apiversion, d.Name, ext)) ??
nav.SelectSingleNode(GetOverridesPath(apiname, apiversion, extensionless_name, ext)) ?? nav.SelectSingleNode(GetOverridesPath(apiname, apiversion, extensionless_name, ext)) ??
nav.SelectSingleNode(GetOverridesPath(apiname, apiversion, trimmed_name, ext)); nav.SelectSingleNode(GetOverridesPath(apiname, apiversion, trimmed_name, ext));
if (function_override != null)
{
break;
}
}
return function_override; return function_override;
} }
@ -460,13 +496,14 @@ namespace Bind
// 3) A generic object or void* (translates to IntPtr) // 3) A generic object or void* (translates to IntPtr)
// 4) A GLenum (translates to int on Legacy.Tao or GL.Enums.GLenum otherwise). // 4) A GLenum (translates to int on Legacy.Tao or GL.Enums.GLenum otherwise).
// Return types must always be CLS-compliant, because .Net does not support overloading on return types. // Return types must always be CLS-compliant, because .Net does not support overloading on return types.
void TranslateReturnType(EnumProcessor enum_processor, XPathNavigator nav, Delegate d, void TranslateReturnType(Delegate d,
EnumCollection enums, string apiname, string apiversion) XPathNavigator function_override, XPathNavigator nav,
EnumProcessor enum_processor, EnumCollection enums,
string apiname, string apiversion)
{ {
var function_override = GetFuncOverride(nav, d, apiname, apiversion);
ApplyReturnTypeReplacement(d, function_override); ApplyReturnTypeReplacement(d, function_override);
TranslateType(d.ReturnType, enum_processor, nav, enums, d.Category, apiname); TranslateType(d.ReturnType, function_override, nav, enum_processor,enums, d.Category, apiname);
if (d.ReturnType.CurrentType.ToLower().Contains("void") && d.ReturnType.Pointer != 0) if (d.ReturnType.CurrentType.ToLower().Contains("void") && d.ReturnType.Pointer != 0)
{ {
@ -513,26 +550,27 @@ namespace Bind
return f; return f;
} }
void TranslateParameters(EnumProcessor enum_processor, void TranslateParameters(Delegate d,
XPathNavigator nav, Delegate d, EnumCollection enums, XPathNavigator function_override, XPathNavigator nav,
EnumProcessor enum_processor, EnumCollection enums,
string apiname, string apiversion) string apiname, string apiversion)
{ {
var function_override = GetFuncOverride(nav, d, apiname, apiversion);
ApplyParameterReplacement(d, function_override); ApplyParameterReplacement(d, function_override);
for (int i = 0; i < d.Parameters.Count; i++) for (int i = 0; i < d.Parameters.Count; i++)
{ {
TranslateParameter(d.Parameters[i], enum_processor, nav, enums, d.Category, apiname); TranslateParameter(d.Parameters[i], function_override, nav, enum_processor, enums, d.Category, apiname);
if (d.Parameters[i].CurrentType == "UInt16" && d.Name.Contains("LineStipple")) if (d.Parameters[i].CurrentType == "UInt16" && d.Name.Contains("LineStipple"))
d.Parameters[i].WrapperType = WrapperTypes.UncheckedParameter; d.Parameters[i].WrapperType = WrapperTypes.UncheckedParameter;
} }
} }
void TranslateParameter(Parameter p, EnumProcessor enum_processor, void TranslateParameter(Parameter p,
XPathNavigator overrides, EnumCollection enums, XPathNavigator function_override, XPathNavigator overrides,
EnumProcessor enum_processor, EnumCollection enums,
string category, string apiname) string category, string apiname)
{ {
TranslateType(p, enum_processor, overrides, enums, category, apiname); TranslateType(p, function_override, overrides, enum_processor, enums, category, apiname);
// Find out the necessary wrapper types. // Find out the necessary wrapper types.
if (p.Pointer != 0)/* || CurrentType == "IntPtr")*/ if (p.Pointer != 0)/* || CurrentType == "IntPtr")*/
@ -585,11 +623,10 @@ namespace Bind
// WrapperType = WrapperTypes.BoolParameter; // WrapperType = WrapperTypes.BoolParameter;
} }
void TranslateAttributes(XPathNavigator nav, Delegate d, EnumCollection enums, void TranslateAttributes(Delegate d,
XPathNavigator function_override, XPathNavigator nav,
string apiname, string apiversion) string apiname, string apiversion)
{ {
var function_override = GetFuncOverride(nav, d, apiname, apiversion);
if (function_override != null) if (function_override != null)
{ {
var version_override = function_override.SelectSingleNode("version"); var version_override = function_override.SelectSingleNode("version");