From 49c710ece6eecf123bf4c46420d3b122f80923ab Mon Sep 17 00:00:00 2001 From: Kai Jellinghaus Date: Mon, 9 May 2022 18:49:37 +0200 Subject: [PATCH] Struct Scraping Support --- .../ClangScraper.cs | 2 +- .../Silk.NET.SilkTouch.Scraper/XmlVisitor.cs | 14 +++++++++++++ .../StructScrapingTests.cs | 21 +++++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/generators/Silk.NET.SilkTouch.Scraper/ClangScraper.cs b/src/generators/Silk.NET.SilkTouch.Scraper/ClangScraper.cs index d4cc68a5fd..d8676e96d5 100644 --- a/src/generators/Silk.NET.SilkTouch.Scraper/ClangScraper.cs +++ b/src/generators/Silk.NET.SilkTouch.Scraper/ClangScraper.cs @@ -35,7 +35,7 @@ public sealed class ClangScraper /// Any number of symbols scraped from the given xml public IEnumerable ScrapeXML(XmlDocument document) { - var bindings = document.ChildNodes.Cast().FirstOrDefault(x => x.LocalName == "bindings" && x is XmlElement) as XmlElement; + var bindings = document.ChildNodes.Cast().OfType().FirstOrDefault(); if (bindings is null) { diff --git a/src/generators/Silk.NET.SilkTouch.Scraper/XmlVisitor.cs b/src/generators/Silk.NET.SilkTouch.Scraper/XmlVisitor.cs index bddf336a00..39d84ec8ee 100644 --- a/src/generators/Silk.NET.SilkTouch.Scraper/XmlVisitor.cs +++ b/src/generators/Silk.NET.SilkTouch.Scraper/XmlVisitor.cs @@ -21,6 +21,8 @@ public IEnumerable Visit(XmlNode node) return VisitBinding(bindings); case XmlElement { Name: "namespace" } @namespace: return VisitNamespace(@namespace); + case XmlElement { Name: "struct" } @struct: + return VisitStruct(@struct); default: { throw new NotImplementedException(); @@ -28,6 +30,18 @@ public IEnumerable Visit(XmlNode node) } } + private IEnumerable VisitStruct(XmlElement @struct) + { + return new[] + { + new StructSymbol + ( + new IdentifierSymbol(@struct.Attributes?["name"]?.Value ?? throw new InvalidOperationException()), + StructLayout.Empty + ) + }; + } + private IEnumerable VisitBinding(XmlElement bindings) { return bindings.ChildNodes.Cast().Where(x => x is not null).SelectMany(Visit); diff --git a/tests/Silk.NET.SilkTouch.Scraper.Tests/StructScrapingTests.cs b/tests/Silk.NET.SilkTouch.Scraper.Tests/StructScrapingTests.cs index 56512c68cf..cafff02d74 100644 --- a/tests/Silk.NET.SilkTouch.Scraper.Tests/StructScrapingTests.cs +++ b/tests/Silk.NET.SilkTouch.Scraper.Tests/StructScrapingTests.cs @@ -1,6 +1,8 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Xml; +using Silk.NET.SilkTouch.Symbols; using Xunit; namespace Silk.NET.SilkTouch.Scraper.Tests; @@ -10,6 +12,25 @@ public class StructScrapingTests [Fact] public void StructXMLGeneratesStructSymbol() { + var doc = new XmlDocument(); + doc.LoadXml(@""); + var symbols = new ClangScraper().ScrapeXML(doc); + + var symbol = Assert.Single(symbols); + var @struct = Assert.IsType(symbol); + } + + [Fact] + public void StructXMLGeneratesCorrectIdentifier() + { + var doc = new XmlDocument(); + doc.LoadXml(@""); + + var symbols = new ClangScraper().ScrapeXML(doc); + + var symbol = Assert.Single(symbols); + var @struct = Assert.IsType(symbol); + Assert.Equal("Test", @struct.Identifier.Value); } }