diff --git a/Dalamud.Test/Compliance/PublicApiTests.cs b/Dalamud.Test/Compliance/PublicApiTests.cs new file mode 100644 index 000000000..4e51bb932 --- /dev/null +++ b/Dalamud.Test/Compliance/PublicApiTests.cs @@ -0,0 +1,76 @@ +using System; +using System.Linq; +using System.Reflection; + +using Dalamud.Utility; + +using Xunit; +using Xunit.Abstractions; + + +namespace Dalamud.Test.Compliance; + +public class PublicApiTests +{ + private readonly ITestOutputHelper testOutputHelper; + public PublicApiTests(ITestOutputHelper testOutputHelper) + { + this.testOutputHelper = testOutputHelper; + } + + [Fact] + public void NoClientStructsTypes() + { + var clientStructsAssembly = typeof(FFXIVClientStructs.ThisAssembly).Assembly; + + var publicTypes = typeof(Dalamud).Assembly.GetTypes().Where(t => t.IsPublic); + + foreach (var t in publicTypes) + { + if (t.GetCustomAttribute() != null) continue; + + var methods = t.GetMethods().Where(m => m.IsPublic && !m.IsSpecialName); + + foreach (var m in methods) + { + if (m.GetCustomAttribute() != null || m.GetCustomAttribute() != null) continue; + if (m.IsPrivate) continue; + + if (m.ReturnType.Assembly == clientStructsAssembly) + { + Assert.Fail($"Method {t.FullName}.{m.Name} returns a type from FFXIVClientStructs: {m.ReturnType.FullName}"); + } + + foreach (var param in m.GetParameters()) + { + if (param.ParameterType.Assembly == clientStructsAssembly) + { + Assert.Fail($"Method {t.FullName}.{m.Name} has a parameter from FFXIVClientStructs: {param.ParameterType.FullName}"); + } + } + } + + foreach (var p in t.GetProperties()) + { + if (p.GetCustomAttribute() != null || p.GetCustomAttribute() != null) continue; + if (p.GetMethod?.IsPrivate == true && p.SetMethod?.IsPrivate == true) continue; + + if (p.PropertyType.Assembly == clientStructsAssembly) + { + Assert.Fail($"Property {t.FullName}.{p.Name} is a type from FFXIVClientStructs: {p.PropertyType.FullName}"); + } + } + + foreach (var field in t.GetFields()) + { + if (field.GetCustomAttribute() != null || field.GetCustomAttribute() != null) continue; + if (field.IsPrivate) continue; + + if (field.FieldType.Assembly == clientStructsAssembly) + { + Assert.Fail($"Field {t.FullName}.{field.Name} is of a type from FFXIVClientStructs: {field.FieldType.FullName}"); + } + } + } + } +} diff --git a/Dalamud.Test/Dalamud.Test.csproj b/Dalamud.Test/Dalamud.Test.csproj index c6c8f8e8a..0839a39d3 100644 --- a/Dalamud.Test/Dalamud.Test.csproj +++ b/Dalamud.Test/Dalamud.Test.csproj @@ -43,14 +43,14 @@ - + - - - - - - + + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/Dalamud/Memory/MemoryHelper.cs b/Dalamud/Memory/MemoryHelper.cs index 2eae1be6d..acdc37a34 100644 --- a/Dalamud/Memory/MemoryHelper.cs +++ b/Dalamud/Memory/MemoryHelper.cs @@ -382,6 +382,8 @@ public static unsafe class MemoryHelper /// The memory address to read from. /// The read in string. [MethodImpl(MethodImplOptions.AggressiveInlining)] + [Obsolete("CS types in Dalamud are deprecated.")] + [Api14ToDo(Api14ToDoAttribute.Remove)] public static SeString ReadSeString(Utf8String* utf8String) => utf8String == null ? string.Empty : SeString.Parse(utf8String->AsSpan()); @@ -613,6 +615,8 @@ public static unsafe class MemoryHelper /// The memory address to read from. /// The read in string. [MethodImpl(MethodImplOptions.AggressiveInlining)] + [Obsolete("CS types in Dalamud are deprecated.")] + [Api14ToDo(Api14ToDoAttribute.Remove)] public static unsafe void ReadSeString(Utf8String* utf8String, out SeString value) => value = ReadSeString(utf8String); diff --git a/Dalamud/Utility/Numerics/VectorExtensions.cs b/Dalamud/Utility/Numerics/VectorExtensions.cs index 910dbdd00..ffb32b266 100644 --- a/Dalamud/Utility/Numerics/VectorExtensions.cs +++ b/Dalamud/Utility/Numerics/VectorExtensions.cs @@ -56,6 +56,8 @@ public static class VectorExtensions return new Vector2(v.X, y); } + [Obsolete("CS type is deprecated. Use ByteColor instead.")] + [Api14ToDo(Api14ToDoAttribute.Remove)] public static ByteColor ToByteColor(this Vector4 v) { return new ByteColor { A = (byte)(v.W * 255), R = (byte)(v.X * 255), G = (byte)(v.Y * 255), B = (byte)(v.Z * 255) };