diff --git a/src/Zomp.SyncMethodGenerator/AsyncToSyncRewriter.cs b/src/Zomp.SyncMethodGenerator/AsyncToSyncRewriter.cs index b18c436..68c4892 100644 --- a/src/Zomp.SyncMethodGenerator/AsyncToSyncRewriter.cs +++ b/src/Zomp.SyncMethodGenerator/AsyncToSyncRewriter.cs @@ -1875,16 +1875,17 @@ private InvocationExpressionSyntax UnwrapExtension(InvocationExpressionSyntax ie var newName = reducedFrom.Name; newName = changeMemoryToSpan ? GetNewName(reducedFrom) : RemoveAsync(newName); - var newNameExistsInContainingType = semanticModel.Compilation.References + var membersWithNewNameInContainingType = semanticModel.Compilation.References .Select(semanticModel.Compilation.GetAssemblyOrModuleSymbol) .Append(semanticModel.Compilation.Assembly) .OfType() .Select(assemblySymbol => assemblySymbol.GetTypeByMetadataName(reducedFrom.ContainingType.ToString())) .OfType() - .SelectMany(symbol => symbol.GetMembers(newName)) - .Any(); + .SelectMany(symbol => symbol.GetMembers(newName)); - var fullyQualifiedName = newNameExistsInContainingType + // When the method is an AsyncEnumerable extension it must be converted to the corresponding Enumerable extension + // regardless of the containing type featuring members with compatible names + var fullyQualifiedName = !reducedFrom.ContainingType.Name.Equals("AsyncEnumerable", StringComparison.Ordinal) && membersWithNewNameInContainingType.Any() ? $"{reducedFrom.ContainingType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}.{newName}" : $"{MakeType(reducedFrom.ContainingType)}.{newName}"; diff --git a/tests/Generator.Tests/Snapshots/SystemAsyncExtensionsTests.LinqConversion#g.verified.cs b/tests/Generator.Tests/Snapshots/SystemAsyncExtensionsTests.LinqConversion#g.verified.cs new file mode 100644 index 0000000..979858c --- /dev/null +++ b/tests/Generator.Tests/Snapshots/SystemAsyncExtensionsTests.LinqConversion#g.verified.cs @@ -0,0 +1,5 @@ +//HintName: Test.Class.MethodAsync.g.cs +public void Method(global::System.Collections.Generic.IEnumerable foo) +{ + var elements = global::System.Linq.Enumerable.ToList(global::System.Linq.Enumerable.Where(global::System.Linq.Enumerable.Select(foo, i => i + 5), i => i > 0)); +} diff --git a/tests/Generator.Tests/SystemAsyncExtensionsTests.cs b/tests/Generator.Tests/SystemAsyncExtensionsTests.cs index 4a319e4..14a00fa 100644 --- a/tests/Generator.Tests/SystemAsyncExtensionsTests.cs +++ b/tests/Generator.Tests/SystemAsyncExtensionsTests.cs @@ -202,4 +202,15 @@ internal static async Task MethodAsync(IAsyncEnumerable enumerable, Cancell } } """.Verify(sourceType: SourceType.Full); + +#if NET + [Fact] + public Task LinqConversion() => """ +[Zomp.SyncMethodGenerator.CreateSyncVersion] +public async Task MethodAsync(IAsyncEnumerable foo) +{ + var elements = await foo.Select(i => i + 5).Where(i => i > 0).ToListAsync(); +} +""".Verify(); +#endif }