diff --git a/.editorconfig b/.editorconfig
index 4cead120d..b4a841bef 100755
--- a/.editorconfig
+++ b/.editorconfig
@@ -68,14 +68,14 @@ csharp_style_var_for_built_in_types = true:error
csharp_style_var_when_type_is_apparent = true:error
# Expression-bodied members
-csharp_style_expression_bodied_accessors = true:error
-csharp_style_expression_bodied_constructors = true:error
-csharp_style_expression_bodied_indexers = true:error
-csharp_style_expression_bodied_lambdas = true:error
-csharp_style_expression_bodied_local_functions = true:error
-csharp_style_expression_bodied_methods = true:error
-csharp_style_expression_bodied_operators = true:error
-csharp_style_expression_bodied_properties = true:error
+csharp_style_expression_bodied_accessors =true:warning
+csharp_style_expression_bodied_constructors =true:warning
+csharp_style_expression_bodied_indexers =true:warning
+csharp_style_expression_bodied_lambdas =true:warning
+csharp_style_expression_bodied_local_functions =true:warning
+csharp_style_expression_bodied_methods =true:warning
+csharp_style_expression_bodied_operators =true:warning
+csharp_style_expression_bodied_properties =true:warning
# Pattern matching preferences
csharp_style_pattern_matching_over_as_with_null_check = true:error
@@ -101,7 +101,7 @@ csharp_style_pattern_local_over_anonymous_function = true:error
csharp_style_prefer_index_operator = true:warning
csharp_style_prefer_range_operator = true:warning
csharp_style_throw_expression = true:error
-csharp_style_unused_value_assignment_preference = discard_variable:error
+csharp_style_unused_value_assignment_preference =discard_variable:warning
csharp_style_unused_value_expression_statement_preference = discard_variable:error
# 'using' directive preferences
@@ -216,3 +216,6 @@ dotnet_naming_style.camel_case.required_prefix =
dotnet_naming_style.camel_case.required_suffix =
dotnet_naming_style.camel_case.word_separator =
dotnet_naming_style.camel_case.capitalization = camel_case
+
+[*.{cs,vb}]
+dotnet_code_quality_unused_parameters=all:warning
\ No newline at end of file
diff --git a/.github/workflows/dotnetcore.yml b/.github/workflows/dotnetcore.yml
index a6013e986..f8ebf0884 100644
--- a/.github/workflows/dotnetcore.yml
+++ b/.github/workflows/dotnetcore.yml
@@ -10,9 +10,10 @@ jobs:
- name: Check out repository
uses: actions/checkout@v2
- name: Setup .NET Core
- uses: actions/setup-dotnet@v1.7.2
+ uses: actions/setup-dotnet@v1
with:
- dotnet-version: '6.0.100-preview.2.21155.3'
+ dotnet-version: '6.0.x'
+ include-prerelease: true
- name: Test source generator
run: dotnet test ./NetFabric.Hyperlinq.SourceGenerator.UnitTests/NetFabric.Hyperlinq.SourceGenerator.UnitTests.csproj
- name: Build solution
diff --git a/NetFabric.Hyperlinq.Benchmarks/NetFabric.Hyperlinq.Benchmarks.csproj b/NetFabric.Hyperlinq.Benchmarks/NetFabric.Hyperlinq.Benchmarks.csproj
index 794ee51ce..fabfaa4fb 100644
--- a/NetFabric.Hyperlinq.Benchmarks/NetFabric.Hyperlinq.Benchmarks.csproj
+++ b/NetFabric.Hyperlinq.Benchmarks/NetFabric.Hyperlinq.Benchmarks.csproj
@@ -4,6 +4,7 @@
net6.0
false
true
+ true
@@ -15,6 +16,7 @@
+
diff --git a/NetFabric.Hyperlinq.Immutable/NetFabric.Hyperlinq.Immutable.csproj b/NetFabric.Hyperlinq.Immutable/NetFabric.Hyperlinq.Immutable.csproj
deleted file mode 100644
index f433a0dbc..000000000
--- a/NetFabric.Hyperlinq.Immutable/NetFabric.Hyperlinq.Immutable.csproj
+++ /dev/null
@@ -1,55 +0,0 @@
-
-
-
- netstandard2.0
- NetFabric.Hyperlinq.Immutable
- NetFabric.Hyperlinq.Immutable
- High performance LINQ implementation with minimal heap allocations. Supports all collections in System.Collections.Immutable.
- 1.0.0-beta01
- Icon.png
- LICENSE
- netfabric, hyperlinq, linq, enumeration, extensions, performance
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- all
- runtime; build; native; contentfiles; analyzers
-
-
- all
- runtime; build; native; contentfiles; analyzers
-
-
- all
- runtime; build; native; contentfiles; analyzers
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/CollectExtensionMethodsTests.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/CollectExtensionMethodsTests.cs
deleted file mode 100644
index 1bf2b271d..000000000
--- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/CollectExtensionMethodsTests.cs
+++ /dev/null
@@ -1,49 +0,0 @@
-using Microsoft.CodeAnalysis;
-using NetFabric.Assertive;
-using System.IO;
-using System.Linq;
-using System.Threading.Tasks;
-using Xunit;
-
-namespace NetFabric.Hyperlinq.SourceGenerator.UnitTests
-{
- public class CollectExtensionMethodsTests
- {
- public static TheoryData ExtensionMethods
- => new()
- {
- { new[] { "TestData/Source/NoExtensionMethods.cs" }, 0 },
- { new[] { "TestData/Source/ExtensionMethods.cs" }, 3 },
-
- { new[] { "TestData/Source/Distinct.ArraySegment.cs" }, 1},
- { new[] { "TestData/Source/Count.ValueEnumerable.cs" }, 1 },
- { new[] { "TestData/Source/Distinct.ValueEnumerable.cs" }, 1 },
-
- { new[] { "TestData/Source/Where.ArraySegment.cs" }, 2 },
- { new[] { "TestData/Source/Select.ArraySegment.cs" }, 2 },
- { new[] { "TestData/Source/Where.ValueEnumerable.cs" }, 2 },
- { new[] { "TestData/Source/Select.ValueEnumerable.cs" }, 2 },
- };
-
- [Theory]
- [MemberData(nameof(ExtensionMethods))]
- public async Task ShouldCollectExpectedNumberOfExtensionMethods(string[] paths, int expected)
- {
- // Arrange
- var generator = new OverloadsGenerator();
- var project = Verifier.CreateProject(
- paths
- .Concat(Directory.EnumerateFiles("TestData/Source/Common", "*.cs", SearchOption.AllDirectories))
- .Concat(Directory.EnumerateFiles("../../../../NetFabric.Hyperlinq.SourceGenerator/Attributes/", "*.cs", SearchOption.AllDirectories))
- .Select(path => File.ReadAllText(path)));
- var context = new CompilationContext(await project.GetCompilationAsync().ConfigureAwait(false) ?? throw new System.Exception("Error getting compilation!"));
-
- // Act
- var result = generator.CollectExtensionMethods(context);
-
- // Assert
- _ = result.Count.Must()
- .BeEqualTo(expected);
- }
- }
-}
\ No newline at end of file
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/GenerateSourceTests.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/GenerateSourceTests.cs
index 44078968f..619f11417 100644
--- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/GenerateSourceTests.cs
+++ b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/GenerateSourceTests.cs
@@ -1,7 +1,8 @@
-using Microsoft.CodeAnalysis;
+using Microsoft.CodeAnalysis.CSharp.Syntax;
using NetFabric.Assertive;
using System.IO;
using System.Linq;
+using System.Threading;
using System.Threading.Tasks;
using Xunit;
@@ -9,233 +10,81 @@ namespace NetFabric.Hyperlinq.SourceGenerator.UnitTests
{
public class GenerateSourceTests
{
- public static TheoryData ClassesWithOverloads
- => new()
- {
- new[] {
- "TestData/Source/Count.ValueEnumerable.cs",
- },
- new[] {
- "TestData/Source/Where.ValueEnumerable.cs",
- },
- new[] {
- "TestData/Source/Select.ValueEnumerable.cs",
- },
- };
-
- [Theory]
- [MemberData(nameof(ClassesWithOverloads))]
- public async Task ClassesWithOverloadsShouldNotGenerate(string[] paths)
- {
- // Arrange
- var generator = new OverloadsGenerator();
- var project = Verifier.CreateProject(
- paths
- .Concat(Directory.EnumerateFiles("TestData/Source/Common", "*.cs", SearchOption.AllDirectories))
- .Concat(Directory.EnumerateFiles("../../../../NetFabric.Hyperlinq.SourceGenerator/Attributes/", "*.cs", SearchOption.AllDirectories))
- .Select(path => File.ReadAllText(path)));
- var context = new CompilationContext(await project.GetCompilationAsync().ConfigureAwait(false) ?? throw new System.Exception("Error getting compilation!"));
-
- // Act
- var extensionMethods = generator.CollectExtensionMethods(context);
- var result = generator.GenerateSource(extensionMethods, context);
-
- // Assert
- _ = result.Must()
- .BeEnumerableOf<(INamedTypeSymbol, INamedTypeSymbol, string)>()
- .BeEmpty();
- }
-
- // -----------------------------------------------------
-
- public static TheoryData GeneratorSources
+ public static TheoryData GeneratorSources
=> new()
{
{
- new[] {
- "TestData/Source/Range.cs",
- "TestData/Source/Contains.ValueEnumerable.cs",
- },
- new string[] {
- }
+ new[] { "TestData/Source/AsValueEnumerable.Empty.cs" },
+ "TestData/Results/Empty.cs"
},
{
- new[] {
- "TestData/Source/Select.ArraySegment.cs",
- "TestData/Source/Contains.ValueEnumerable.cs",
- },
- new string[] {
- }
+ new[] { "TestData/Source/AsValueEnumerable.Empty2.cs" },
+ "TestData/Results/Empty.cs"
},
{
- new[] {
- "TestData/Source/Range.cs",
- "TestData/Source/Count.ValueEnumerable.cs",
- },
- new[] {
- "TestData/Results/Range.Count.cs",
- }
+ new[] { "TestData/Source/AsValueEnumerable.Repeat.cs" },
+ "TestData/Results/AsValueEnumerable.Repeat.cs"
},
- {
- new[] {
- "TestData/Source/Repeat.cs",
- "TestData/Source/Count.ValueEnumerable.cs",
- },
- new[] {
- "TestData/Results/Repeat.Count.cs",
- }
+ {
+ new[] { "TestData/Source/AsValueEnumerable.TestEnumerableWithNoInterfaces.cs" },
+ "TestData/Results/AsValueEnumerable.TestEnumerableWithNoInterfaces.cs"
},
{
- new[] {
- "TestData/Source/Range.cs",
- "TestData/Source/Where.ValueEnumerable.cs",
- },
- new[] {
- "TestData/Results/Range.Where.cs",
- }
+ new[] { "TestData/Source/AsValueEnumerable.TestEnumerableWithValueTypeEnumerator.cs" },
+ "TestData/Results/AsValueEnumerable.TestEnumerableWithValueTypeEnumerator.cs"
},
{
- new[] {
- "TestData/Source/Range.cs",
- "TestData/Source/Select.ValueEnumerable.cs",
- },
- new[] {
- "TestData/Results/Range.Select.cs",
- }
+ new[] { "TestData/Source/AsValueEnumerable.TestEnumerableWithReferenceTypeEnumerator.cs" },
+ "TestData/Results/AsValueEnumerable.TestEnumerableWithReferenceTypeEnumerator.cs"
},
{
- new[] {
- "TestData/Source/Count.ValueEnumerable.cs",
- "TestData/Source/Where.ArraySegment.cs",
- },
- new[] {
- "TestData/Results/Where.ArraySegment.Count.cs",
- }
+ new[] { "TestData/Source/AsValueEnumerable.TestEnumerableWithInterfacelessPublicEnumerator.cs" },
+ "TestData/Results/AsValueEnumerable.TestEnumerableWithInterfacelessPublicEnumerator.cs"
},
{
- new[] {
- "TestData/Source/Any.ArraySegment.cs",
- "TestData/Source/Any.ValueReadOnlyList.cs",
- "TestData/Source/Any.ValueEnumerable.cs",
- "TestData/Source/Any.ValueReadOnlyCollection.cs",
- "TestData/Source/Where.ValueEnumerable.cs",
- },
- new string[] {
- }
- },
- {
- new[] {
- "TestData/Source/Any.ArraySegment.cs",
- "TestData/Source/Any.ValueReadOnlyList.cs",
- "TestData/Source/Any.ValueEnumerable.cs",
- "TestData/Source/Any.ValueReadOnlyCollection.cs",
- "TestData/Source/Select.ArraySegment.cs",
- },
- new[] {
- "TestData/Results/Select.ArraySegment.Any.cs",
- }
- },
- {
- new[] {
- "TestData/Source/Any.ArraySegment.cs",
- "TestData/Source/Any.ValueReadOnlyList.cs",
- "TestData/Source/Any.ValueEnumerable.cs",
- "TestData/Source/Any.ValueReadOnlyCollection.cs",
- "TestData/Source/Select.ValueEnumerable.cs",
- },
- new[] {
- "TestData/Results/Select.ValueEnumerable.Any.cs",
- }
- },
- {
- new[] {
- "TestData/Source/Count.ValueEnumerable.cs",
- "TestData/Source/Where.ValueEnumerable.cs",
- },
- new[] {
- "TestData/Results/Where.ValueEnumerable.Count.cs",
- }
- },
- {
- new[] {
- "TestData/Source/First.ValueEnumerable.cs",
- "TestData/Source/Where.ValueEnumerable.cs",
- },
- new[] {
- "TestData/Results/Where.ValueEnumerable.First.cs",
- }
- },
- {
- new[] {
- "TestData/Source/First.ValueEnumerable.cs",
- "TestData/Source/Select.ValueEnumerable.cs",
- },
- new[] {
- "TestData/Results/Select.ValueEnumerable.First.cs",
- }
- },
- {
- new[] {
- "TestData/Source/Where.ValueEnumerable.cs",
- "TestData/Source/Distinct.ValueEnumerable.cs",
- },
- new[] {
- "TestData/Results/Where.ValueEnumerable.Distinct.cs",
- "TestData/Results/Distinct.ValueEnumerable.Where.cs",
- }
- },
- {
- new[] {
- "TestData/Source/Where.ValueEnumerable.cs",
- "TestData/Source/Select.ValueEnumerable.cs",
- },
- new[] {
- "TestData/Results/Where.ValueEnumerable.Select.cs",
- "TestData/Results/Select.ValueEnumerable.Where.cs",
- }
- },
- {
- new[] {
- "TestData/Source/Where.ValueEnumerable.cs",
- "TestData/Source/Dictionary.Bindings.cs",
- },
- new[] {
- "TestData/Results/Dictionary.Where.cs",
- }
- },
- {
- new[] {
- "TestData/Source/Select.ValueEnumerable.cs",
- "TestData/Source/Dictionary.Bindings.cs",
- },
- new[] {
- "TestData/Results/Dictionary.Select.cs",
- }
+ new[] { "TestData/Source/AsValueEnumerable.TestValueEnumerable.cs" },
+ "TestData/Results/AsValueEnumerable.TestValueEnumerable.cs"
},
+ //{
+ // new[] { "TestData/Source/Count.Array.cs" },
+ // "TestData/Results/Count.Array.cs"
+ //},
+ //{
+ // new[] { "TestData/Source/Count.Span.cs" },
+ // "TestData/Results/Count.Span.cs"
+ //},
};
[Theory]
[MemberData(nameof(GeneratorSources))]
- public async Task GenerateSourceShouldGenerate(string[] paths, string[] expected)
+ public async Task GenerateSourceShouldGenerate(string[] paths, string expected)
{
// Arrange
- var generator = new OverloadsGenerator();
- var project = Verifier.CreateProject(
- paths
+ var sources = paths
.Concat(Directory.EnumerateFiles("TestData/Source/Common", "*.cs", SearchOption.AllDirectories))
- .Concat(Directory.EnumerateFiles("../../../../NetFabric.Hyperlinq.SourceGenerator/Attributes/", "*.cs", SearchOption.AllDirectories))
- .Select(path => File.ReadAllText(path)));
- var context = new CompilationContext(await project.GetCompilationAsync().ConfigureAwait(false) ?? throw new System.Exception("Error getting compilation!"));
+ .Select(path => File.ReadAllText(path));
+ var project = Verifier.CreateProject(sources);
+ var compilation = await project.GetCompilationAsync().ConfigureAwait(false)
+ ?? throw new System.Exception("Error getting compilation!");
+ //var errors = compilation
+ // .GetDiagnostics()
+ // .Where(diagnostic => diagnostic.Severity == DiagnosticSeverity.Error)
+ // .ToArray();
+ //_ = errors.Must().BeEqualTo(Array.Empty());
+ var typeSymbolsCache = new TypeSymbolsCache(compilation);
+ var memberAccessExpressions = compilation.SyntaxTrees
+ .SelectMany(tree => tree.GetRoot().DescendantNodes().OfType())
+ .Where(memberAccess => Generator.methods.Contains(memberAccess.Name.Identifier.ValueText))
+ .ToList();
// Act
- var extensionMethods = generator.CollectExtensionMethods(context);
- var result = generator.GenerateSource(extensionMethods, context);
+ var builder = new CodeBuilder();
+ Generator.GenerateSource(compilation, typeSymbolsCache, memberAccessExpressions, builder, CancellationToken.None);
+ var result = builder.ToString();
// Assert
- _ = result.Select(item => item.Source)
- .ToArray()
- .Must()
- .BeEqualTo(expected.Select(path => File.ReadAllText(path)));
+ _ = result.Must()
+ .BeEqualTo(File.ReadAllText(expected));
}
}
}
\ No newline at end of file
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/NetFabric.Hyperlinq.SourceGenerator.UnitTests.csproj b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/NetFabric.Hyperlinq.SourceGenerator.UnitTests.csproj
index 6e60efb64..8505633bc 100644
--- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/NetFabric.Hyperlinq.SourceGenerator.UnitTests.csproj
+++ b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/NetFabric.Hyperlinq.SourceGenerator.UnitTests.csproj
@@ -6,10 +6,14 @@
false
+
+ NOT_TESTING
+
+
-
+
runtime; build; native; contentfiles; analyzers; buildtransitive
@@ -23,6 +27,7 @@
+
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/AsValueEnumerable.Repeat.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/AsValueEnumerable.Repeat.cs
new file mode 100644
index 000000000..7f09fea40
--- /dev/null
+++ b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/AsValueEnumerable.Repeat.cs
@@ -0,0 +1,16 @@
+#nullable enable
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Runtime.CompilerServices;
+
+namespace NetFabric.Hyperlinq
+{
+ static partial class GeneratedExtensionMethods
+ {
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static NetFabric.Hyperlinq.ValueEnumerable.RepeatEnumerable AsValueEnumerable(this NetFabric.Hyperlinq.ValueEnumerable.RepeatEnumerable source) => source;
+ }
+}
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/AsValueEnumerable.TestEnumerableWithInterfacelessPublicEnumerator.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/AsValueEnumerable.TestEnumerableWithInterfacelessPublicEnumerator.cs
new file mode 100644
index 000000000..c3d16b4a3
--- /dev/null
+++ b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/AsValueEnumerable.TestEnumerableWithInterfacelessPublicEnumerator.cs
@@ -0,0 +1,33 @@
+#nullable enable
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Runtime.CompilerServices;
+
+namespace NetFabric.Hyperlinq
+{
+ static partial class GeneratedExtensionMethods
+ {
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static TestEnumerableWithInterfacelessPublicEnumeratorAsValueEnumerable AsValueEnumerable(this TestEnumerableWithInterfacelessPublicEnumerator source) => new(source);
+
+ public readonly struct TestEnumerableWithInterfacelessPublicEnumeratorAsValueEnumerable: IValueEnumerable>
+ {
+ readonly TestEnumerableWithInterfacelessPublicEnumerator source;
+
+ public TestEnumerableWithInterfacelessPublicEnumeratorAsValueEnumerable(TestEnumerableWithInterfacelessPublicEnumerator source) => this.source = source;
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public TestEnumerableWithInterfacelessPublicEnumerator.Enumerator GetEnumerator() => source.GetEnumerator();
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ ValueEnumerator IValueEnumerable>.GetEnumerator() => new(((IEnumerable)source).GetEnumerator());
+
+ IEnumerator IEnumerable.GetEnumerator() => ((IEnumerable)source).GetEnumerator();
+
+ IEnumerator IEnumerable.GetEnumerator() => ((IEnumerable)source).GetEnumerator();
+ }
+ }
+}
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/AsValueEnumerable.TestEnumerableWithNoInterfaces.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/AsValueEnumerable.TestEnumerableWithNoInterfaces.cs
new file mode 100644
index 000000000..fe7b0d3c8
--- /dev/null
+++ b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/AsValueEnumerable.TestEnumerableWithNoInterfaces.cs
@@ -0,0 +1,50 @@
+#nullable enable
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Runtime.CompilerServices;
+
+namespace NetFabric.Hyperlinq
+{
+ static partial class GeneratedExtensionMethods
+ {
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static TestEnumerableWithNoInterfacesAsValueEnumerable AsValueEnumerable(this TestEnumerableWithNoInterfaces source) => new(source);
+
+ public readonly struct TestEnumerableWithNoInterfacesAsValueEnumerable: IValueEnumerable
+ {
+ readonly TestEnumerableWithNoInterfaces source;
+
+ public TestEnumerableWithNoInterfacesAsValueEnumerable(TestEnumerableWithNoInterfaces source) => this.source = source;
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public TestEnumerableWithNoInterfaces.Enumerator GetEnumerator() => source.GetEnumerator();
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ Enumerator IValueEnumerable.GetEnumerator() => new(source.GetEnumerator());
+
+ IEnumerator IEnumerable.GetEnumerator() => new Enumerator(source.GetEnumerator());
+
+ IEnumerator IEnumerable.GetEnumerator() => new Enumerator(source.GetEnumerator());
+
+ public struct Enumerator: IEnumerator
+ {
+ readonly TestEnumerableWithNoInterfaces.Enumerator source;
+
+ public Enumerator(TestEnumerableWithNoInterfaces.Enumerator source) => this.source = source;
+
+ public int Current => source.Current;
+
+ object? IEnumerator.Current => source.Current;
+
+ public bool MoveNext() => source.MoveNext();
+
+ public void Reset() => throw new NotSupportedException();
+
+ public void Dispose() { }
+ }
+ }
+ }
+}
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/AsValueEnumerable.TestEnumerableWithNoInterfacesButEnumeratorWithResetAndDispose.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/AsValueEnumerable.TestEnumerableWithNoInterfacesButEnumeratorWithResetAndDispose.cs
new file mode 100644
index 000000000..adfa448fc
--- /dev/null
+++ b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/AsValueEnumerable.TestEnumerableWithNoInterfacesButEnumeratorWithResetAndDispose.cs
@@ -0,0 +1,50 @@
+#nullable enable
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Runtime.CompilerServices;
+
+namespace NetFabric.Hyperlinq
+{
+ static partial class GeneratedExtensionMethods
+ {
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static TestEnumerableWithNoInterfacesButEnumeratorWithResetAndDisposeAsValueEnumerable AsValueEnumerable(this TestEnumerableWithNoInterfacesButEnumeratorWithResetAndDispose source) => new(source);
+
+ public readonly struct TestEnumerableWithNoInterfacesButEnumeratorWithResetAndDisposeAsValueEnumerable: IValueEnumerable
+ {
+ readonly TestEnumerableWithNoInterfacesButEnumeratorWithResetAndDispose source;
+
+ public TestEnumerableWithNoInterfacesButEnumeratorWithResetAndDisposeAsValueEnumerable(TestEnumerableWithNoInterfacesButEnumeratorWithResetAndDispose source) => this.source = source;
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public TestEnumerableWithNoInterfacesButEnumeratorWithResetAndDispose.Enumerator GetEnumerator() => source.GetEnumerator();
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ Enumerator IValueEnumerable.GetEnumerator() => new(source.GetEnumerator());
+
+ IEnumerator IEnumerable.GetEnumerator() => new Enumerator(source.GetEnumerator());
+
+ IEnumerator IEnumerable.GetEnumerator() => new Enumerator(source.GetEnumerator());
+
+ public struct Enumerator: IEnumerator
+ {
+ readonly TestEnumerableWithNoInterfacesButEnumeratorWithResetAndDispose.Enumerator source;
+
+ public Enumerator(TestEnumerableWithNoInterfacesButEnumeratorWithResetAndDispose.Enumerator source) => this.source = source;
+
+ public int Current => source.Current;
+
+ object? IEnumerator.Current => source.Current;
+
+ public bool MoveNext() => source.MoveNext();
+
+ public void Reset() => source.Reset();
+
+ public void Dispose() => source.Dispose();
+ }
+ }
+ }
+}
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/AsValueEnumerable.TestEnumerableWithReferenceTypeEnumerator.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/AsValueEnumerable.TestEnumerableWithReferenceTypeEnumerator.cs
new file mode 100644
index 000000000..6b47b627b
--- /dev/null
+++ b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/AsValueEnumerable.TestEnumerableWithReferenceTypeEnumerator.cs
@@ -0,0 +1,30 @@
+#nullable enable
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Runtime.CompilerServices;
+
+namespace NetFabric.Hyperlinq
+{
+ static partial class GeneratedExtensionMethods
+ {
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static TestEnumerableWithReferenceTypeEnumeratorAsValueEnumerable AsValueEnumerable(this TestEnumerableWithReferenceTypeEnumerator source) => new(source);
+
+ public readonly struct TestEnumerableWithReferenceTypeEnumeratorAsValueEnumerable: IValueEnumerable>
+ {
+ readonly TestEnumerableWithReferenceTypeEnumerator source;
+
+ public TestEnumerableWithReferenceTypeEnumeratorAsValueEnumerable(TestEnumerableWithReferenceTypeEnumerator source) => this.source = source;
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public ValueEnumerator GetEnumerator() => new(source.GetEnumerator());
+
+ IEnumerator IEnumerable.GetEnumerator() => source.GetEnumerator();
+
+ IEnumerator IEnumerable.GetEnumerator() => source.GetEnumerator();
+ }
+ }
+}
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/AsValueEnumerable.TestEnumerableWithValueTypeEnumerator.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/AsValueEnumerable.TestEnumerableWithValueTypeEnumerator.cs
new file mode 100644
index 000000000..7ec4bd521
--- /dev/null
+++ b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/AsValueEnumerable.TestEnumerableWithValueTypeEnumerator.cs
@@ -0,0 +1,30 @@
+#nullable enable
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Runtime.CompilerServices;
+
+namespace NetFabric.Hyperlinq
+{
+ static partial class GeneratedExtensionMethods
+ {
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static TestEnumerableWithValueTypeEnumeratorAsValueEnumerable AsValueEnumerable(this TestEnumerableWithValueTypeEnumerator source) => new(source);
+
+ public readonly struct TestEnumerableWithValueTypeEnumeratorAsValueEnumerable: IValueEnumerable
+ {
+ readonly TestEnumerableWithValueTypeEnumerator source;
+
+ public TestEnumerableWithValueTypeEnumeratorAsValueEnumerable(TestEnumerableWithValueTypeEnumerator source) => this.source = source;
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public TestEnumerableWithValueTypeEnumerator.Enumerator GetEnumerator() => source.GetEnumerator();
+
+ IEnumerator IEnumerable.GetEnumerator() => source.GetEnumerator();
+
+ IEnumerator IEnumerable.GetEnumerator() => source.GetEnumerator();
+ }
+ }
+}
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/AsValueEnumerable.TestValueEnumerable.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/AsValueEnumerable.TestValueEnumerable.cs
new file mode 100644
index 000000000..8bb348391
--- /dev/null
+++ b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/AsValueEnumerable.TestValueEnumerable.cs
@@ -0,0 +1,16 @@
+#nullable enable
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Runtime.CompilerServices;
+
+namespace NetFabric.Hyperlinq
+{
+ static partial class GeneratedExtensionMethods
+ {
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static TestValueEnumerable AsValueEnumerable(this TestValueEnumerable source) => source;
+ }
+}
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Count.Array.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Count.Array.cs
new file mode 100644
index 000000000..0ee1fb9b0
--- /dev/null
+++ b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Count.Array.cs
@@ -0,0 +1,13 @@
+#nullable enable
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Runtime.CompilerServices;
+
+namespace NetFabric.Hyperlinq
+{
+ static partial class GeneratedExtensionMethods
+ {
+ }
+}
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Count.Span.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Count.Span.cs
new file mode 100644
index 000000000..1a3426670
--- /dev/null
+++ b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Count.Span.cs
@@ -0,0 +1,16 @@
+#nullable enable
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Runtime.CompilerServices;
+
+namespace NetFabric.Hyperlinq
+{
+ static partial class GeneratedExtensionMethods
+ {
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static int Count(this NetFabric.Hyperlinq.ArrayExtensions.SpanValueEnumerable source, Func predicate) => ArrayExtensions.Count(source.Span, predicate);
+ }
+}
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Dictionary.Select.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Dictionary.Select.cs
deleted file mode 100644
index 00caa8d8c..000000000
--- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Dictionary.Select.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-#nullable enable
-
-using System;
-using System.CodeDom.Compiler;
-using System.Diagnostics;
-using System.Runtime.CompilerServices;
-
-namespace NetFabric.Hyperlinq
-{
- public static partial class DictionaryBindings
- {
- public partial struct ValueWrapper
- {
- [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")]
- [DebuggerNonUserCode]
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public readonly NetFabric.Hyperlinq.ValueEnumerableExtensions.SelectEnumerable, System.Collections.Generic.Dictionary.Enumerator, System.Collections.Generic.KeyValuePair, TResult, NetFabric.Hyperlinq.FunctionWrapper, TResult>> Select(System.Func, TResult> selector)
- => NetFabric.Hyperlinq.ValueEnumerableExtensions.Select, System.Collections.Generic.Dictionary.Enumerator, System.Collections.Generic.KeyValuePair, TResult>(this, selector);
-
- [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")]
- [DebuggerNonUserCode]
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public readonly NetFabric.Hyperlinq.ValueEnumerableExtensions.SelectEnumerable, System.Collections.Generic.Dictionary.Enumerator, System.Collections.Generic.KeyValuePair, TResult, TSelector> Select(TSelector selector = default)
- where TSelector : struct, NetFabric.Hyperlinq.IFunction, TResult>
- => NetFabric.Hyperlinq.ValueEnumerableExtensions.Select, System.Collections.Generic.Dictionary.Enumerator, System.Collections.Generic.KeyValuePair, TResult, TSelector>(this, selector);
-
- }
-
- }
-}
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Dictionary.Where.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Dictionary.Where.cs
deleted file mode 100644
index 1e44137c6..000000000
--- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Dictionary.Where.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-#nullable enable
-
-using System;
-using System.CodeDom.Compiler;
-using System.Diagnostics;
-using System.Runtime.CompilerServices;
-
-namespace NetFabric.Hyperlinq
-{
- public static partial class DictionaryBindings
- {
- public partial struct ValueWrapper
- {
- [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")]
- [DebuggerNonUserCode]
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public readonly NetFabric.Hyperlinq.ValueEnumerableExtensions.WhereEnumerable, System.Collections.Generic.Dictionary.Enumerator, System.Collections.Generic.KeyValuePair, NetFabric.Hyperlinq.FunctionWrapper, bool>> Where(System.Func, bool> predicate)
- => NetFabric.Hyperlinq.ValueEnumerableExtensions.Where, System.Collections.Generic.Dictionary.Enumerator, System.Collections.Generic.KeyValuePair>(this, predicate);
-
- [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")]
- [DebuggerNonUserCode]
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public readonly NetFabric.Hyperlinq.ValueEnumerableExtensions.WhereEnumerable, System.Collections.Generic.Dictionary.Enumerator, System.Collections.Generic.KeyValuePair, TPredicate> Where(TPredicate predicate = default)
- where TPredicate : struct, NetFabric.Hyperlinq.IFunction, bool>
- => NetFabric.Hyperlinq.ValueEnumerableExtensions.Where, System.Collections.Generic.Dictionary.Enumerator, System.Collections.Generic.KeyValuePair, TPredicate>(this, predicate);
-
- }
-
- }
-}
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Distinct.ValueEnumerable.Where.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Distinct.ValueEnumerable.Where.cs
deleted file mode 100644
index 85119f091..000000000
--- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Distinct.ValueEnumerable.Where.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-#nullable enable
-
-using System;
-using System.CodeDom.Compiler;
-using System.Diagnostics;
-using System.Runtime.CompilerServices;
-
-namespace NetFabric.Hyperlinq
-{
- public static partial class ValueEnumerableExtensions
- {
- public partial struct DistinctEnumerable
- {
- [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")]
- [DebuggerNonUserCode]
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public readonly NetFabric.Hyperlinq.ValueEnumerableExtensions.WhereEnumerable, NetFabric.Hyperlinq.ValueEnumerableExtensions.DistinctEnumerable.DisposableEnumerator, TSource, NetFabric.Hyperlinq.FunctionWrapper> Where(System.Func predicate)
- => NetFabric.Hyperlinq.ValueEnumerableExtensions.Where, NetFabric.Hyperlinq.ValueEnumerableExtensions.DistinctEnumerable.DisposableEnumerator, TSource>(this, predicate);
-
- [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")]
- [DebuggerNonUserCode]
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public readonly NetFabric.Hyperlinq.ValueEnumerableExtensions.WhereEnumerable, NetFabric.Hyperlinq.ValueEnumerableExtensions.DistinctEnumerable.DisposableEnumerator, TSource, TPredicate> Where(TPredicate predicate = default)
- where TPredicate : struct, NetFabric.Hyperlinq.IFunction
- => NetFabric.Hyperlinq.ValueEnumerableExtensions.Where, NetFabric.Hyperlinq.ValueEnumerableExtensions.DistinctEnumerable.DisposableEnumerator, TSource, TPredicate>(this, predicate);
-
- [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")]
- [DebuggerNonUserCode]
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public readonly NetFabric.Hyperlinq.ValueEnumerableExtensions.DistinctEnumerable, NetFabric.Hyperlinq.ValueEnumerableExtensions.DistinctEnumerable.DisposableEnumerator, TSource> Distinct()
- => NetFabric.Hyperlinq.ValueEnumerableExtensions.Distinct, NetFabric.Hyperlinq.ValueEnumerableExtensions.DistinctEnumerable.DisposableEnumerator, TSource>(this);
-
- }
-
- }
-}
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Empty.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Empty.cs
new file mode 100644
index 000000000..0ee1fb9b0
--- /dev/null
+++ b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Empty.cs
@@ -0,0 +1,13 @@
+#nullable enable
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Runtime.CompilerServices;
+
+namespace NetFabric.Hyperlinq
+{
+ static partial class GeneratedExtensionMethods
+ {
+ }
+}
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Range.Count.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Range.Count.cs
deleted file mode 100644
index cad14e728..000000000
--- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Range.Count.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-#nullable enable
-
-using System;
-using System.CodeDom.Compiler;
-using System.Diagnostics;
-using System.Runtime.CompilerServices;
-
-namespace NetFabric.Hyperlinq
-{
- public static partial class ValueEnumerable
- {
-
- [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")]
- [DebuggerNonUserCode]
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public static int Count(this NetFabric.Hyperlinq.ValueEnumerable.RangeEnumerable source)
- => NetFabric.Hyperlinq.ValueEnumerableExtensions.Count(source);
-
- }
-}
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Range.Select.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Range.Select.cs
deleted file mode 100644
index 87cf749f7..000000000
--- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Range.Select.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-#nullable enable
-
-using System;
-using System.CodeDom.Compiler;
-using System.Diagnostics;
-using System.Runtime.CompilerServices;
-
-namespace NetFabric.Hyperlinq
-{
- public static partial class ValueEnumerable
- {
- public partial struct RangeEnumerable
- {
- [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")]
- [DebuggerNonUserCode]
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public readonly NetFabric.Hyperlinq.ValueEnumerableExtensions.SelectEnumerable> Select(System.Func selector)
- => NetFabric.Hyperlinq.ValueEnumerableExtensions.Select(this, selector);
-
- [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")]
- [DebuggerNonUserCode]
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public readonly NetFabric.Hyperlinq.ValueEnumerableExtensions.SelectEnumerable Select(TSelector selector = default)
- where TSelector : struct, NetFabric.Hyperlinq.IFunction
- => NetFabric.Hyperlinq.ValueEnumerableExtensions.Select(this, selector);
-
- }
-
- }
-}
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Range.Where.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Range.Where.cs
deleted file mode 100644
index 14219e17f..000000000
--- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Range.Where.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-#nullable enable
-
-using System;
-using System.CodeDom.Compiler;
-using System.Diagnostics;
-using System.Runtime.CompilerServices;
-
-namespace NetFabric.Hyperlinq
-{
- public static partial class ValueEnumerable
- {
- public partial struct RangeEnumerable
- {
- [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")]
- [DebuggerNonUserCode]
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public readonly NetFabric.Hyperlinq.ValueEnumerableExtensions.WhereEnumerable> Where(System.Func predicate)
- => NetFabric.Hyperlinq.ValueEnumerableExtensions.Where(this, predicate);
-
- [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")]
- [DebuggerNonUserCode]
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public readonly NetFabric.Hyperlinq.ValueEnumerableExtensions.WhereEnumerable Where(TPredicate predicate = default)
- where TPredicate : struct, NetFabric.Hyperlinq.IFunction
- => NetFabric.Hyperlinq.ValueEnumerableExtensions.Where(this, predicate);
-
- }
-
- }
-}
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Repeat.Count.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Repeat.Count.cs
deleted file mode 100644
index 41ac35b3f..000000000
--- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Repeat.Count.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-#nullable enable
-
-using System;
-using System.CodeDom.Compiler;
-using System.Diagnostics;
-using System.Runtime.CompilerServices;
-
-namespace NetFabric.Hyperlinq
-{
- public static partial class ValueEnumerable
- {
-
- [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")]
- [DebuggerNonUserCode]
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public static int Count(this NetFabric.Hyperlinq.ValueEnumerable.RepeatEnumerable source)
- => NetFabric.Hyperlinq.ValueEnumerableExtensions.Count, NetFabric.Hyperlinq.ValueEnumerable.RepeatEnumerable.DisposableEnumerator, TSource>(source);
-
- }
-}
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Select.ArraySegment.Any.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Select.ArraySegment.Any.cs
deleted file mode 100644
index f44a33abe..000000000
--- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Select.ArraySegment.Any.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-#nullable enable
-
-using System;
-using System.CodeDom.Compiler;
-using System.Diagnostics;
-using System.Runtime.CompilerServices;
-
-namespace NetFabric.Hyperlinq
-{
- public static partial class ArrayExtensions
- {
- public partial struct ArraySegmentSelectEnumerable
- {
- [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")]
- [DebuggerNonUserCode]
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public readonly bool Any(System.Func predicate)
- => NetFabric.Hyperlinq.ValueReadOnlyListExtensions.Any, TResult>(this, predicate);
-
- [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")]
- [DebuggerNonUserCode]
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public readonly bool Any(TPredicate predicate = default)
- where TPredicate : struct, NetFabric.Hyperlinq.IFunction
- => NetFabric.Hyperlinq.ValueReadOnlyListExtensions.Any, TResult, TPredicate>(this, predicate);
-
- }
-
- }
-}
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Select.ValueEnumerable.Any.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Select.ValueEnumerable.Any.cs
deleted file mode 100644
index 76ba1132a..000000000
--- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Select.ValueEnumerable.Any.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-#nullable enable
-
-using System;
-using System.CodeDom.Compiler;
-using System.Diagnostics;
-using System.Runtime.CompilerServices;
-
-namespace NetFabric.Hyperlinq
-{
- public static partial class ValueEnumerableExtensions
- {
- public partial struct SelectEnumerable
- {
- [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")]
- [DebuggerNonUserCode]
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public readonly bool Any()
- => NetFabric.Hyperlinq.ValueEnumerableExtensions.Any, NetFabric.Hyperlinq.ValueEnumerableExtensions.SelectEnumerable.DisposableEnumerator, TResult>(this);
-
- [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")]
- [DebuggerNonUserCode]
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public readonly bool Any(System.Func predicate)
- => NetFabric.Hyperlinq.ValueEnumerableExtensions.Any, NetFabric.Hyperlinq.ValueEnumerableExtensions.SelectEnumerable.DisposableEnumerator, TResult>(this, predicate);
-
- [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")]
- [DebuggerNonUserCode]
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public readonly bool Any(TPredicate predicate = default)
- where TPredicate : struct, NetFabric.Hyperlinq.IFunction
- => NetFabric.Hyperlinq.ValueEnumerableExtensions.Any, NetFabric.Hyperlinq.ValueEnumerableExtensions.SelectEnumerable.DisposableEnumerator, TResult, TPredicate>(this, predicate);
-
- }
-
- }
-}
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Select.ValueEnumerable.First.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Select.ValueEnumerable.First.cs
deleted file mode 100644
index 77c913be7..000000000
--- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Select.ValueEnumerable.First.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-#nullable enable
-
-using System;
-using System.CodeDom.Compiler;
-using System.Diagnostics;
-using System.Runtime.CompilerServices;
-
-namespace NetFabric.Hyperlinq
-{
- public static partial class ValueEnumerableExtensions
- {
- public partial struct SelectEnumerable
- {
- [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")]
- [DebuggerNonUserCode]
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public readonly NetFabric.Hyperlinq.Option First()
- => NetFabric.Hyperlinq.ValueEnumerableExtensions.First, NetFabric.Hyperlinq.ValueEnumerableExtensions.SelectEnumerable.DisposableEnumerator, TResult>(this);
-
- }
-
- }
-}
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Select.ValueEnumerable.Where.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Select.ValueEnumerable.Where.cs
deleted file mode 100644
index 6c9ed4726..000000000
--- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Select.ValueEnumerable.Where.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-#nullable enable
-
-using System;
-using System.CodeDom.Compiler;
-using System.Diagnostics;
-using System.Runtime.CompilerServices;
-
-namespace NetFabric.Hyperlinq
-{
- public static partial class ValueEnumerableExtensions
- {
- public partial struct SelectEnumerable
- {
- [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")]
- [DebuggerNonUserCode]
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public readonly NetFabric.Hyperlinq.ValueEnumerableExtensions.WhereEnumerable, NetFabric.Hyperlinq.ValueEnumerableExtensions.SelectEnumerable.DisposableEnumerator, TResult, NetFabric.Hyperlinq.FunctionWrapper> Where(System.Func predicate)
- => NetFabric.Hyperlinq.ValueEnumerableExtensions.Where, NetFabric.Hyperlinq.ValueEnumerableExtensions.SelectEnumerable.DisposableEnumerator, TResult>(this, predicate);
-
- [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")]
- [DebuggerNonUserCode]
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public readonly NetFabric.Hyperlinq.ValueEnumerableExtensions.WhereEnumerable, NetFabric.Hyperlinq.ValueEnumerableExtensions.SelectEnumerable.DisposableEnumerator, TResult, TPredicate> Where(TPredicate predicate = default)
- where TPredicate : struct, NetFabric.Hyperlinq.IFunction
- => NetFabric.Hyperlinq.ValueEnumerableExtensions.Where, NetFabric.Hyperlinq.ValueEnumerableExtensions.SelectEnumerable.DisposableEnumerator, TResult, TPredicate>(this, predicate);
-
- }
-
- }
-}
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Where.ArraySegment.Count.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Where.ArraySegment.Count.cs
deleted file mode 100644
index 444845022..000000000
--- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Where.ArraySegment.Count.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-#nullable enable
-
-using System;
-using System.CodeDom.Compiler;
-using System.Diagnostics;
-using System.Runtime.CompilerServices;
-
-namespace NetFabric.Hyperlinq
-{
- public static partial class ArrayExtensions
- {
- public partial struct ArraySegmentWhereEnumerable
- {
- [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")]
- [DebuggerNonUserCode]
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public readonly int Count()
- => NetFabric.Hyperlinq.ValueEnumerableExtensions.Count, NetFabric.Hyperlinq.ArrayExtensions.ArraySegmentWhereEnumerable.DisposableEnumerator, TSource>(this);
-
- }
-
- }
-}
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Where.ValueEnumerable.Count.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Where.ValueEnumerable.Count.cs
deleted file mode 100644
index a68c8d6da..000000000
--- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Where.ValueEnumerable.Count.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-#nullable enable
-
-using System;
-using System.CodeDom.Compiler;
-using System.Diagnostics;
-using System.Runtime.CompilerServices;
-
-namespace NetFabric.Hyperlinq
-{
- public static partial class ValueEnumerableExtensions
- {
- public partial struct WhereEnumerable
- {
- [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")]
- [DebuggerNonUserCode]
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public readonly int Count()
- => NetFabric.Hyperlinq.ValueEnumerableExtensions.Count, NetFabric.Hyperlinq.ValueEnumerableExtensions.WhereEnumerable.DisposableEnumerator, TSource>(this);
-
- }
-
- }
-}
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Where.ValueEnumerable.Distinct.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Where.ValueEnumerable.Distinct.cs
deleted file mode 100644
index 6f5f15c16..000000000
--- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Where.ValueEnumerable.Distinct.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-#nullable enable
-
-using System;
-using System.CodeDom.Compiler;
-using System.Diagnostics;
-using System.Runtime.CompilerServices;
-
-namespace NetFabric.Hyperlinq
-{
- public static partial class ValueEnumerableExtensions
- {
- public partial struct WhereEnumerable
- {
- [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")]
- [DebuggerNonUserCode]
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public readonly NetFabric.Hyperlinq.ValueEnumerableExtensions.DistinctEnumerable, NetFabric.Hyperlinq.ValueEnumerableExtensions.WhereEnumerable.DisposableEnumerator, TSource> Distinct()
- => NetFabric.Hyperlinq.ValueEnumerableExtensions.Distinct, NetFabric.Hyperlinq.ValueEnumerableExtensions.WhereEnumerable.DisposableEnumerator, TSource>(this);
-
- }
-
- }
-}
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Where.ValueEnumerable.First.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Where.ValueEnumerable.First.cs
deleted file mode 100644
index 8b13b25f7..000000000
--- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Where.ValueEnumerable.First.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-#nullable enable
-
-using System;
-using System.CodeDom.Compiler;
-using System.Diagnostics;
-using System.Runtime.CompilerServices;
-
-namespace NetFabric.Hyperlinq
-{
- public static partial class ValueEnumerableExtensions
- {
- public partial struct WhereEnumerable
- {
- [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")]
- [DebuggerNonUserCode]
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public readonly NetFabric.Hyperlinq.Option First()
- => NetFabric.Hyperlinq.ValueEnumerableExtensions.First, NetFabric.Hyperlinq.ValueEnumerableExtensions.WhereEnumerable.DisposableEnumerator, TSource>(this);
-
- }
-
- }
-}
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Where.ValueEnumerable.Select.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Where.ValueEnumerable.Select.cs
deleted file mode 100644
index c9b3e7b9b..000000000
--- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Where.ValueEnumerable.Select.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-#nullable enable
-
-using System;
-using System.CodeDom.Compiler;
-using System.Diagnostics;
-using System.Runtime.CompilerServices;
-
-namespace NetFabric.Hyperlinq
-{
- public static partial class ValueEnumerableExtensions
- {
- public partial struct WhereEnumerable
- {
- [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")]
- [DebuggerNonUserCode]
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public readonly NetFabric.Hyperlinq.ValueEnumerableExtensions.SelectEnumerable, NetFabric.Hyperlinq.ValueEnumerableExtensions.WhereEnumerable.DisposableEnumerator, TSource, TResult, NetFabric.Hyperlinq.FunctionWrapper> Select(System.Func selector)
- => NetFabric.Hyperlinq.ValueEnumerableExtensions.Select, NetFabric.Hyperlinq.ValueEnumerableExtensions.WhereEnumerable.DisposableEnumerator, TSource, TResult>(this, selector);
-
- [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")]
- [DebuggerNonUserCode]
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public readonly NetFabric.Hyperlinq.ValueEnumerableExtensions.SelectEnumerable, NetFabric.Hyperlinq.ValueEnumerableExtensions.WhereEnumerable.DisposableEnumerator, TSource, TResult, TSelector> Select(TSelector selector = default)
- where TSelector : struct, NetFabric.Hyperlinq.IFunction
- => NetFabric.Hyperlinq.ValueEnumerableExtensions.Select, NetFabric.Hyperlinq.ValueEnumerableExtensions.WhereEnumerable.DisposableEnumerator, TSource, TResult, TSelector>(this, selector);
-
- }
-
- }
-}
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Any.ArraySegment.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Any.ArraySegment.cs
deleted file mode 100644
index fb6d8bcbb..000000000
--- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Any.ArraySegment.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-using System;
-using System.Runtime.CompilerServices;
-
-namespace NetFabric.Hyperlinq
-{
- public static partial class ArrayExtensions
- {
-
- public static bool Any(this in ArraySegment source)
- => source.Count != 0;
-
- public static bool Any(this in ArraySegment source, Func predicate)
- => source.Any(new FunctionWrapper(predicate));
-
- public static bool Any(this in ArraySegment source, TPredicate predicate = default)
- where TPredicate : struct, IFunction
- => default;
- }
-}
-
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Any.ValueEnumerable.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Any.ValueEnumerable.cs
deleted file mode 100644
index 2c79e1b31..000000000
--- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Any.ValueEnumerable.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Runtime.CompilerServices;
-
-namespace NetFabric.Hyperlinq
-{
- public static partial class ValueEnumerableExtensions
- {
-
- public static bool Any(this TEnumerable source)
- where TEnumerable : IValueEnumerable
- where TEnumerator : struct, IEnumerator
- => default;
-
- public static bool Any(this TEnumerable source, Func predicate)
- where TEnumerable : IValueEnumerable
- where TEnumerator : struct, IEnumerator
- => source.Any>(new FunctionWrapper(predicate));
-
- public static bool Any(this TEnumerable source, TPredicate predicate = default)
- where TEnumerable : IValueEnumerable
- where TEnumerator : struct, IEnumerator
- where TPredicate : struct, IFunction
- => default;
- }
-}
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Any.ValueReadOnlyCollection.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Any.ValueReadOnlyCollection.cs
deleted file mode 100644
index 49d4c1145..000000000
--- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Any.ValueReadOnlyCollection.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Runtime.CompilerServices;
-
-namespace NetFabric.Hyperlinq
-{
- public static partial class ValueReadOnlyCollectionExtensions
- {
-
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public static bool Any(this TEnumerable source)
- where TEnumerable : IValueReadOnlyCollection
- where TEnumerator : struct, IEnumerator
- => source.Count is not 0;
-
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public static bool Any(this TEnumerable source, Func predicate)
- where TEnumerable : IValueReadOnlyCollection
- where TEnumerator : struct, IEnumerator
- => Any>(source, new FunctionWrapper(predicate));
-
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public static bool Any(this TEnumerable source, TPredicate predicate = default)
- where TEnumerable : IValueReadOnlyCollection
- where TEnumerator : struct, IEnumerator
- where TPredicate : struct, IFunction
- => source.Count is not 0 && ValueEnumerableExtensions.Any(source, predicate);
- }
-}
-
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Any.ValueReadOnlyList.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Any.ValueReadOnlyList.cs
deleted file mode 100644
index 085c79a11..000000000
--- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Any.ValueReadOnlyList.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Runtime.CompilerServices;
-
-namespace NetFabric.Hyperlinq
-{
- public static partial class ValueReadOnlyListExtensions
- {
-
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public static bool Any(this TList source)
- where TList : struct, IReadOnlyList
- => source.Count is not 0;
-
-
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public static bool Any(this TList source, Func predicate)
- where TList : struct, IReadOnlyList
- => source.Any>(new FunctionWrapper(predicate));
-
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public static bool Any(this TList source, TPredicate predicate = default)
- where TList : struct, IReadOnlyList
- where TPredicate : struct, IFunction
- => default;
- }
-}
-
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/AsValueEnumerable.Empty.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/AsValueEnumerable.Empty.cs
new file mode 100644
index 000000000..c54814467
--- /dev/null
+++ b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/AsValueEnumerable.Empty.cs
@@ -0,0 +1,25 @@
+using System;
+//using NetFabric.Hyperlinq; => DO NOT UNCOMMENT
+
+partial class TestsSource
+{
+ static void AsValueEnumerable_Empty()
+ {
+ // test calling AsValueEnumerable() for types that don't need source generation
+ // with NetFabric.Hyperlinq namespace NOT in a using clause
+
+ var array = Array.Empty();
+
+#if !NOT_TESTING
+ _ = array.AsValueEnumerable();
+ _ = new ArraySegment(array).AsValueEnumerable();
+
+ _ = array.AsMemory().AsValueEnumerable();
+ _ = ((ReadOnlyMemory)array.AsMemory()).AsValueEnumerable();
+
+ _ = array.AsSpan().AsValueEnumerable();
+ _ = ((ReadOnlySpan)array.AsSpan()).AsValueEnumerable();
+#endif
+ }
+}
+
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/AsValueEnumerable.Empty2.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/AsValueEnumerable.Empty2.cs
new file mode 100644
index 000000000..94456fc7c
--- /dev/null
+++ b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/AsValueEnumerable.Empty2.cs
@@ -0,0 +1,22 @@
+using System;
+using NetFabric.Hyperlinq; // namespace is known at compile time
+
+partial class TestsSource
+{
+ static void AsValueEnumerable_Empty2()
+ {
+ // test calling AsValueEnumerable() for types that don't need source generation
+
+ var array = Array.Empty();
+
+ _ = array.AsValueEnumerable();
+ _ = new ArraySegment(array).AsValueEnumerable();
+
+ _ = array.AsMemory().AsValueEnumerable();
+ _ = ((ReadOnlyMemory)array.AsMemory()).AsValueEnumerable();
+
+ _ = array.AsSpan().AsValueEnumerable();
+ _ = ((ReadOnlySpan)array.AsSpan()).AsValueEnumerable();
+ }
+}
+
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/AsValueEnumerable.Repeat.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/AsValueEnumerable.Repeat.cs
new file mode 100644
index 000000000..834978c04
--- /dev/null
+++ b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/AsValueEnumerable.Repeat.cs
@@ -0,0 +1,13 @@
+using System;
+using NetFabric.Hyperlinq;
+
+partial class TestsSource
+{
+ static void AsValueEnumerable_Repeat()
+ {
+ // test calling AsValueEnumerable() for types that implement IValueEnumerable<,>
+
+ _ = ValueEnumerable.Repeat(0, 100).AsValueEnumerable();
+ }
+}
+
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/AsValueEnumerable.TestEnumerableWithInterfacelessPublicEnumerator.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/AsValueEnumerable.TestEnumerableWithInterfacelessPublicEnumerator.cs
new file mode 100644
index 000000000..c7c235809
--- /dev/null
+++ b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/AsValueEnumerable.TestEnumerableWithInterfacelessPublicEnumerator.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using NetFabric.Hyperlinq;
+
+partial class TestsSource
+{
+ static void AsValueEnumerable_TestEnumerableWithInterfacelessPublicEnumerator()
+ {
+ // test calling AsValueEnumerable() for types that implement IEnumerable<>
+ // but the public GetEnumerator() returns a type that doesn't implement IEnumerator<>
+
+ _ = new TestEnumerableWithInterfacelessPublicEnumerator().AsValueEnumerable();
+ }
+}
+
+
+
+
+
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/AsValueEnumerable.TestEnumerableWithNoInterfaces.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/AsValueEnumerable.TestEnumerableWithNoInterfaces.cs
new file mode 100644
index 000000000..df8663209
--- /dev/null
+++ b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/AsValueEnumerable.TestEnumerableWithNoInterfaces.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using NetFabric.Hyperlinq;
+
+partial class TestsSource
+{
+ static void AsValueEnumerable_TestEnumerableWithNoInterfaces()
+ {
+ // test calling AsValueEnumerable() for types that do not implement IEnumerable<>
+ // but the public GetEnumerator() returns a type that doesn't implement IEnumerator<>
+
+ _ = new TestEnumerableWithNoInterfaces().AsValueEnumerable();
+ }
+}
+
+
+
+
+
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/AsValueEnumerable.TestEnumerableWithNoInterfacesButEnumeratorWithResetAndDispose.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/AsValueEnumerable.TestEnumerableWithNoInterfacesButEnumeratorWithResetAndDispose.cs
new file mode 100644
index 000000000..5a1c57c15
--- /dev/null
+++ b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/AsValueEnumerable.TestEnumerableWithNoInterfacesButEnumeratorWithResetAndDispose.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using NetFabric.Hyperlinq;
+
+partial class TestsSource
+{
+ static void AsValueEnumerable_TestEnumerableWithNoInterfacesButEnumeratorWithResetAndDispose()
+ {
+ // test calling AsValueEnumerable() for types that do not implement IEnumerable<>
+ // and the public GetEnumerator() returns a type that implement IDisposable and has a Reset() method
+
+ _ = new TestEnumerableWithNoInterfacesButEnumeratorWithResetAndDispose().AsValueEnumerable();
+ }
+}
+
+
+
+
+
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/AsValueEnumerable.TestEnumerableWithReferenceTypeEnumerator.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/AsValueEnumerable.TestEnumerableWithReferenceTypeEnumerator.cs
new file mode 100644
index 000000000..82c1acb1a
--- /dev/null
+++ b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/AsValueEnumerable.TestEnumerableWithReferenceTypeEnumerator.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using NetFabric.Hyperlinq;
+
+partial class TestsSource
+{
+ static void AsValueEnumerable_TestEnumerableWithReferenceTypeEnumerator()
+ {
+ // test calling AsValueEnumerable() for types that implement IEnumerable<> and the enumerator is not a value type
+
+ _ = new TestEnumerableWithReferenceTypeEnumerator().AsValueEnumerable();
+ }
+}
+
+
+
+
+
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/AsValueEnumerable.TestEnumerableWithValueTypeEnumerator.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/AsValueEnumerable.TestEnumerableWithValueTypeEnumerator.cs
new file mode 100644
index 000000000..1b2fc1276
--- /dev/null
+++ b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/AsValueEnumerable.TestEnumerableWithValueTypeEnumerator.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using NetFabric.Hyperlinq;
+
+partial class TestsSource
+{
+ static void AsValueEnumerable_EnumerableWithValueTypeEnumerator()
+ {
+ // test calling AsValueEnumerable() for types that implement IEnumerable<> and the enumerator is a value type
+
+ _ = new TestEnumerableWithValueTypeEnumerator().AsValueEnumerable();
+ }
+}
+
+
+
+
+
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/AsValueEnumerable.TestValueEnumerable.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/AsValueEnumerable.TestValueEnumerable.cs
new file mode 100644
index 000000000..169600967
--- /dev/null
+++ b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/AsValueEnumerable.TestValueEnumerable.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using NetFabric.Hyperlinq;
+
+partial class TestsSource
+{
+ static void AsValueEnumerable_ValueEnumerable()
+ {
+ // test calling AsValueEnumerable() on an IValueEnumerable
+ _ = new TestValueEnumerable().AsValueEnumerable();
+ }
+}
+
+
+
+
+
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/Enumerables.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/Enumerables.cs
new file mode 100644
index 000000000..8e0fe06ca
--- /dev/null
+++ b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/Enumerables.cs
@@ -0,0 +1,132 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+
+class TestEnumerableWithNoInterfaces
+{
+ public Enumerator GetEnumerator()
+ => new();
+
+ public readonly struct Enumerator
+ {
+ public int Current
+ => default;
+
+ public bool MoveNext()
+ => false;
+ }
+}
+
+class TestEnumerableWithNoInterfacesButEnumeratorWithResetAndDispose
+{
+ public Enumerator GetEnumerator()
+ => new();
+
+ public readonly struct Enumerator
+ : IDisposable
+ {
+ public int Current
+ => default;
+
+ public bool MoveNext()
+ => false;
+
+ public void Reset()
+ { }
+
+ public void Dispose()
+ { }
+ }
+}
+
+class TestEnumerableWithInterfacelessPublicEnumerator
+ : IEnumerable
+{
+ public Enumerator GetEnumerator()
+ => new();
+ IEnumerator IEnumerable.GetEnumerator()
+ => new DisposableEnumerator();
+ IEnumerator IEnumerable.GetEnumerator()
+ => new DisposableEnumerator();
+
+ public readonly ref struct Enumerator
+ {
+ public int Current
+ => default;
+
+ public bool MoveNext()
+ => false;
+ }
+
+ class DisposableEnumerator
+ : IEnumerator
+ {
+ public int Current
+ => default;
+ object? IEnumerator.Current
+ => default;
+
+ public bool MoveNext()
+ => false;
+
+ public void Reset()
+ { }
+ public void Dispose()
+ { }
+ }
+}
+
+public class TestEnumerableWithValueTypeEnumerator
+ : IEnumerable
+{
+ public Enumerator GetEnumerator()
+ => new();
+ IEnumerator IEnumerable.GetEnumerator()
+ => new Enumerator();
+ IEnumerator IEnumerable.GetEnumerator()
+ => new Enumerator();
+
+ public readonly struct Enumerator
+ : IEnumerator
+ {
+ public int Current
+ => default;
+ object? IEnumerator.Current
+ => default;
+
+ public bool MoveNext()
+ => false;
+
+ public void Reset()
+ { }
+ public void Dispose()
+ { }
+ }
+}
+
+
+class TestEnumerableWithReferenceTypeEnumerator
+ : IEnumerable
+{
+ public IEnumerator GetEnumerator()
+ => new Enumerator();
+ IEnumerator IEnumerable.GetEnumerator()
+ => new Enumerator();
+
+ class Enumerator
+ : IEnumerator
+ {
+ public int Current
+ => default;
+ object? IEnumerator.Current
+ => default;
+
+ public bool MoveNext()
+ => false;
+
+ public void Reset()
+ { }
+ public void Dispose()
+ { }
+ }
+}
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/IFunction.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/IFunction.cs
deleted file mode 100644
index 719dbb63a..000000000
--- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/IFunction.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-namespace NetFabric.Hyperlinq
-{
- public interface IFunction
- {
- TResult Invoke(T arg);
- }
-}
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/IFunctionWrapper.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/IFunctionWrapper.cs
deleted file mode 100644
index ce38a1db7..000000000
--- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/IFunctionWrapper.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-using System;
-
-namespace NetFabric.Hyperlinq
-{
- public readonly struct FunctionWrapper
- : IFunction
- {
- readonly Func function;
-
- public FunctionWrapper(Func function)
- => this.function = function;
-
- public TResult Invoke(T arg)
- => function(arg);
- }
-}
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/IValueEnumerable.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/IValueEnumerable.cs
deleted file mode 100644
index d4efc695c..000000000
--- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/IValueEnumerable.cs
+++ /dev/null
@@ -1,31 +0,0 @@
-using System.Collections.Generic;
-
-namespace NetFabric.Hyperlinq
-{
- public interface IValueEnumerable
- : IEnumerable
- where TEnumerator
- : struct
- , IEnumerator
- {
- new TEnumerator GetEnumerator();
- }
-
- public interface IValueReadOnlyCollection
- : IReadOnlyCollection
- , IValueEnumerable
- where TEnumerator
- : struct
- , IEnumerator
- {
- }
-
- public interface IValueReadOnlyList
- : IReadOnlyList
- , IValueReadOnlyCollection
- where TEnumerator
- : struct
- , IEnumerator
- {
- }
-}
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/Option.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/Option.cs
deleted file mode 100644
index 4c68b37b2..000000000
--- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/Option.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-using System.Runtime.InteropServices;
-
-namespace NetFabric.Hyperlinq
-{
- public readonly struct Option
- {
- }
-}
\ No newline at end of file
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/PredicateCombination.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/PredicateCombination.cs
deleted file mode 100644
index 27b56347f..000000000
--- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/PredicateCombination.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-namespace NetFabric.Hyperlinq
-{
- public struct PredicateCombination
- : IFunction
- where TPredicate1 : struct, IFunction
- where TPredicate2 : struct, IFunction
- {
- TPredicate1 first;
- TPredicate2 second;
-
- public PredicateCombination(TPredicate1 first, TPredicate2 second)
- => (this.first, this.second) = (first, second);
-
- public bool Invoke(TSource item)
- => first.Invoke(item) && second.Invoke(item);
- }
-}
diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/SelectorCombination.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/SelectorCombination.cs
deleted file mode 100644
index f7dfe9134..000000000
--- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/SelectorCombination.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-namespace NetFabric.Hyperlinq
-{
- public readonly struct SelectorCombination
- : IFunction
- where TSelector1 : struct, IFunction