From 1159c65180c1e84d362f0e166b36dbf006038b2a Mon Sep 17 00:00:00 2001 From: Kai Jellinghaus Date: Sat, 7 May 2022 23:12:43 +0200 Subject: [PATCH] Create & Test Namespace Symbol --- .../NamespaceSymbol.cs | 13 +++++ .../SymbolVisitor.cs | 15 ++++++ .../SymbolVisitorTests/NamespaceTests.cs | 47 +++++++++++++++++++ 3 files changed, 75 insertions(+) create mode 100644 src/generators/Silk.NET.SilkTouch.Symbols/NamespaceSymbol.cs create mode 100644 tests/Silk.NET.SilkTouch.Symbols.Tests/SymbolVisitorTests/NamespaceTests.cs diff --git a/src/generators/Silk.NET.SilkTouch.Symbols/NamespaceSymbol.cs b/src/generators/Silk.NET.SilkTouch.Symbols/NamespaceSymbol.cs new file mode 100644 index 0000000000..36b95860b1 --- /dev/null +++ b/src/generators/Silk.NET.SilkTouch.Symbols/NamespaceSymbol.cs @@ -0,0 +1,13 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Immutable; + +namespace Silk.NET.SilkTouch.Symbols; + +/// +/// A representing a namespace +/// +public sealed record NamespaceSymbol(IdentifierSymbol Identifier, ImmutableArray Types) : Symbol +{ +} diff --git a/src/generators/Silk.NET.SilkTouch.Symbols/SymbolVisitor.cs b/src/generators/Silk.NET.SilkTouch.Symbols/SymbolVisitor.cs index 6c056783f1..8c9463ba92 100644 --- a/src/generators/Silk.NET.SilkTouch.Symbols/SymbolVisitor.cs +++ b/src/generators/Silk.NET.SilkTouch.Symbols/SymbolVisitor.cs @@ -19,6 +19,7 @@ public virtual Symbol Visit(Symbol symbol) { if (symbol is TypeSymbol ts) return VisitType(ts); if (symbol is MemberSymbol ms) return VisitMember(ms); + if (symbol is NamespaceSymbol ns) return VisitNamespace(ns); if (symbol is IdentifierSymbol @is) return VisitIdentifier(@is); @@ -97,6 +98,20 @@ protected virtual IdentifierSymbol VisitIdentifier(IdentifierSymbol identifierSy return identifierSymbol; } + /// + /// Visit a . + /// + /// The Namespace to Visit. + /// The rewritten symbol + protected virtual NamespaceSymbol VisitNamespace(NamespaceSymbol namespaceSymbol) + { + return namespaceSymbol with + { + Identifier = VisitIdentifier(namespaceSymbol.Identifier), + Types = namespaceSymbol.Types.Select(VisitType).ToImmutableArray() + }; + } + private static T ThrowUnknownSymbol(Symbol symbol) { throw new NotImplementedException($"Unknown symbol of type {symbol.GetType().FullName} subclass of {typeof(T).Name}"); diff --git a/tests/Silk.NET.SilkTouch.Symbols.Tests/SymbolVisitorTests/NamespaceTests.cs b/tests/Silk.NET.SilkTouch.Symbols.Tests/SymbolVisitorTests/NamespaceTests.cs new file mode 100644 index 0000000000..a190c1a449 --- /dev/null +++ b/tests/Silk.NET.SilkTouch.Symbols.Tests/SymbolVisitorTests/NamespaceTests.cs @@ -0,0 +1,47 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Immutable; +using Moq; +using Moq.Protected; +using Xunit; + +namespace Silk.NET.SilkTouch.Symbols.Tests.SymbolVisitorTests; + +public class NamespaceTests +{ + [Fact] + public void NamespaceIdentifierIsVisited() + { + var symbol = new NamespaceSymbol(new IdentifierSymbol(""), ImmutableArray.Empty); + + var visitor = new Mock + { + CallBase = true + }; + + visitor.Object.Visit(symbol); + + visitor.Protected() + .Verify("VisitIdentifier", Times.Once(), ItExpr.IsAny()); + } + + [Fact] + public void NamespaceMemberIsVisited() + { + var symbol = new NamespaceSymbol(new IdentifierSymbol(""), new [] + { + (TypeSymbol)new StructSymbol(new IdentifierSymbol(""), StructLayout.Empty) + }.ToImmutableArray()); + + var visitor = new Mock + { + CallBase = true + }; + + visitor.Object.Visit(symbol); + + visitor.Protected() + .Verify("VisitStruct", Times.Once(), ItExpr.IsAny()); + } +}