add version 0.0.1
This commit is contained in:
50
ResourceString.Net/Generator.cs
Normal file
50
ResourceString.Net/Generator.cs
Normal file
@@ -0,0 +1,50 @@
|
||||
using Microsoft.CodeAnalysis;
|
||||
using ResourceString.Net.Logic.Factories;
|
||||
using ResourceString.Net.Logic.Parsers.Resx;
|
||||
|
||||
namespace ResourceString.Net;
|
||||
|
||||
[Generator]
|
||||
public class Generator : IIncrementalGenerator
|
||||
{
|
||||
public void Initialize(IncrementalGeneratorInitializationContext initContext)
|
||||
{
|
||||
// find all additional files that end with .txt
|
||||
var resxFiles = initContext.AdditionalTextsProvider.Where(static file => file.Path.EndsWith(".resx"));
|
||||
var assemblies = initContext.CompilationProvider.Select(static (c, _) => c.Assembly);
|
||||
|
||||
// read their contents and save their name
|
||||
var config = resxFiles.Combine(assemblies).Select(
|
||||
(t, cancellationToken) => (
|
||||
name: System.IO.Path.GetFileNameWithoutExtension(t.Left.Path),
|
||||
content: t.Left.GetText(cancellationToken)!.ToString(),
|
||||
assembly: t.Right,
|
||||
path: t.Left.Path
|
||||
)
|
||||
);
|
||||
|
||||
// generate a class that contains their values as const strings
|
||||
initContext.RegisterSourceOutput(config, (spc, t) =>
|
||||
{
|
||||
Parser.TryParse(t.content).IfSome(v =>
|
||||
{
|
||||
var relativeNamespace = System.IO.Path.GetDirectoryName(t.path).Substring(
|
||||
System.IO.Path.GetDirectoryName(t.assembly.Locations[0].GetLineSpan().Path).Length
|
||||
).Trim(System.IO.Path.DirectorySeparatorChar).Replace(System.IO.Path.DirectorySeparatorChar, '.');
|
||||
|
||||
var ns = string.IsNullOrWhiteSpace(relativeNamespace)
|
||||
? t.assembly.Name
|
||||
: $"{t.assembly.Name}.{relativeNamespace}";
|
||||
|
||||
var snippet = CodeSnippetFactory.CreateResourceClassCodeSnippet(
|
||||
ns,
|
||||
t.name,
|
||||
CodeSnippetFactory.CreateResourceMangerMemberCodeSnippet(t.name),
|
||||
v.Resources
|
||||
);
|
||||
|
||||
spc.AddSource(ns + t.name, snippet.Value);
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user