From 2e83f9b1ca516a2071c667149d83eb7ab751513d Mon Sep 17 00:00:00 2001 From: Kochoyume <78918084+kochounoyume@users.noreply.github.com> Date: Sun, 5 Jan 2025 01:01:25 +0900 Subject: [PATCH] Fix ValueTupleExtensions and Remove ForEachAttribute --- Assets/Editor/Test/MinimalTest.cs | 4 +- Documentation/docs/foreach-attribute.md | 1 - Documentation/docs/foreach-extensions.md | 2 +- Documentation/docs/toc.yml | 4 +- .../Runtime/ForEachAttribute.cs | 65 ----- .../Runtime/ForEachAttribute.cs.meta | 3 - .../Roslyn/MinimalUtility.SourceGenerator.dll | Bin 31744 -> 31232 bytes .../Runtime/ValueTupleExtensions.cs | 114 +++------ .../XEnumGenerator.cs | 230 ++++++------------ 9 files changed, 123 insertions(+), 300 deletions(-) delete mode 100644 Documentation/docs/foreach-attribute.md delete mode 100644 Packages/MinimalUtility/Runtime/ForEachAttribute.cs delete mode 100644 Packages/MinimalUtility/Runtime/ForEachAttribute.cs.meta diff --git a/Assets/Editor/Test/MinimalTest.cs b/Assets/Editor/Test/MinimalTest.cs index 95acbae..42eccef 100644 --- a/Assets/Editor/Test/MinimalTest.cs +++ b/Assets/Editor/Test/MinimalTest.cs @@ -79,7 +79,7 @@ public void CompileCheckTest() public void XEnumTest() { var fruits = Fruits.Apple | Fruits.Banana | Fruits.Orange; - foreach (var fruit in fruits) + foreach (var fruit in fruits.Enumerate()) { TestContext.Out.WriteLine(XEnum.GetName(fruit)); } @@ -99,7 +99,7 @@ private static IEnumerator PackageRemoveTest(string packageName) } } - [Flags, ForEach] + [Flags] public enum Fruits { Apple = 1 << 0, diff --git a/Documentation/docs/foreach-attribute.md b/Documentation/docs/foreach-attribute.md deleted file mode 100644 index 605bd73..0000000 --- a/Documentation/docs/foreach-attribute.md +++ /dev/null @@ -1 +0,0 @@ -# ForEach属性 diff --git a/Documentation/docs/foreach-extensions.md b/Documentation/docs/foreach-extensions.md index cee1d06..c4ff2ed 100644 --- a/Documentation/docs/foreach-extensions.md +++ b/Documentation/docs/foreach-extensions.md @@ -1,4 +1,4 @@ # foreach拡張 本来foreachできないものを拡張実装でforeachできるようになっている。 MemoryExtensions, ValueTupleExtensions -若干ForEach属性を使った列挙体のforeach対応も軽く触れられたらよいが、これの詳しい内容はSourceGeneratorでまとめて書く予定。 \ No newline at end of file +若干XEnum.Enumerate()を使った列挙体のforeach対応も軽く触れられたらよいが、これの詳しい内容はSourceGeneratorでまとめて書く予定。 \ No newline at end of file diff --git a/Documentation/docs/toc.yml b/Documentation/docs/toc.yml index acbe668..ea7cc8a 100644 --- a/Documentation/docs/toc.yml +++ b/Documentation/docs/toc.yml @@ -54,6 +54,4 @@ - name: SourceGeneratorプロジェクト概要 href: source-generator.md - name: XEnum - href: xenum.md -- name: ForEach属性 - href: foreach-attribute.md \ No newline at end of file + href: xenum.md \ No newline at end of file diff --git a/Packages/MinimalUtility/Runtime/ForEachAttribute.cs b/Packages/MinimalUtility/Runtime/ForEachAttribute.cs deleted file mode 100644 index 4a6b550..0000000 --- a/Packages/MinimalUtility/Runtime/ForEachAttribute.cs +++ /dev/null @@ -1,65 +0,0 @@ -#nullable enable - -using System; - -namespace MinimalUtility -{ - /// - /// と一緒に使うことでGetEnumerator拡張を生やす属性. - /// - /// - /// 以下のようなコードを自動生成して、foreach文で保持フラグの列挙を可能にする.その必要がなければ、を使用推奨. - /// - /// - /// - /// - /// - /// - [AttributeUsage(AttributeTargets.Enum, Inherited = false)] - public sealed class ForEachAttribute : Attribute - { - /// - /// Initializes a new instance of the class. - /// - public ForEachAttribute() : base() - { - } - } -} diff --git a/Packages/MinimalUtility/Runtime/ForEachAttribute.cs.meta b/Packages/MinimalUtility/Runtime/ForEachAttribute.cs.meta deleted file mode 100644 index f255521..0000000 --- a/Packages/MinimalUtility/Runtime/ForEachAttribute.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: c635c78fed724f158d5fa12e42b8de0a -timeCreated: 1732206337 \ No newline at end of file diff --git a/Packages/MinimalUtility/Runtime/Roslyn/MinimalUtility.SourceGenerator.dll b/Packages/MinimalUtility/Runtime/Roslyn/MinimalUtility.SourceGenerator.dll index d1385feca11f0149d73bd53a86ad8e0f02871ddb..e95754380ccf6b6ddbf59f8de3db62d7e79a10cb 100644 GIT binary patch delta 9441 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 delta 10316 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 IIM`tP9|dh*7XSbN diff --git a/Packages/MinimalUtility/Runtime/ValueTupleExtensions.cs b/Packages/MinimalUtility/Runtime/ValueTupleExtensions.cs index f55e6cb..0219daa 100644 --- a/Packages/MinimalUtility/Runtime/ValueTupleExtensions.cs +++ b/Packages/MinimalUtility/Runtime/ValueTupleExtensions.cs @@ -15,16 +15,11 @@ public static class ValueTupleExtensions /// /// 対象の. /// 要素の型. - /// 要素を列挙する. + /// 要素を列挙する. [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Enumerator GetEnumerator(in this (T, T) tuple) + public static Enumerator GetEnumerator(in this (T, T) tuple) { - return new (tuple, static (t, i) => i switch - { - 0 => t.Item1, - 1 => t.Item2, - _ => throw new IndexOutOfRangeException(), - }); + return new ((tuple.Item1, tuple.Item2, default, default, default, default, default)!, 2); } /// @@ -32,17 +27,11 @@ public static class ValueTupleExtensions /// /// 対象の. /// 要素の型. - /// 要素を列挙する. + /// 要素を列挙する. [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Enumerator GetEnumerator(in this (T, T, T) tuple) + public static Enumerator GetEnumerator(in this (T, T, T) tuple) { - return new (tuple, static (t, i) => i switch - { - 0 => t.Item1, - 1 => t.Item2, - 2 => t.Item3, - _ => throw new IndexOutOfRangeException(), - }); + return new ((tuple.Item1, tuple.Item2, tuple.Item3, default, default, default, default)!, 3); } /// @@ -50,18 +39,11 @@ public static class ValueTupleExtensions /// /// 対象の. /// 要素の型. - /// 要素を列挙する. + /// 要素を列挙する. [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Enumerator GetEnumerator(in this (T, T, T, T) tuple) + public static Enumerator GetEnumerator(in this (T, T, T, T) tuple) { - return new (tuple, static (t, i) => i switch - { - 0 => t.Item1, - 1 => t.Item2, - 2 => t.Item3, - 3 => t.Item4, - _ => throw new IndexOutOfRangeException(), - }); + return new ((tuple.Item1, tuple.Item2, tuple.Item3, tuple.Item4, default, default, default)!, 4); } /// @@ -69,19 +51,11 @@ public static class ValueTupleExtensions /// /// 対象の. /// 要素の型. - /// 要素を列挙する. + /// 要素を列挙する. [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Enumerator GetEnumerator(in this (T, T, T, T, T) tuple) + public static Enumerator GetEnumerator(in this (T, T, T, T, T) tuple) { - return new (tuple, static (t, i) => i switch - { - 0 => t.Item1, - 1 => t.Item2, - 2 => t.Item3, - 3 => t.Item4, - 4 => t.Item5, - _ => throw new IndexOutOfRangeException(), - }); + return new ((tuple.Item1, tuple.Item2, tuple.Item3, tuple.Item4, tuple.Item5, default, default)!, 5); } /// @@ -89,20 +63,11 @@ public static class ValueTupleExtensions /// /// 対象の. /// 要素の型. - /// 要素を列挙する. + /// 要素を列挙する. [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Enumerator GetEnumerator(in this (T, T, T, T, T, T) tuple) + public static Enumerator GetEnumerator(in this (T, T, T, T, T, T) tuple) { - return new (tuple, static (t, i) => i switch - { - 0 => t.Item1, - 1 => t.Item2, - 2 => t.Item3, - 3 => t.Item4, - 4 => t.Item5, - 5 => t.Item6, - _ => throw new IndexOutOfRangeException(), - }); + return new ((tuple.Item1, tuple.Item2, tuple.Item3, tuple.Item4, tuple.Item5, tuple.Item6, default)!, 6); } /// @@ -110,56 +75,55 @@ public static class ValueTupleExtensions /// /// 対象の. /// 要素の型. - /// 要素を列挙する. + /// 要素を列挙する. [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Enumerator GetEnumerator(in this (T, T, T, T, T, T, T) tuple) + public static Enumerator GetEnumerator(in this (T, T, T, T, T, T, T) tuple) { - return new (tuple, static (t, i) => i switch - { - 0 => t.Item1, - 1 => t.Item2, - 2 => t.Item3, - 3 => t.Item4, - 4 => t.Item5, - 5 => t.Item6, - 6 => t.Item7, - _ => throw new IndexOutOfRangeException(), - }); + return new (tuple, 7); } /// /// ValueTupleのforeach対応. /// /// 要素の型. - /// ValueTupleの型. - public struct Enumerator where TTuple : struct, ITuple + public struct Enumerator { - private readonly TTuple _tuple; - private readonly Func _current; + private readonly (T, T, T, T, T, T, T) _tuple; + private readonly int _length; private int _index; /// /// に同じ. /// - public T Current => _current(_tuple, _index); + public T Current => _index switch + { + 0 => _tuple.Item1, + 1 => _tuple.Item2, + 2 => _tuple.Item3, + 3 => _tuple.Item4, + 4 => _tuple.Item5, + 5 => _tuple.Item6, + 6 => _tuple.Item7, + _ => throw new IndexOutOfRangeException(), + }; /// - /// Initializes a new instance of the struct. + /// Initializes a new instance of the struct. /// - /// ValueTuple. - /// で実行する処理. - internal Enumerator(in TTuple tuple, Func current) + /// + /// + internal Enumerator(in (T, T, T, T, T, T, T) tuple, int length) { this._tuple = tuple; - this._current = current; - _index = -1; + this._length = length; + this._index = -1; } /// /// に同じ. /// /// 列挙が可能な場合はtrue. - public bool MoveNext() => _index < _tuple.Length && ++_index < _tuple.Length; + public bool MoveNext() => _index < _length && ++_index < _length; } } } diff --git a/SourceGenerator/MinimalUtility.SourceGenerator/XEnumGenerator.cs b/SourceGenerator/MinimalUtility.SourceGenerator/XEnumGenerator.cs index c6724d8..000463f 100644 --- a/SourceGenerator/MinimalUtility.SourceGenerator/XEnumGenerator.cs +++ b/SourceGenerator/MinimalUtility.SourceGenerator/XEnumGenerator.cs @@ -26,7 +26,7 @@ void IIncrementalGenerator.Initialize(IncrementalGeneratorInitializationContext { IsGenericMethod: true, Name: "GetValues" or "GetLength" or "GetNames" or "GetName" or "IsDefined" or "Parse" or "TryParse" - or "ToXEnumString" or "GetEnumMemberValue" or "HasBitFlag" or "ConstructFlags" + or "ToXEnumString" or "GetEnumMemberValue" or "HasBitFlag" or "ConstructFlags" or "Enumerate" } && method.ContainingType.ToDisplayString() != "MinimalUtility.XEnum.Cache") .Select((symbol, token) => @@ -34,20 +34,7 @@ void IIncrementalGenerator.Initialize(IncrementalGeneratorInitializationContext token.ThrowIfCancellationRequested(); return symbol.TypeArguments[0]; }); - var foreachSymbols = context.SyntaxProvider.ForAttributeWithMetadataName( - "MinimalUtility.ForEachAttribute", - static (_, token) => - { - token.ThrowIfCancellationRequested(); - return true; - }, - static (context, token) => - { - token.ThrowIfCancellationRequested(); - return context.TargetSymbol; - }); - context.RegisterSourceOutput(types.Collect().Combine(foreachSymbols.Collect()), RegisterCoreImplementation); - context.RegisterSourceOutput(foreachSymbols.Collect(), RegisterGetEnumeratorExtensions); + context.RegisterSourceOutput(types.Collect(), RegisterCoreImplementation); } private static void RegisterBasisClass(IncrementalGeneratorPostInitializationContext context) @@ -86,6 +73,8 @@ internal static partial class XEnum public static bool HasBitFlag(this T value, in T flag) where T : struct, Enum => Cache.Default.HasBitFlag(value, flag); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool ConstructFlags(this T value) where T : struct, Enum => Cache.Default.ConstructFlags(value); + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static EnumeratorFactory Enumerate(this T value) where T : struct, Enum => new(value); private abstract partial class Cache where T : struct, Enum { @@ -101,31 +90,41 @@ private abstract partial class Cache where T : struct, Enum public abstract string GetEnumMemberValue(in T value); public abstract bool HasBitFlag(in T value, in T flag); public virtual bool ConstructFlags(in T value) => false; + public abstract bool MoveNext(ref T value, ref T current); + } + + internal readonly struct EnumeratorFactory where T : struct, Enum + { + private readonly T value; + public EnumeratorFactory(T value) => this.value = value; + public Enumerator GetEnumerator() => new Enumerator(value); + } + + internal struct Enumerator where T : struct, Enum + { + private T value; + private T current; + public T Current => current; + + public Enumerator(T value) + { + this.value = value; + current = default; + } + + public bool MoveNext() + { + return Cache.Default.MoveNext(ref value, ref current); + } } } } """); } - private static void RegisterCoreImplementation(SourceProductionContext context, (ImmutableArray types, ImmutableArray foreaches) metaDataArrays) + private static void RegisterCoreImplementation(SourceProductionContext context, ImmutableArray metaDataArray) { context.CancellationToken.ThrowIfCancellationRequested(); - var metaDataArray = metaDataArrays.types; - - // If there is something in foreaches that does not overlap with metaDataArray, add that too. - // This is a workaround because if the XEnum is accessed in a scope that uses a GetEnumerator generated by Extensions, it cannot be read by the SyntaxTree. - var foreaches = metaDataArrays.foreaches; - if (!foreaches.IsEmpty) - { - var hashset = new HashSet(metaDataArray, SymbolEqualityComparer.Default); - foreach (var symbol in foreaches) - { - if (symbol is ITypeSymbol type && hashset.Add(type)) - { - metaDataArray = metaDataArray.Add(type); - } - } - } if (metaDataArray.IsEmpty) return; @@ -399,13 +398,12 @@ public override string GetEnumMemberValue(in """); } - var containsFlags = genericSymbol.ContainFlagsAttribute(); cacheSb.Append(" public override bool HasBitFlag(in "); cacheSb.Append(typeFullName).Append(" value, in ").Append(typeFullName).Append(" flag) => "); - cacheSb.AppendLine(containsFlags ? "(value & flag) == flag;" : "value == flag;"); - if (containsFlags) + if (genericSymbol.ContainFlagsAttribute()) { + cacheSb.AppendLine("(value & flag) == flag;"); cacheSb.Append(" public override bool ConstructFlags(in "); cacheSb.Append(typeFullName); cacheSb.Append(""" @@ -419,6 +417,53 @@ public override string GetEnumMemberValue(in return (flags & (flags - 1)) != 0; } """); + cacheSb.AppendLine(); + + cacheSb.Append(" public override bool MoveNext(ref "); + cacheSb.Append(typeFullName); + cacheSb.Append(" value, ref "); + cacheSb.Append(typeFullName); + cacheSb.Append(""" + current) + { + var flags = ( + """); + cacheSb.Append(baseType); + cacheSb.Append(""" + )value; + if (flags == 0) return false; + current = ( + """); + cacheSb.Append(typeFullName); + cacheSb.AppendLine(""" + )(flags & -flags); // get lowest flag + value &= ~current; + return true; + } + """); + } + else + { + cacheSb.AppendLine("value == flag;"); + + cacheSb.Append(" public override bool MoveNext(ref "); + cacheSb.Append(typeFullName); + cacheSb.Append(" value, ref "); + cacheSb.Append(typeFullName); + cacheSb.Append(""" + current) + { + if (( + """); + cacheSb.Append(baseType); + cacheSb.Append(")value == ("); + cacheSb.Append(baseType); + cacheSb.AppendLine(""" + )current) return false; + current = value; + return true; + } + """); } cacheSb.Append(""" @@ -444,119 +489,4 @@ public override string GetEnumMemberValue(in context.AddSource("XEnum.Core.g.cs", mainSb.ToString()); } - - private static void RegisterGetEnumeratorExtensions(SourceProductionContext context, ImmutableArray metaDataArray) - { - context.CancellationToken.ThrowIfCancellationRequested(); - if (metaDataArray.IsEmpty) return; - - foreach (var symbol in metaDataArray) - { - if (!symbol.ContainFlagsAttribute()) continue; - - // using System.Runtime.CompilerServices; - // - // namespace MinimalUtility - // { - // internal static class HogeExtensions - // { - // - // [MethodImpl(MethodImplOptions.AggressiveInlining)] - // public static Enumerator GetEnumerator(this Hoge value) - // { - // return new Enumerator(value); - // } - // - // public struct Enumerator - // { - // private Hoge value; - // - // public Hoge Current { get; private set; } - // - // internal Enumerator(Hoge value) - // { - // this.value = value; - // Current = default; - // } - // - // public bool MoveNext() - // { - // var flags = (int)value; - // if (flags == 0) return false; - // Current = (Hoge)(flags & -flags); // get lowest flag - // value &= ~Current; - // return true; - // } - // } - // } - // } - - var baseType = ((INamedTypeSymbol)symbol).GetEnumBaseTypeStr(); - var typeName = symbol.Name; - var fullTypeName = symbol.GetFullTypeName(); - - var sb = new StringBuilder(""" - using System.Runtime.CompilerServices; - - namespace MinimalUtility - { - internal static class - """); - sb.Append(typeName); - sb.Append(""" - Extensions - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Enumerator GetEnumerator(this - """); - sb.Append(fullTypeName); - sb.Append(""" - value) => new Enumerator(value); - - public struct Enumerator - { - private - """); - sb.Append(fullTypeName); - sb.Append(""" - value; - public - """); - sb.Append(fullTypeName); - sb.Append(""" - Current { get; private set; } - - internal Enumerator( - """); - sb.Append(fullTypeName); - sb.Append(""" - value) - { - this.value = value; - Current = default; - } - - public bool MoveNext() - { - var flags = ( - """); - sb.Append(baseType); - sb.Append(""" - )value; - if (flags == 0) return false; - Current = ( - """); - sb.Append(fullTypeName); - sb.Append(""" - )(flags & -flags); // get lowest flag - value &= ~Current; - return true; - } - } - } - } - """); - context.AddSource(fullTypeName + "Extensions.g.cs", sb.ToString()); - } - } } \ No newline at end of file