From 3342ead2d4b6e338e57a12b468c395233338dac6 Mon Sep 17 00:00:00 2001 From: mlemanczyk Date: Sat, 27 Dec 2025 23:50:59 +0100 Subject: [PATCH] DeviceDependentGenerator modified to create all classes in "generated" folder and clean up generated files during dotnet clean process. --- .../DeviceDependentGenerator.cs | 60 ++++++++----------- .../PerfectNumbers.Core.csproj | 5 ++ 2 files changed, 29 insertions(+), 36 deletions(-) diff --git a/DeviceDependentGenerator/DeviceDependentGenerator.cs b/DeviceDependentGenerator/DeviceDependentGenerator.cs index 8a91ff3..e48c272 100644 --- a/DeviceDependentGenerator/DeviceDependentGenerator.cs +++ b/DeviceDependentGenerator/DeviceDependentGenerator.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Collections.Immutable; -using System.IO; using System.Linq; using System.Text; using System.Threading; @@ -118,9 +117,8 @@ public sealed class DeviceDependentGenerator : IIncrementalGenerator : templateName; SourceText fileText = templateSyntax.SyntaxTree.GetText(context.CancellationToken); - string filePath = templateSyntax.SyntaxTree.FilePath; CSharpParseOptions baseParseOptions = (CSharpParseOptions)templateSyntax.SyntaxTree.Options; - SyntaxTree originalTree = templateSyntax.SyntaxTree; + string filePath = templateSyntax.SyntaxTree.FilePath; foreach (TemplateVariant variant in template.ExpandVariants()) { @@ -159,7 +157,7 @@ public sealed class DeviceDependentGenerator : IIncrementalGenerator generatedRoot = generatedRoot.NormalizeWhitespace(); string generatedFileName = baseName + "." + variant.FileSuffix + template.NameSuffix + ".generated.cs"; - string hintName = options.BuildHintName(filePath, generatedFileName); + string hintName = options.BuildHintName(template.ContainingNamespace, generatedFileName); context.AddSource( hintName, SourceText.From("// \n#nullable enable\n" + generatedRoot.ToFullString(), Encoding.UTF8)); @@ -606,6 +604,9 @@ public sealed class DeviceDependentGenerator : IIncrementalGenerator private readonly struct GeneratorOptions { + private const string GeneratedDirectoryName = "generated"; + private const string GeneratedRootOptionName = "build_property.DeviceDependentGenerator_OutputRoot"; + private readonly AnalyzerConfigOptions globalOptions; public GeneratorOptions(AnalyzerConfigOptions globalOptions) @@ -613,51 +614,38 @@ public sealed class DeviceDependentGenerator : IIncrementalGenerator this.globalOptions = globalOptions; } - public string BuildHintName(string templateFilePath, string generatedFileName) + public string BuildHintName(string containingNamespace, string generatedFileName) { - if (!globalOptions.TryGetValue("build_property.ProjectDir", out string? projectDir) || string.IsNullOrWhiteSpace(projectDir)) + string root = GetGeneratedRoot(); + string trimmedRoot = string.IsNullOrWhiteSpace(root) + ? GeneratedDirectoryName + : root.Replace('\\', '/').Trim('/').Trim(); + if (string.IsNullOrWhiteSpace(trimmedRoot)) { - return generatedFileName; + trimmedRoot = GeneratedDirectoryName; } - string? templateDirectory = Path.GetDirectoryName(templateFilePath); - if (string.IsNullOrWhiteSpace(templateDirectory)) + string namespacePath = string.IsNullOrWhiteSpace(containingNamespace) + ? string.Empty + : containingNamespace.Replace('.', '/').Trim('/'); + + if (namespacePath.Length == 0) { - return generatedFileName; + return trimmedRoot + "/" + generatedFileName; } - string relativeDirectory = GetRelativePath(projectDir, templateDirectory); - if (relativeDirectory is "." or "") - { - return generatedFileName; - } - - if (relativeDirectory.StartsWith("..", StringComparison.Ordinal)) - { - return generatedFileName; - } - - relativeDirectory = relativeDirectory.Replace('\\', '/'); - return relativeDirectory.TrimEnd('/') + "/" + generatedFileName; + return trimmedRoot + "/" + namespacePath + "/" + generatedFileName; } - private static string GetRelativePath(string baseDirectory, string targetDirectory) + private string GetGeneratedRoot() { - if (string.IsNullOrWhiteSpace(baseDirectory) || string.IsNullOrWhiteSpace(targetDirectory)) + if (globalOptions.TryGetValue(GeneratedRootOptionName, out string? configuredRoot) + && !string.IsNullOrWhiteSpace(configuredRoot)) { - return targetDirectory; + return configuredRoot; } - if (!baseDirectory.EndsWith(Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal) - && !baseDirectory.EndsWith(Path.AltDirectorySeparatorChar.ToString(), StringComparison.Ordinal)) - { - baseDirectory += Path.DirectorySeparatorChar; - } - - var baseUri = new Uri(baseDirectory, UriKind.Absolute); - var targetUri = new Uri(targetDirectory, UriKind.Absolute); - string relative = Uri.UnescapeDataString(baseUri.MakeRelativeUri(targetUri).ToString()); - return relative.Replace('/', Path.DirectorySeparatorChar); + return GeneratedDirectoryName; } } diff --git a/PerfectNumbers.Core/PerfectNumbers.Core.csproj b/PerfectNumbers.Core/PerfectNumbers.Core.csproj index 7f393c0..02a8bf3 100644 --- a/PerfectNumbers.Core/PerfectNumbers.Core.csproj +++ b/PerfectNumbers.Core/PerfectNumbers.Core.csproj @@ -46,4 +46,9 @@ SkipUnchangedFiles="true" /> + + + +