Skip to content

Commit 397f855

Browse files
committed
Add support for AsValueEnumerable() for implementations of IEnumerable<> with value type or reference type enumerators
1 parent 66bb700 commit 397f855

File tree

6 files changed

+63
-8
lines changed

6 files changed

+63
-8
lines changed

NetFabric.Hyperlinq.SourceGenerator.UnitTests/GenerateSourceTests.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,11 @@ public static TheoryData<string[], string> GeneratorSources
3232
new[] { "TestData/Source/AsValueEnumerable.TestEnumerableWithValueTypeEnumerator.cs" },
3333
"TestData/Results/AsValueEnumerable.TestEnumerableWithValueTypeEnumerator.cs"
3434
},
35-
{
35+
{
36+
new[] { "TestData/Source/AsValueEnumerable.TestEnumerableWithReferenceTypeEnumerator.cs" },
37+
"TestData/Results/AsValueEnumerable.TestEnumerableWithReferenceTypeEnumerator.cs"
38+
},
39+
{
3640
new[] { "TestData/Source/AsValueEnumerable.TestValueEnumerable.cs" },
3741
"TestData/Results/AsValueEnumerable.TestValueEnumerable.cs"
3842
},
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#nullable enable
2+
3+
using System;
4+
using System.Collections;
5+
using System.Collections.Generic;
6+
using System.Runtime.CompilerServices;
7+
8+
namespace NetFabric.Hyperlinq
9+
{
10+
static partial class GeneratedExtensionMethods
11+
{
12+
13+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
14+
public static TestEnumerableWithReferenceTypeEnumeratorAsValueEnumerable AsValueEnumerable(this TestEnumerableWithReferenceTypeEnumerator source) => new(source);
15+
16+
public readonly struct TestEnumerableWithReferenceTypeEnumeratorAsValueEnumerable: IValueEnumerable<int, ValueEnumerator<int>>
17+
{
18+
readonly TestEnumerableWithReferenceTypeEnumerator source;
19+
20+
public TestEnumerableWithReferenceTypeEnumeratorAsValueEnumerable(TestEnumerableWithReferenceTypeEnumerator source) => this.source = source;
21+
22+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
23+
public ValueEnumerator<int> GetEnumerator() => new(source.GetEnumerator());
24+
25+
IEnumerator<int> IEnumerable<int>.GetEnumerator() => source.GetEnumerator();
26+
27+
IEnumerator IEnumerable.GetEnumerator() => source.GetEnumerator();
28+
}
29+
}
30+
}

NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/AsValueEnumerable.TestEnumerableWithValueTypeEnumerator.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,20 @@ static partial class GeneratedExtensionMethods
1111
{
1212

1313
[MethodImpl(MethodImplOptions.AggressiveInlining)]
14-
public static EnumerableWithValueTypeEnumerator__ValueEnumerable AsValueEnumerable(this TestEnumerableWithValueTypeEnumerator source) => new(source);
14+
public static TestEnumerableWithValueTypeEnumeratorAsValueEnumerable AsValueEnumerable(this TestEnumerableWithValueTypeEnumerator source) => new(source);
1515

16-
public readonly struct EnumerableWithValueTypeEnumerator__ValueEnumerable : IValueEnumerable<int, TestEnumerableWithValueTypeEnumerator.Enumerator>
16+
public readonly struct TestEnumerableWithValueTypeEnumeratorAsValueEnumerable: IValueEnumerable<int, TestEnumerableWithValueTypeEnumerator.Enumerator>
1717
{
1818
readonly TestEnumerableWithValueTypeEnumerator source;
1919

20-
public EnumerableWithValueTypeEnumerator__ValueEnumerable(TestEnumerableWithValueTypeEnumerator source) => this.source = source;
20+
public TestEnumerableWithValueTypeEnumeratorAsValueEnumerable(TestEnumerableWithValueTypeEnumerator source) => this.source = source;
2121

22+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
2223
public TestEnumerableWithValueTypeEnumerator.Enumerator GetEnumerator() => source.GetEnumerator();
24+
2325
IEnumerator<int> IEnumerable<int>.GetEnumerator() => source.GetEnumerator();
26+
2427
IEnumerator IEnumerable.GetEnumerator() => source.GetEnumerator();
2528
}
26-
2729
}
2830
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using System;
2+
using System.Collections;
3+
using System.Collections.Generic;
4+
using NetFabric.Hyperlinq;
5+
6+
partial class TestsSource
7+
{
8+
static void AsValueEnumerable_TestEnumerableWithReferenceTypeEnumerator()
9+
{
10+
// test calling AsValueEnumerable() for types that implement IEnumerable<> and the enumerator is not a value type
11+
12+
_ = new TestEnumerableWithReferenceTypeEnumerator().AsValueEnumerable();
13+
}
14+
}
15+
16+
17+
18+
19+

NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/AsValueEnumerable.TestEnumerableWithValueTypeEnumerator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ partial class TestsSource
77
{
88
static void AsValueEnumerable_EnumerableWithValueTypeEnumerator()
99
{
10-
// test calling AsValueEnumerable() for types that implement IEnumerable<>
10+
// test calling AsValueEnumerable() for types that implement IEnumerable<> and the enumerator is a value type
1111

1212
_ = new TestEnumerableWithValueTypeEnumerator().AsValueEnumerable();
1313
}

NetFabric.Hyperlinq.SourceGenerator/Generator.AsValueEnumerable.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ static bool HandleAsValueEnumerable(Compilation compilation, TypeSymbolCache typ
4848

4949
if (receiverTypeSymbol.IsEnumerable(compilation, out var enumerableSymbols))
5050
{
51-
var enumerableTypeString = $"{receiverTypeString}__ValueEnumerable";
51+
var enumerableTypeString = $"{receiverTypeString}AsValueEnumerable";
5252
var enumeratorTypeString = "Enumerator";
5353
var itemType = enumerableSymbols.EnumeratorSymbols.Current.Type;
5454
var itemTypeString = itemType.ToDisplayString();
@@ -77,7 +77,7 @@ static bool HandleAsValueEnumerable(Compilation compilation, TypeSymbolCache typ
7777
.AppendLine($"public static {enumerableTypeString} AsValueEnumerable(this {receiverTypeString} source) => new(source);")
7878
.AppendLine();
7979

80-
using (builder.AppendBlock($"public readonly struct {enumerableTypeString} : IValueEnumerable<{itemType.ToDisplayString()}, {enumeratorTypeString}>"))
80+
using (builder.AppendBlock($"public readonly struct {enumerableTypeString}: IValueEnumerable<{itemType.ToDisplayString()}, {enumeratorTypeString}>"))
8181
{
8282
_ = builder
8383
.AppendLine($"readonly {receiverTypeString} source;") // source field

0 commit comments

Comments
 (0)