Updated EllieBot.Generators
This commit is contained in:
parent
453d823e5b
commit
4d7056dc61
6 changed files with 69 additions and 405 deletions
|
@ -6,8 +6,6 @@ using Microsoft.CodeAnalysis;
|
||||||
using Microsoft.CodeAnalysis.CSharp;
|
using Microsoft.CodeAnalysis.CSharp;
|
||||||
using Microsoft.CodeAnalysis.CSharp.Syntax;
|
using Microsoft.CodeAnalysis.CSharp.Syntax;
|
||||||
using Microsoft.CodeAnalysis.Text;
|
using Microsoft.CodeAnalysis.Text;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
|
||||||
namespace Cloneable
|
namespace Cloneable
|
||||||
|
@ -23,54 +21,60 @@ namespace Cloneable
|
||||||
private const string CLONE_ATTRIBUTE_STRING = "CloneAttribute";
|
private const string CLONE_ATTRIBUTE_STRING = "CloneAttribute";
|
||||||
private const string IGNORE_CLONE_ATTRIBUTE_STRING = "IgnoreCloneAttribute";
|
private const string IGNORE_CLONE_ATTRIBUTE_STRING = "IgnoreCloneAttribute";
|
||||||
|
|
||||||
private const string CLONEABLE_ATTRIBUTE_TEXT = @"// <AutoGenerated/>
|
private const string CLONEABLE_ATTRIBUTE_TEXT = $$"""
|
||||||
using System;
|
// <AutoGenerated/>
|
||||||
|
using System;
|
||||||
|
|
||||||
namespace " + CLONEABLE_NAMESPACE + @"
|
namespace {{CLONEABLE_NAMESPACE}}
|
||||||
{
|
{
|
||||||
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, Inherited = true, AllowMultiple = false)]
|
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, Inherited = true, AllowMultiple = false)]
|
||||||
public sealed class " + CLONEABLE_ATTRIBUTE_STRING + @" : Attribute
|
internal sealed class {{CLONEABLE_ATTRIBUTE_STRING}} : Attribute
|
||||||
{
|
{
|
||||||
public " + CLONEABLE_ATTRIBUTE_STRING + @"()
|
public {{CLONEABLE_ATTRIBUTE_STRING}}()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool " + EXPLICIT_DECLARATION_KEY_STRING + @" { get; set; }
|
public bool {{EXPLICIT_DECLARATION_KEY_STRING}} { get; set; }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
";
|
|
||||||
|
|
||||||
private const string CLONE_PROPERTY_ATTRIBUTE_TEXT = @"// <AutoGenerated/>
|
""";
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace " + CLONEABLE_NAMESPACE + @"
|
private const string CLONE_PROPERTY_ATTRIBUTE_TEXT = $$"""
|
||||||
{
|
// <AutoGenerated/>
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace {{CLONEABLE_NAMESPACE}}
|
||||||
|
{
|
||||||
[AttributeUsage(AttributeTargets.Property, Inherited = true, AllowMultiple = false)]
|
[AttributeUsage(AttributeTargets.Property, Inherited = true, AllowMultiple = false)]
|
||||||
public sealed class " + CLONE_ATTRIBUTE_STRING + @" : Attribute
|
internal sealed class {{CLONE_ATTRIBUTE_STRING}} : Attribute
|
||||||
{
|
{
|
||||||
public " + CLONE_ATTRIBUTE_STRING + @"()
|
public {{CLONE_ATTRIBUTE_STRING}}()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool " + PREVENT_DEEP_COPY_KEY_STRING + @" { get; set; }
|
public bool {{PREVENT_DEEP_COPY_KEY_STRING}} { get; set; }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
";
|
|
||||||
|
|
||||||
private const string IGNORE_CLONE_PROPERTY_ATTRIBUTE_TEXT = @"// <AutoGenerated/>
|
""";
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace " + CLONEABLE_NAMESPACE + @"
|
private const string IGNORE_CLONE_PROPERTY_ATTRIBUTE_TEXT = $$"""
|
||||||
{
|
// <AutoGenerated/>
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace {{CLONEABLE_NAMESPACE}}
|
||||||
|
{
|
||||||
[AttributeUsage(AttributeTargets.Property, Inherited = true, AllowMultiple = false)]
|
[AttributeUsage(AttributeTargets.Property, Inherited = true, AllowMultiple = false)]
|
||||||
public sealed class " + IGNORE_CLONE_ATTRIBUTE_STRING + @" : Attribute
|
internal sealed class {{IGNORE_CLONE_ATTRIBUTE_STRING}} : Attribute
|
||||||
{
|
{
|
||||||
public " + IGNORE_CLONE_ATTRIBUTE_STRING + @"()
|
public {{IGNORE_CLONE_ATTRIBUTE_STRING}}()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
";
|
|
||||||
|
""";
|
||||||
|
|
||||||
private INamedTypeSymbol? _cloneableAttribute;
|
private INamedTypeSymbol? _cloneableAttribute;
|
||||||
private INamedTypeSymbol? _ignoreCloneAttribute;
|
private INamedTypeSymbol? _ignoreCloneAttribute;
|
||||||
|
@ -180,7 +184,7 @@ namespace {namespaceName}
|
||||||
}}";
|
}}";
|
||||||
}
|
}
|
||||||
|
|
||||||
private IEnumerable<(string line, bool isCloneable)> GenerateFieldAssignmentsCode(INamedTypeSymbol classSymbol, bool isExplicit)
|
private IEnumerable<(string line, bool isCloneable)> GenerateFieldAssignmentsCode(INamedTypeSymbol classSymbol, bool isExplicit )
|
||||||
{
|
{
|
||||||
var fieldNames = GetCloneableProperties(classSymbol, isExplicit);
|
var fieldNames = GetCloneableProperties(classSymbol, isExplicit);
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
// Code temporarily yeeted from
|
// Code temporarily yeeted from
|
||||||
// https://github.com/mostmand/Cloneable/blob/master/Cloneable/CloneableGenerator.cs
|
// https://github.com/mostmand/Cloneable/blob/master/Cloneable/CloneableGenerator.cs
|
||||||
// because of NRT issue
|
// because of NRT issue
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using Microsoft.CodeAnalysis;
|
using Microsoft.CodeAnalysis;
|
||||||
|
|
||||||
namespace Cloneable
|
namespace Cloneable
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// Code temporarily yeeted from
|
// Code temporarily yeeted from
|
||||||
// https://github.com/mostmand/Cloneable/blob/master/Cloneable/CloneableGenerator.cs
|
// https://github.com/mostmand/Cloneable/blob/master/Cloneable/CloneableGenerator.cs
|
||||||
// because of NRT issue
|
// because of NRT issue
|
||||||
using System.Collections.Generic;
|
|
||||||
using Microsoft.CodeAnalysis;
|
using Microsoft.CodeAnalysis;
|
||||||
using Microsoft.CodeAnalysis.CSharp.Syntax;
|
using Microsoft.CodeAnalysis.CSharp.Syntax;
|
||||||
|
|
||||||
|
|
|
@ -1,336 +0,0 @@
|
||||||
// #nullable enable
|
|
||||||
// using System;
|
|
||||||
// using System.CodeDom.Compiler;
|
|
||||||
// using System.Collections.Generic;
|
|
||||||
// using System.Collections.Immutable;
|
|
||||||
// using System.Collections.ObjectModel;
|
|
||||||
// using System.Diagnostics;
|
|
||||||
// using System.IO;
|
|
||||||
// using System.Linq;
|
|
||||||
// using System.Text;
|
|
||||||
// using System.Threading;
|
|
||||||
// using Microsoft.CodeAnalysis;
|
|
||||||
// using Microsoft.CodeAnalysis.CSharp;
|
|
||||||
// using Microsoft.CodeAnalysis.CSharp.Syntax;
|
|
||||||
// using Microsoft.CodeAnalysis.Text;
|
|
||||||
//
|
|
||||||
// namespace EllieBot.Generators.Command;
|
|
||||||
//
|
|
||||||
// [Generator]
|
|
||||||
// public class CommandAttributesGenerator : IIncrementalGenerator
|
|
||||||
// {
|
|
||||||
// public const string ATTRIBUTE = @"// <AutoGenerated />
|
|
||||||
//
|
|
||||||
// namespace EllieBot.Common;
|
|
||||||
//
|
|
||||||
// [System.AttributeUsage(System.AttributeTargets.Method)]
|
|
||||||
// public class CmdAttribute : System.Attribute
|
|
||||||
// {
|
|
||||||
//
|
|
||||||
// }";
|
|
||||||
//
|
|
||||||
// public class MethodModel
|
|
||||||
// {
|
|
||||||
// public string? Namespace { get; }
|
|
||||||
// public IReadOnlyCollection<string> Classes { get; }
|
|
||||||
// public string ReturnType { get; }
|
|
||||||
// public string MethodName { get; }
|
|
||||||
// public IEnumerable<string> Params { get; }
|
|
||||||
//
|
|
||||||
// public MethodModel(string? ns, IReadOnlyCollection<string> classes, string returnType, string methodName, IEnumerable<string> @params)
|
|
||||||
// {
|
|
||||||
// Namespace = ns;
|
|
||||||
// Classes = classes;
|
|
||||||
// ReturnType = returnType;
|
|
||||||
// MethodName = methodName;
|
|
||||||
// Params = @params;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public class FileModel
|
|
||||||
// {
|
|
||||||
// public string? Namespace { get; }
|
|
||||||
// public IReadOnlyCollection<string> ClassHierarchy { get; }
|
|
||||||
// public IReadOnlyCollection<MethodModel> Methods { get; }
|
|
||||||
//
|
|
||||||
// public FileModel(string? ns, IReadOnlyCollection<string> classHierarchy, IReadOnlyCollection<MethodModel> methods)
|
|
||||||
// {
|
|
||||||
// Namespace = ns;
|
|
||||||
// ClassHierarchy = classHierarchy;
|
|
||||||
// Methods = methods;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void Initialize(IncrementalGeneratorInitializationContext context)
|
|
||||||
// {
|
|
||||||
// // #if DEBUG
|
|
||||||
// // if (!Debugger.IsAttached)
|
|
||||||
// // Debugger.Launch();
|
|
||||||
// // // SpinWait.SpinUntil(() => Debugger.IsAttached);
|
|
||||||
// // #endif
|
|
||||||
// context.RegisterPostInitializationOutput(static ctx => ctx.AddSource(
|
|
||||||
// "CmdAttribute.g.cs",
|
|
||||||
// SourceText.From(ATTRIBUTE, Encoding.UTF8)));
|
|
||||||
//
|
|
||||||
// var methods = context.SyntaxProvider
|
|
||||||
// .CreateSyntaxProvider(
|
|
||||||
// static (node, _) => node is MethodDeclarationSyntax { AttributeLists.Count: > 0 },
|
|
||||||
// static (ctx, cancel) => Transform(ctx, cancel))
|
|
||||||
// .Where(static m => m is not null)
|
|
||||||
// .Where(static m => m?.ChildTokens().Any(static x => x.IsKind(SyntaxKind.PublicKeyword)) ?? false);
|
|
||||||
//
|
|
||||||
// var compilationMethods = context.CompilationProvider.Combine(methods.Collect());
|
|
||||||
//
|
|
||||||
// context.RegisterSourceOutput(compilationMethods,
|
|
||||||
// static (ctx, tuple) => RegisterAction(in ctx, tuple.Left, in tuple.Right));
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// private static void RegisterAction(in SourceProductionContext ctx,
|
|
||||||
// Compilation comp,
|
|
||||||
// in ImmutableArray<MethodDeclarationSyntax?> methods)
|
|
||||||
// {
|
|
||||||
// if (methods is { IsDefaultOrEmpty: true })
|
|
||||||
// return;
|
|
||||||
//
|
|
||||||
// var models = GetModels(comp, methods, ctx.CancellationToken);
|
|
||||||
//
|
|
||||||
// foreach (var model in models)
|
|
||||||
// {
|
|
||||||
// var name = $"{model.Namespace}.{string.Join(".", model.ClassHierarchy)}.g.cs";
|
|
||||||
// try
|
|
||||||
// {
|
|
||||||
// var source = GetSourceText(model);
|
|
||||||
// ctx.AddSource(name, SourceText.From(source, Encoding.UTF8));
|
|
||||||
// }
|
|
||||||
// catch (Exception ex)
|
|
||||||
// {
|
|
||||||
// Console.WriteLine($"Error writing source file {name}\n" + ex);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// private static string GetSourceText(FileModel model)
|
|
||||||
// {
|
|
||||||
// using var sw = new StringWriter();
|
|
||||||
// using var tw = new IndentedTextWriter(sw);
|
|
||||||
//
|
|
||||||
// tw.WriteLine("// <AutoGenerated />");
|
|
||||||
// tw.WriteLine("#pragma warning disable CS1066");
|
|
||||||
//
|
|
||||||
// if (model.Namespace is not null)
|
|
||||||
// {
|
|
||||||
// tw.WriteLine($"namespace {model.Namespace};");
|
|
||||||
// tw.WriteLine();
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// foreach (var className in model.ClassHierarchy)
|
|
||||||
// {
|
|
||||||
// tw.WriteLine($"public partial class {className}");
|
|
||||||
// tw.WriteLine("{");
|
|
||||||
// tw.Indent ++;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// foreach (var method in model.Methods)
|
|
||||||
// {
|
|
||||||
// tw.WriteLine("[EllieCommand]");
|
|
||||||
// tw.WriteLine("[EllieDescription]");
|
|
||||||
// tw.WriteLine("[Aliases]");
|
|
||||||
// tw.WriteLine($"public partial {method.ReturnType} {method.MethodName}({string.Join(", ", method.Params)});");
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// foreach (var _ in model.ClassHierarchy)
|
|
||||||
// {
|
|
||||||
// tw.Indent --;
|
|
||||||
// tw.WriteLine("}");
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// tw.Flush();
|
|
||||||
// return sw.ToString();
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// private static IReadOnlyCollection<FileModel> GetModels(Compilation compilation,
|
|
||||||
// in ImmutableArray<MethodDeclarationSyntax?> inputMethods,
|
|
||||||
// CancellationToken cancel)
|
|
||||||
// {
|
|
||||||
// var models = new List<FileModel>();
|
|
||||||
//
|
|
||||||
// var methods = inputMethods
|
|
||||||
// .Where(static x => x is not null)
|
|
||||||
// .Distinct();
|
|
||||||
//
|
|
||||||
// var methodModels = methods
|
|
||||||
// .Select(x => MethodDeclarationToMethodModel(compilation, x!))
|
|
||||||
// .Where(static x => x is not null)
|
|
||||||
// .Cast<MethodModel>();
|
|
||||||
//
|
|
||||||
// var groups = methodModels
|
|
||||||
// .GroupBy(static x => $"{x.Namespace}.{string.Join(".", x.Classes)}");
|
|
||||||
//
|
|
||||||
// foreach (var group in groups)
|
|
||||||
// {
|
|
||||||
// if (cancel.IsCancellationRequested)
|
|
||||||
// return new Collection<FileModel>();
|
|
||||||
//
|
|
||||||
// if (group is null)
|
|
||||||
// continue;
|
|
||||||
//
|
|
||||||
// var elems = group.ToList();
|
|
||||||
// if (elems.Count is 0)
|
|
||||||
// continue;
|
|
||||||
//
|
|
||||||
// var model = new FileModel(
|
|
||||||
// methods: elems,
|
|
||||||
// ns: elems[0].Namespace,
|
|
||||||
// classHierarchy: elems![0].Classes
|
|
||||||
// );
|
|
||||||
//
|
|
||||||
// models.Add(model);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// return models;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// private static MethodModel? MethodDeclarationToMethodModel(Compilation comp, MethodDeclarationSyntax decl)
|
|
||||||
// {
|
|
||||||
// // SpinWait.SpinUntil(static () => Debugger.IsAttached);
|
|
||||||
//
|
|
||||||
// SemanticModel semanticModel;
|
|
||||||
// try
|
|
||||||
// {
|
|
||||||
// semanticModel = comp.GetSemanticModel(decl.SyntaxTree);
|
|
||||||
// }
|
|
||||||
// catch
|
|
||||||
// {
|
|
||||||
// // for some reason this method can throw "Not part of this compilation" argument exception
|
|
||||||
// return null;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// var methodModel = new MethodModel(
|
|
||||||
// @params: decl.ParameterList.Parameters
|
|
||||||
// .Where(p => p.Type is not null)
|
|
||||||
// .Select(p =>
|
|
||||||
// {
|
|
||||||
// var prefix = p.Modifiers.Any(static x => x.IsKind(SyntaxKind.ParamsKeyword))
|
|
||||||
// ? "params "
|
|
||||||
// : string.Empty;
|
|
||||||
//
|
|
||||||
// var type = semanticModel
|
|
||||||
// .GetTypeInfo(p.Type!)
|
|
||||||
// .Type
|
|
||||||
// ?.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat);
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// var name = p.Identifier.Text;
|
|
||||||
//
|
|
||||||
// var suffix = string.Empty;
|
|
||||||
// if (p.Default is not null)
|
|
||||||
// {
|
|
||||||
// if (p.Default.Value is LiteralExpressionSyntax)
|
|
||||||
// {
|
|
||||||
// suffix = " = " + p.Default.Value;
|
|
||||||
// }
|
|
||||||
// else if (p.Default.Value is MemberAccessExpressionSyntax maes)
|
|
||||||
// {
|
|
||||||
// var maesSemModel = comp.GetSemanticModel(maes.SyntaxTree);
|
|
||||||
// var sym = maesSemModel.GetSymbolInfo(maes.Name);
|
|
||||||
// if (sym.Symbol is null)
|
|
||||||
// {
|
|
||||||
// suffix = " = " + p.Default.Value;
|
|
||||||
// }
|
|
||||||
// else
|
|
||||||
// {
|
|
||||||
// suffix = " = " + sym.Symbol.ToDisplayString();
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// return $"{prefix}{type} {name}{suffix}";
|
|
||||||
// })
|
|
||||||
// .ToList(),
|
|
||||||
// methodName: decl.Identifier.Text,
|
|
||||||
// returnType: decl.ReturnType.ToString(),
|
|
||||||
// ns: GetNamespace(decl),
|
|
||||||
// classes: GetClasses(decl)
|
|
||||||
// );
|
|
||||||
//
|
|
||||||
// return methodModel;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// //https://github.com/andrewlock/NetEscapades.EnumGenerators/blob/main/src/NetEscapades.EnumGenerators/EnumGenerator.cs
|
|
||||||
// static string? GetNamespace(MethodDeclarationSyntax declarationSyntax)
|
|
||||||
// {
|
|
||||||
// // determine the namespace the class is declared in, if any
|
|
||||||
// string? nameSpace = null;
|
|
||||||
// var parentOfInterest = declarationSyntax.Parent;
|
|
||||||
// while (parentOfInterest is not null)
|
|
||||||
// {
|
|
||||||
// parentOfInterest = parentOfInterest.Parent;
|
|
||||||
//
|
|
||||||
// if (parentOfInterest is BaseNamespaceDeclarationSyntax ns)
|
|
||||||
// {
|
|
||||||
// nameSpace = ns.Name.ToString();
|
|
||||||
// while (true)
|
|
||||||
// {
|
|
||||||
// if (ns.Parent is not NamespaceDeclarationSyntax parent)
|
|
||||||
// {
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// ns = parent;
|
|
||||||
// nameSpace = $"{ns.Name}.{nameSpace}";
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// return nameSpace;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// return nameSpace;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// static IReadOnlyCollection<string> GetClasses(MethodDeclarationSyntax declarationSyntax)
|
|
||||||
// {
|
|
||||||
// // determine the namespace the class is declared in, if any
|
|
||||||
// var classes = new LinkedList<string>();
|
|
||||||
// var parentOfInterest = declarationSyntax.Parent;
|
|
||||||
// while (parentOfInterest is not null)
|
|
||||||
// {
|
|
||||||
// if (parentOfInterest is ClassDeclarationSyntax cds)
|
|
||||||
// {
|
|
||||||
// classes.AddFirst(cds.Identifier.ToString());
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// parentOfInterest = parentOfInterest.Parent;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Debug.WriteLine($"Method {declarationSyntax.Identifier.Text} has {classes.Count} classes");
|
|
||||||
//
|
|
||||||
// return classes;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// private static MethodDeclarationSyntax? Transform(GeneratorSyntaxContext ctx, CancellationToken cancel)
|
|
||||||
// {
|
|
||||||
// var methodDecl = ctx.Node as MethodDeclarationSyntax;
|
|
||||||
// if (methodDecl is null)
|
|
||||||
// return default;
|
|
||||||
//
|
|
||||||
// foreach (var attListSyntax in methodDecl.AttributeLists)
|
|
||||||
// {
|
|
||||||
// foreach (var attSyntax in attListSyntax.Attributes)
|
|
||||||
// {
|
|
||||||
// if (cancel.IsCancellationRequested)
|
|
||||||
// return default;
|
|
||||||
//
|
|
||||||
// var symbol = ctx.SemanticModel.GetSymbolInfo(attSyntax).Symbol;
|
|
||||||
// if (symbol is not IMethodSymbol attSymbol)
|
|
||||||
// continue;
|
|
||||||
//
|
|
||||||
// if (attSymbol.ContainingType.ToDisplayString() == "EllieBot.Common.CmdAttribute")
|
|
||||||
// return methodDecl;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// return default;
|
|
||||||
// }
|
|
||||||
// }
|
|
|
@ -5,6 +5,7 @@
|
||||||
<LangVersion>latest</LangVersion>
|
<LangVersion>latest</LangVersion>
|
||||||
<IncludeBuildOutput>false</IncludeBuildOutput>
|
<IncludeBuildOutput>false</IncludeBuildOutput>
|
||||||
<IsRoslynComponent>true</IsRoslynComponent>
|
<IsRoslynComponent>true</IsRoslynComponent>
|
||||||
|
<ImplicitUsings>true</ImplicitUsings>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
|
@ -1,10 +1,6 @@
|
||||||
#nullable enable
|
#nullable enable
|
||||||
using System;
|
|
||||||
using System.CodeDom.Compiler;
|
using System.CodeDom.Compiler;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using Microsoft.CodeAnalysis;
|
using Microsoft.CodeAnalysis;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
@ -26,24 +22,23 @@ namespace EllieBot.Generators
|
||||||
[Generator]
|
[Generator]
|
||||||
public class LocalizedStringsGenerator : ISourceGenerator
|
public class LocalizedStringsGenerator : ISourceGenerator
|
||||||
{
|
{
|
||||||
private const string LOC_STR_SOURCE = @"namespace EllieBot
|
// private const string LOC_STR_SOURCE = @"namespace EllieBot
|
||||||
{
|
// {
|
||||||
public readonly struct LocStr
|
// public readonly struct LocStr
|
||||||
{
|
// {
|
||||||
public readonly string Key;
|
// public readonly string Key;
|
||||||
public readonly object[] Params;
|
// public readonly object[] Params;
|
||||||
|
//
|
||||||
public LocStr(string key, params object[] data)
|
// public LocStr(string key, params object[] data)
|
||||||
{
|
// {
|
||||||
Key = key;
|
// Key = key;
|
||||||
Params = data;
|
// Params = data;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}";
|
// }";
|
||||||
|
|
||||||
public void Initialize(GeneratorInitializationContext context)
|
public void Initialize(GeneratorInitializationContext context)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Execute(GeneratorExecutionContext context)
|
public void Execute(GeneratorExecutionContext context)
|
||||||
|
@ -55,6 +50,7 @@ namespace EllieBot.Generators
|
||||||
using (var stringWriter = new StringWriter())
|
using (var stringWriter = new StringWriter())
|
||||||
using (var sw = new IndentedTextWriter(stringWriter))
|
using (var sw = new IndentedTextWriter(stringWriter))
|
||||||
{
|
{
|
||||||
|
sw.WriteLine("#pragma warning disable CS8981");
|
||||||
sw.WriteLine("namespace EllieBot;");
|
sw.WriteLine("namespace EllieBot;");
|
||||||
sw.WriteLine();
|
sw.WriteLine();
|
||||||
|
|
||||||
|
@ -106,7 +102,7 @@ namespace EllieBot.Generators
|
||||||
context.AddSource("strs.g.cs", stringWriter.ToString());
|
context.AddSource("strs.g.cs", stringWriter.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
context.AddSource("LocStr.g.cs", LOC_STR_SOURCE);
|
// context.AddSource("LocStr.g.cs", LOC_STR_SOURCE);
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<TranslationPair> GetFields(string? dataText)
|
private List<TranslationPair> GetFields(string? dataText)
|
||||||
|
|
Loading…
Reference in a new issue