From 25b7d74068c09b78bf82496ba3188589d9899701 Mon Sep 17 00:00:00 2001 From: Mackinnon Buck Date: Wed, 14 Aug 2024 16:41:30 -0700 Subject: [PATCH] Test to see if CI will catch trimming issues --- .../Components/src/PublicAPI.Unshipped.txt | 2 ++ .../Components/src/UnusedTypeForTrimming.cs | 28 +++++++++++++++++++ .../test/testassets/BasicTestApp/Program.cs | 7 +++++ 3 files changed, 37 insertions(+) create mode 100644 src/Components/Components/src/UnusedTypeForTrimming.cs diff --git a/src/Components/Components/src/PublicAPI.Unshipped.txt b/src/Components/Components/src/PublicAPI.Unshipped.txt index e8c43eb034cf..d77546f012d3 100644 --- a/src/Components/Components/src/PublicAPI.Unshipped.txt +++ b/src/Components/Components/src/PublicAPI.Unshipped.txt @@ -23,6 +23,8 @@ Microsoft.AspNetCore.Components.ResourceAssetProperty Microsoft.AspNetCore.Components.ResourceAssetProperty.Name.get -> string! Microsoft.AspNetCore.Components.ResourceAssetProperty.ResourceAssetProperty(string! name, string! value) -> void Microsoft.AspNetCore.Components.ResourceAssetProperty.Value.get -> string! +Microsoft.AspNetCore.Components.UnusedTypeLoader +static Microsoft.AspNetCore.Components.UnusedTypeLoader.LoadUnusedType() -> System.Type? static readonly Microsoft.AspNetCore.Components.ResourceAssetCollection.Empty -> Microsoft.AspNetCore.Components.ResourceAssetCollection! virtual Microsoft.AspNetCore.Components.RenderTree.Renderer.Assets.get -> Microsoft.AspNetCore.Components.ResourceAssetCollection! virtual Microsoft.AspNetCore.Components.RenderTree.Renderer.RendererInfo.get -> Microsoft.AspNetCore.Components.RendererInfo! diff --git a/src/Components/Components/src/UnusedTypeForTrimming.cs b/src/Components/Components/src/UnusedTypeForTrimming.cs new file mode 100644 index 000000000000..d2003b0c68d0 --- /dev/null +++ b/src/Components/Components/src/UnusedTypeForTrimming.cs @@ -0,0 +1,28 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +namespace Microsoft.AspNetCore.Components; + +/// +/// For testing. +/// +public static class UnusedTypeLoader +{ + /// + /// For testing. + /// + public static Type? LoadUnusedType() + { + // We're intentionally loading an unreferenced type here. + // This should return null on a published build. + +#pragma warning disable IL2026 // Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code + return typeof(UnusedTypeLoader).Assembly.GetType($"Microsoft.AspNetCore.Components.{nameof(UnusedTypeForTrimming)}")!; +#pragma warning restore IL2026 // Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code + } +} + +internal sealed class UnusedTypeForTrimming +{ + public string UnusedProperty { get; } = "Foo"; +} diff --git a/src/Components/test/testassets/BasicTestApp/Program.cs b/src/Components/test/testassets/BasicTestApp/Program.cs index 4b147896e621..afa670cdd087 100644 --- a/src/Components/test/testassets/BasicTestApp/Program.cs +++ b/src/Components/test/testassets/BasicTestApp/Program.cs @@ -22,6 +22,13 @@ public static async Task Main(string[] args) { await SimulateErrorsIfNeededForTest(); + if (UnusedTypeLoader.LoadUnusedType() is null) + { + // Fail quickly if loading an unreferenced type fails. + // This should make it obvious if trimming issues get caught by E2E tests. + throw new InvalidOperationException("Could not load the type dynamically!"); + } + var builder = WebAssemblyHostBuilder.CreateDefault(args); builder.RootComponents.Add("head::after"); builder.RootComponents.Add("root");