using Microsoft.CodeAnalysis; using Misaki.HighPerformance.Mathematics.CodeGen.Models; using System.Text; namespace Misaki.HighPerformance.Mathematics.CodeGen.Generators { internal abstract class GeneratorBase { protected const string INLINE_METHOD_ATTRIBUTE = "[global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]"; protected readonly StringBuilder sourceBuilder = new(); protected NumericTypeInfo typeInfo = null!; public string Generate(NumericTypeInfo typeInfo) { this.typeInfo = typeInfo; sourceBuilder.Clear(); Initialize(); GenerateHeader(); GenerateNamespaceStart(); GenerateTypeStart(); GenerateBody(); GenerateTypeEnd(); GenerateNamespaceEnd(); return sourceBuilder.ToString(); } protected virtual void Initialize() { } protected virtual void GenerateHeader() { sourceBuilder.AppendLine("// "); } protected virtual void GenerateNamespaceStart() { sourceBuilder.Append($@" namespace {typeInfo.TypeSymbol.ContainingNamespace.ToDisplayString()} {{"); } protected virtual void GenerateTypeStart() { sourceBuilder.Append($@" [global::System.Runtime.CompilerServices.SkipLocalsInit] public partial struct {typeInfo.TypeSymbol.Name} : global::System.IEquatable<{typeInfo.TypeSymbol.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}> {{"); } protected abstract void GenerateBody(); protected virtual void GenerateTypeEnd() { sourceBuilder.Append($@" }}"); } protected virtual void GenerateNamespaceEnd() { sourceBuilder.Append($@" }}"); } } }