Skip to content

Commit 708eec7

Browse files
Merge pull request #1226 from GrahamTheCoder/fix-linq-extension-methods-expansion-17340425955327495994
Fix LINQ extension methods conversion to C#
2 parents fadac1b + e4f246b commit 708eec7

File tree

2 files changed

+63
-3
lines changed

2 files changed

+63
-3
lines changed

CodeConverter/CSharp/VbNameExpander.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public SyntaxNode ExpandNode(SyntaxNode node, SemanticModel semanticModel,
6565
semanticModel.GetOperation(node) is IMemberReferenceOperation { Instance: { Syntax: ExpressionSyntax promotedInstance }, Member: {} member }) {
6666
return MemberAccess(promotedInstance, SyntaxFactory.IdentifierName(member.Name));
6767
}
68-
return IsOriginalSymbolGenericMethod(semanticModel, node) ? node : Simplifier.Expand(node, semanticModel, workspace);
68+
return IsOriginalSymbolGenericOrExtensionMethod(semanticModel, node) ? node : Simplifier.Expand(node, semanticModel, workspace);
6969
}
7070

7171
private static bool IsReducedExtensionInExtendedTypeOrDerivedType(SyntaxNode node, ISymbol symbol, SemanticModel semanticModel)
@@ -136,8 +136,15 @@ public static bool IsRoslynInstanceExpressionBug(MemberAccessExpressionSyntax no
136136
/// Roslyn bug - accidentally expands anonymous types to just "Global."
137137
/// Since the C# reducer also doesn't seem to reduce generic extension methods, it's best to avoid those too, so let's just avoid all generic methods
138138
/// </summary>
139-
private static bool IsOriginalSymbolGenericMethod(SemanticModel semanticModel, SyntaxNode node) =>
140-
semanticModel.GetSymbolInfo(node).Symbol.IsGenericMethod();
139+
private static bool IsOriginalSymbolGenericOrExtensionMethod(SemanticModel semanticModel, SyntaxNode node)
140+
{
141+
var symbolInfo = semanticModel.GetSymbolInfo(node);
142+
var symbol = symbolInfo.Symbol ?? symbolInfo.CandidateSymbols.FirstOrDefault();
143+
if (symbol?.IsGenericMethod() == true) return true;
144+
if (symbol is IMethodSymbol ms && (ms.MethodKind == MethodKind.ReducedExtension || ms.IsExtensionMethod)) return true;
145+
return false;
146+
}
147+
141148

142149
private static bool IsQualifiableInstanceReference(ISymbol symbol) =>
143150
symbol?.IsStatic == false && (symbol.IsKind(SymbolKind.Method) || symbol.IsKind(SymbolKind.Field) ||
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
using System.Threading.Tasks;
2+
using Xunit;
3+
using ICSharpCode.CodeConverter.Tests.TestRunners;
4+
5+
namespace ICSharpCode.CodeConverter.Tests.CSharp.ExpressionTests;
6+
7+
public class LinqExtensionMethodReproTests : ConverterTestBase
8+
{
9+
[Fact]
10+
public async Task TestLinqExtensionMethods()
11+
{
12+
await TestConversionVisualBasicToCSharpAsync(@"Imports System.Linq
13+
14+
Public Class TestClass
15+
Public Shared Sub Test()
16+
Dim intCol = New Integer() {1, 2, 3}
17+
Dim intCol2 = New Integer() {1, 2, 3}
18+
19+
Dim intColQuery = intCol.Select(Function(x) x)
20+
Dim intColCopy = intCol.Select(Function(x) x).ToArray()
21+
Dim intSum = intCol.Select(Function(x) x).Sum(Function(x) x)
22+
Dim intMax = intCol.Select(Function(x) x).Max(Function(x) x)
23+
Dim intCnt = intCol.Select(Function(x) x).Count(Function(x) x > 1)
24+
25+
Dim intSum2 = intCol.Select(Function(x) x).Sum()
26+
Dim intMax2 = intCol.OrderBy(Function(x) x).Max()
27+
Dim intCnt2 = intCol.Select(Function(x) x).Count()
28+
Dim intSum3 = intCol.Zip(intCol2, Function(x, y) x + y).Sum()
29+
End Sub
30+
End Class", @"using System;
31+
using System.Linq;
32+
33+
public partial class TestClass
34+
{
35+
public static void Test()
36+
{
37+
int[] intCol = new int[] { 1, 2, 3 };
38+
int[] intCol2 = new int[] { 1, 2, 3 };
39+
40+
var intColQuery = intCol.Select(x => x);
41+
int[] intColCopy = intCol.Select(x => x).ToArray();
42+
int intSum = intCol.Select(x => x).Sum(x => x);
43+
int intMax = intCol.Select(x => x).Max(x => x);
44+
int intCnt = intCol.Select(x => x).Count(x => x > 1);
45+
46+
int intSum2 = intCol.Select(x => x).Sum();
47+
int intMax2 = intCol.OrderBy(x => x).Max();
48+
int intCnt2 = intCol.Select(x => x).Count();
49+
int intSum3 = intCol.Zip(intCol2, (x, y) => x + y).Sum();
50+
}
51+
}");
52+
}
53+
}

0 commit comments

Comments
 (0)