diff --git a/src/Directory.Build.props b/src/Directory.Build.props index e00fdeb..5adf0a1 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -16,5 +16,7 @@ despite the fact that .NET 6 is out of support. Support will be dropped from Yardarm at a later date. --> true + + true diff --git a/src/Directory.Build.targets b/src/Directory.Build.targets index a4493cd..38c3340 100644 --- a/src/Directory.Build.targets +++ b/src/Directory.Build.targets @@ -1,5 +1,5 @@ - + true $(MSBuildThisFileDirectory)Yardarm.snk @@ -22,4 +22,39 @@ runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + RootNamespace + $(DefineConstants);FORTESTS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/Yardarm.Client/Yardarm.Client.csproj b/src/main/Yardarm.Client/Yardarm.Client.csproj index e9b311c..4f4afff 100644 --- a/src/main/Yardarm.Client/Yardarm.Client.csproj +++ b/src/main/Yardarm.Client/Yardarm.Client.csproj @@ -2,13 +2,10 @@ netstandard2.0;net6.0;net8.0 - RootNamespace Library enable false - - $(DefineConstants);FORTESTS @@ -24,9 +21,4 @@ - - - - - diff --git a/src/main/Yardarm.MicrosoftExtensionsHttp.Client/Yardarm.MicrosoftExtensionsHttp.Client.csproj b/src/main/Yardarm.MicrosoftExtensionsHttp.Client/Yardarm.MicrosoftExtensionsHttp.Client.csproj index ce575fd..6a1fffc 100644 --- a/src/main/Yardarm.MicrosoftExtensionsHttp.Client/Yardarm.MicrosoftExtensionsHttp.Client.csproj +++ b/src/main/Yardarm.MicrosoftExtensionsHttp.Client/Yardarm.MicrosoftExtensionsHttp.Client.csproj @@ -2,11 +2,9 @@ netstandard2.0;net6.0;net8.0 - RootNamespace Library enable - false @@ -22,9 +20,4 @@ - - - - - diff --git a/src/main/Yardarm.NewtonsoftJson.Client/Yardarm.NewtonsoftJson.Client.csproj b/src/main/Yardarm.NewtonsoftJson.Client/Yardarm.NewtonsoftJson.Client.csproj index e5b93c8..3fa6711 100644 --- a/src/main/Yardarm.NewtonsoftJson.Client/Yardarm.NewtonsoftJson.Client.csproj +++ b/src/main/Yardarm.NewtonsoftJson.Client/Yardarm.NewtonsoftJson.Client.csproj @@ -2,11 +2,9 @@ netstandard2.0;net6.0;net8.0 - RootNamespace Library enable - false @@ -18,9 +16,4 @@ - - - - - diff --git a/src/main/Yardarm.SystemTextJson.Client/Yardarm.SystemTextJson.Client.csproj b/src/main/Yardarm.SystemTextJson.Client/Yardarm.SystemTextJson.Client.csproj index 5a6c27f..967a199 100644 --- a/src/main/Yardarm.SystemTextJson.Client/Yardarm.SystemTextJson.Client.csproj +++ b/src/main/Yardarm.SystemTextJson.Client/Yardarm.SystemTextJson.Client.csproj @@ -2,13 +2,9 @@ netstandard2.0;net6.0;net8.0 - RootNamespace Library enable - false - - $(DefineConstants);FORTESTS @@ -26,11 +22,4 @@ - - - - - - - diff --git a/src/main/Yardarm.sln b/src/main/Yardarm.sln index d221ee9..ddeb7ac 100644 --- a/src/main/Yardarm.sln +++ b/src/main/Yardarm.sln @@ -32,6 +32,7 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{0F27CDEF-318E-4305-AE2B-AA44C670E7C2}" ProjectSection(SolutionItems) = preProject ..\Directory.Build.props = ..\Directory.Build.props + ..\Directory.Build.targets = ..\Directory.Build.targets Directory.Packages.props = Directory.Packages.props EndProjectSection EndProject diff --git a/src/main/Yardarm/Generation/ResourceSyntaxTreeGenerator.cs b/src/main/Yardarm/Generation/ResourceSyntaxTreeGenerator.cs index b572156..ab45c7f 100644 --- a/src/main/Yardarm/Generation/ResourceSyntaxTreeGenerator.cs +++ b/src/main/Yardarm/Generation/ResourceSyntaxTreeGenerator.cs @@ -1,7 +1,9 @@ using System; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Text; +using System.Text.RegularExpressions; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.Text; @@ -12,8 +14,29 @@ namespace Yardarm.Generation { - public abstract class ResourceSyntaxTreeGenerator : ISyntaxTreeGenerator + public abstract partial class ResourceSyntaxTreeGenerator : ISyntaxTreeGenerator { + [GeneratedRegex(@"\.netstandard\.cs$")] + private static partial Regex NetStandardSuffix(); + + [GeneratedRegex(@"\.netcoreapp\.cs$")] + private static partial Regex NetCoreAppSuffix(); + + [GeneratedRegex(@"\.net\d+\.\d+\.cs$")] + private static partial Regex AnyNetNumberSuffix(); + + [GeneratedRegex(@"\.net6\.0\.cs$")] + private static partial Regex Net60Suffix(); + + [GeneratedRegex(@"\.net7\.0\.cs$")] + private static partial Regex Net70Suffix(); + + [GeneratedRegex(@"\.net8\.0\.cs$")] + private static partial Regex Net80Suffix(); + + [GeneratedRegex(@"\.net9\.0\.cs$")] + private static partial Regex Net90Suffix(); + private static readonly UTF8Encoding s_utf8NoBom = new(encoderShouldEmitUTF8Identifier: false); private static ReadOnlySpan RootNamespaceBytes => "RootNamespace"u8; @@ -31,19 +54,23 @@ protected ResourceSyntaxTreeGenerator(GenerationContext generationContext, IRoot RootNamespace = rootNamespace; } + public virtual IEnumerable GetResourceNameExclusions() => + GenerationContext.CurrentTargetFramework.Framework == + NuGetFrameworkConstants.NetStandardFramework + ? [NetCoreAppSuffix(), AnyNetNumberSuffix()] + : [NetStandardSuffix(), .. GetNetVersionSuffixExclusions(GenerationContext.CurrentTargetFramework.Version)]; + public virtual IEnumerable Generate() { - string excludeSuffix = GenerationContext.CurrentTargetFramework.Framework == - NuGetFrameworkConstants.NetStandardFramework - ? ".netcoreapp.cs" - : ".netstandard.cs"; + Regex[] excludeSuffixes = GetResourceNameExclusions().ToArray(); byte[] namespaceName = s_utf8NoBom.GetBytes(RootNamespace.Name.ToString()); var result = new List(); foreach (string resourceName in GetType().Assembly.GetManifestResourceNames()) { - if (resourceName.StartsWith(ResourcePrefix) && resourceName.EndsWith(".cs") && !resourceName.EndsWith(excludeSuffix)) + if (resourceName.StartsWith(ResourcePrefix) && resourceName.EndsWith(".cs") && + !IsAnyMatch(excludeSuffixes, resourceName)) { result.Add(ParseResource(resourceName, namespaceName)); } @@ -88,5 +115,38 @@ private unsafe SyntaxTree ParseResource(string resourceName, ReadOnlySpan return syntaxTree; } + + private static IEnumerable GetNetVersionSuffixExclusions(Version version) + { + if (version.Major < 6) + { + yield return Net60Suffix(); + } + if (version.Major < 7) + { + yield return Net70Suffix(); + } + if (version.Major < 8) + { + yield return Net80Suffix(); + } + if (version.Major < 9) + { + yield return Net90Suffix(); + } + } + + private static bool IsAnyMatch(Regex[] patterns, string input) + { + foreach (Regex pattern in patterns) + { + if (pattern.IsMatch(input)) + { + return true; + } + } + + return false; + } } }