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" />
+
+
+
+