Skip to content

Commit d83379e

Browse files
committed
Struct Scraping Support
1 parent ef62a5c commit d83379e

File tree

3 files changed

+36
-1
lines changed

3 files changed

+36
-1
lines changed

src/generators/Silk.NET.SilkTouch.Scraper/ClangScraper.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public sealed class ClangScraper
3535
/// <returns>Any number of symbols scraped from the given xml</returns>
3636
public IEnumerable<Symbol> ScrapeXML(XmlDocument document)
3737
{
38-
var bindings = document.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.LocalName == "bindings" && x is XmlElement) as XmlElement;
38+
var bindings = document.ChildNodes.Cast<XmlNode>().OfType<XmlElement>().FirstOrDefault();
3939

4040
if (bindings is null)
4141
{

src/generators/Silk.NET.SilkTouch.Scraper/XmlVisitor.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,27 @@ public IEnumerable<Symbol> Visit(XmlNode node)
2121
return VisitBinding(bindings);
2222
case XmlElement { Name: "namespace" } @namespace:
2323
return VisitNamespace(@namespace);
24+
case XmlElement { Name: "struct" } @struct:
25+
return VisitStruct(@struct);
2426
default:
2527
{
2628
throw new NotImplementedException();
2729
}
2830
}
2931
}
3032

33+
private IEnumerable<Symbol> VisitStruct(XmlElement @struct)
34+
{
35+
return new[]
36+
{
37+
new StructSymbol
38+
(
39+
new IdentifierSymbol(@struct.Attributes?["name"]?.Value ?? throw new InvalidOperationException()),
40+
StructLayout.Empty
41+
)
42+
};
43+
}
44+
3145
private IEnumerable<Symbol> VisitBinding(XmlElement bindings)
3246
{
3347
return bindings.ChildNodes.Cast<XmlNode>().Where(x => x is not null).SelectMany(Visit);

tests/Silk.NET.SilkTouch.Scraper.Tests/StructScrapingTests.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
// Licensed to the .NET Foundation under one or more agreements.
22
// The .NET Foundation licenses this file to you under the MIT license.
33

4+
using System.Xml;
5+
using Silk.NET.SilkTouch.Symbols;
46
using Xunit;
57

68
namespace Silk.NET.SilkTouch.Scraper.Tests;
@@ -10,6 +12,25 @@ public class StructScrapingTests
1012
[Fact]
1113
public void StructXMLGeneratesStructSymbol()
1214
{
15+
var doc = new XmlDocument();
16+
doc.LoadXml(@"<struct name=""Test""></struct>");
1317

18+
var symbols = new ClangScraper().ScrapeXML(doc);
19+
20+
var symbol = Assert.Single(symbols);
21+
var @struct = Assert.IsType<StructSymbol>(symbol);
22+
}
23+
24+
[Fact]
25+
public void StructXMLGeneratesCorrectIdentifier()
26+
{
27+
var doc = new XmlDocument();
28+
doc.LoadXml(@"<struct name=""Test""></struct>");
29+
30+
var symbols = new ClangScraper().ScrapeXML(doc);
31+
32+
var symbol = Assert.Single(symbols);
33+
var @struct = Assert.IsType<StructSymbol>(symbol);
34+
Assert.Equal("Test", @struct.Identifier.Value);
1435
}
1536
}

0 commit comments

Comments
 (0)