Added ReadDelegates overload that works with a XPathNavigator directly. Necessary for new overrides.xml handling.

This commit is contained in:
the_fiddler 2010-12-03 09:43:08 +00:00
parent 58bebc8315
commit 47b16778ce

View file

@ -40,73 +40,74 @@ namespace Bind
class XmlSpecReader : ISpecReader class XmlSpecReader : ISpecReader
{ {
public DelegateCollection ReadDelegates(StreamReader specFile) #region Public Members
public DelegateCollection ReadDelegates(XPathNavigator specs)
{ {
DelegateCollection delegates = new DelegateCollection(); DelegateCollection delegates = new DelegateCollection();
XPathDocument specs = new XPathDocument(specFile);
XPathDocument overrides = new XPathDocument(new StreamReader(
Path.Combine(Settings.InputPath, Settings.OverridesFile)));
foreach (XPathNavigator nav in new XPathNavigator[] { foreach (XPathNavigator node in specs.SelectChildren("function", String.Empty))
specs.CreateNavigator().SelectSingleNode("/signatures"),
overrides.CreateNavigator().SelectSingleNode("/overrides/add") })
{ {
if (nav != null) var name = node.GetAttribute("name", String.Empty);
// Check whether we are adding to an existing delegate or creating a new one.
Delegate d = null;
if (delegates.ContainsKey(name))
{ {
foreach (XPathNavigator node in nav.SelectChildren("function", String.Empty)) d = delegates[name];
}
else
{
d = new Delegate();
d.Name = name;
d.Version = node.GetAttribute("version", String.Empty);
d.Category = node.GetAttribute("category", String.Empty);
d.DeprecatedVersion = node.GetAttribute("deprecated", String.Empty);
d.Deprecated = !String.IsNullOrEmpty(d.DeprecatedVersion);
}
foreach (XPathNavigator param in node.SelectChildren(XPathNodeType.Element))
{
switch (param.Name)
{ {
var name = node.GetAttribute("name", String.Empty); case "returns":
d.ReturnType.CurrentType = param.GetAttribute("type", String.Empty);
break;
// Check whether we are adding to an existing delegate or creating a new one. case "param":
Delegate d = null; Parameter p = new Parameter();
if (delegates.ContainsKey(name)) p.CurrentType = param.GetAttribute("type", String.Empty);
{ p.Name = param.GetAttribute("name", String.Empty);
d = delegates[name];
}
else
{
d = new Delegate();
d.Name = name;
d.Version = node.GetAttribute("version", String.Empty);
d.Category = node.GetAttribute("category", String.Empty);
d.DeprecatedVersion = node.GetAttribute("deprecated", String.Empty);
d.Deprecated = !String.IsNullOrEmpty(d.DeprecatedVersion);
}
foreach (XPathNavigator param in node.SelectChildren(XPathNodeType.Element)) string element_count = param.GetAttribute("elementcount", String.Empty);
{ if (String.IsNullOrEmpty(element_count))
switch (param.Name) element_count = param.GetAttribute("count", String.Empty);
{ if (!String.IsNullOrEmpty(element_count))
case "returns": p.ElementCount = Int32.Parse(element_count);
d.ReturnType.CurrentType = param.GetAttribute("type", String.Empty);
break;
case "param": p.Flow = Parameter.GetFlowDirection(param.GetAttribute("flow", String.Empty));
Parameter p = new Parameter();
p.CurrentType = param.GetAttribute("type", String.Empty);
p.Name = param.GetAttribute("name", String.Empty);
string element_count = param.GetAttribute("elementcount", String.Empty); d.Parameters.Add(p);
if (String.IsNullOrEmpty(element_count)) break;
element_count = param.GetAttribute("count", String.Empty);
if (!String.IsNullOrEmpty(element_count))
p.ElementCount = Int32.Parse(element_count);
p.Flow = Parameter.GetFlowDirection(param.GetAttribute("flow", String.Empty));
d.Parameters.Add(p);
break;
}
}
delegates.Add(d);
} }
} }
delegates.Add(d);
} }
return delegates; return delegates;
} }
#endregion
#region ISpecReader Members
public DelegateCollection ReadDelegates(StreamReader specFile)
{
XPathDocument specs = new XPathDocument(specFile);
return ReadDelegates(specs.CreateNavigator().SelectSingleNode("/signatures/add"));
}
public Dictionary<string, string> ReadTypeMap(StreamReader specFile) public Dictionary<string, string> ReadTypeMap(StreamReader specFile)
{ {
Console.WriteLine("Reading opengl types."); Console.WriteLine("Reading opengl types.");
@ -205,8 +206,8 @@ namespace Bind
Path.Combine(Settings.InputPath, Settings.OverridesFile))); Path.Combine(Settings.InputPath, Settings.OverridesFile)));
foreach (XPathNavigator nav in new XPathNavigator[] { foreach (XPathNavigator nav in new XPathNavigator[] {
specs.CreateNavigator().SelectSingleNode("/signatures"), specs.CreateNavigator().SelectSingleNode("/signatures/add"),
overrides.CreateNavigator().SelectSingleNode("/overrides/add") }) overrides.CreateNavigator().SelectSingleNode("/signatures/add") })
{ {
if (nav != null) if (nav != null)
{ {
@ -282,5 +283,7 @@ namespace Bind
Utilities.Merge(enums, all); Utilities.Merge(enums, all);
return enums; return enums;
} }
#endregion
} }
} }