File: Microsoft.CodeQuality.Analyzers\QualityGuidelines\AvoidMultipleEnumerationsTests.cs
Web Access
Project: ..\..\..\src\Microsoft.CodeAnalysis.NetAnalyzers\tests\Microsoft.CodeAnalysis.NetAnalyzers.UnitTests\Microsoft.CodeAnalysis.NetAnalyzers.UnitTests.csproj (Microsoft.CodeAnalysis.NetAnalyzers.UnitTests)
// Copyright (c) Microsoft.  All Rights Reserved.  Licensed under the MIT license.  See License.txt in the project root for license information.
 
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.Testing;
using Xunit;
using VerifyCS = Test.Utilities.CSharpCodeFixVerifier<
    Microsoft.CodeAnalysis.CSharp.NetAnalyzers.Microsoft.CodeQuality.Analyzers.QualityGuidelines.CSharpAvoidMultipleEnumerationsAnalyzer,
    Microsoft.CodeAnalysis.Testing.EmptyCodeFixProvider>;
using VerifyVB = Test.Utilities.VisualBasicCodeFixVerifier<
    Microsoft.CodeQuality.VisualBasic.Analyzers.QualityGuidelines.BasicAvoidMultipleEnumerationsAnalyzer,
    Microsoft.CodeAnalysis.Testing.EmptyCodeFixProvider>;
 
namespace Microsoft.CodeAnalysis.NetAnalyzers.UnitTests.Microsoft.CodeQuality.Analyzers.QualityGuidelines
{
    public class AvoidMultipleEnumerationsTests
    {
        private static Task VerifyCSharpAsync(
            string code,
            string customizedEnumerationMethods = null,
            string customizedLinqChainMethods = null,
            bool? assumeMethodEnumeratesParameters = null)
        {
            var enumerationMethods = customizedEnumerationMethods == null
                ? string.Empty
                : $"dotnet_code_quality.CA1851.enumeration_methods = {customizedEnumerationMethods}";
            var linqChainMethods = customizedLinqChainMethods == null
                ? string.Empty
                : $"dotnet_code_quality.CA1851.linq_chain_methods = {customizedLinqChainMethods}";
            var assumeMethodEnumeratesParametersConfig = assumeMethodEnumeratesParameters switch
            {
                true => $"dotnet_code_quality.CA1851.assume_method_enumerates_parameters = true",
                false => $"dotnet_code_quality.CA1851.assume_method_enumerates_parameters  = false",
                _ => string.Empty,
            };
 
            var test = new VerifyCS.Test()
            {
                ReferenceAssemblies = ReferenceAssemblies.Net.Net60,
                LanguageVersion = CSharp.LanguageVersion.Latest,
                TestState =
                {
                    Sources =
                    {
                        code
                    },
                    AnalyzerConfigFiles = { ("/.editorConfig", $@"root = true
[*]
{enumerationMethods}
{linqChainMethods}
{assumeMethodEnumeratesParametersConfig}
") },
                },
            };
 
            return test.RunAsync();
        }
 
        private static Task VerifyVisualBasicAsync(
            string code,
            string customizedEnumerationMethods = null,
            string customizedLinqChainMethods = null,
            bool? assumeMethodEnumeratesParameters = null)
        {
            var enumerationMethods = customizedEnumerationMethods == null
                ? string.Empty
                : $"dotnet_code_quality.CA1851.enumeration_methods = {customizedEnumerationMethods}";
            var linqChainMethods = customizedLinqChainMethods == null
                ? string.Empty
                : $"dotnet_code_quality.CA1851.linq_chain_methods = {customizedLinqChainMethods}";
 
            var assumeMethodEnumeratesParametersConfig = assumeMethodEnumeratesParameters switch
            {
                true => $"dotnet_code_quality.CA1851.assume_method_enumerates_parameters = true",
                false => $"dotnet_code_quality.CA1851.assume_method_enumerates_parameters = false",
                _ => string.Empty,
            };
            var test = new VerifyVB.Test()
            {
                ReferenceAssemblies = ReferenceAssemblies.Net.Net60,
                LanguageVersion = VisualBasic.LanguageVersion.Latest,
                TestState =
                {
                    Sources =
                    {
                        code
                    },
                    AnalyzerConfigFiles = { ("/.editorConfig", $@"root = true
[*]
{enumerationMethods}
{linqChainMethods}
{assumeMethodEnumeratesParametersConfig}
") },
                },
            };
 
            return test.RunAsync();
        }
 
        [Fact]
        public async Task TestMultipleInvocations()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(int[] j)
    {
        IEnumerable<int> i = Enumerable.Range(1, 10);
        var c = [|i|].All(x => x == 100);
        var d = [|i|].Any();
        var e = j.Average();
        var f = j.Count();
        var g = [|i|].Average();
        var h = [|i|].Count();
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(j As Integer())
            Dim i = Enumerable.Range(1, 10)
            Dim c = [|i|].All(Function(x) x = 100)
            Dim d = [|i|].Any()
            Dim e = j.Average()
            Dim f = j.Count()
            Dim g = [|i|].Average()
            Dim h = [|i|].Count()
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestForLoop()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(int[] j)
    {
        IEnumerable<int> i = Enumerable.Range(1, 10);
        for (int k = 0; k < 100; k++)
        {
            [|i|].Aggregate((m, n) => m + n);
            j.Contains(100);
            [|i|].Contains(100);
        }
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(j As Integer())
            Dim i = Enumerable.Range(1, 10)
            For index = 1 To 10
                [|i|].Aggregate(Function(m, n) m + n)
                j.Contains(100)
                [|i|].Contains(100)
            Next
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestInvocationsInForEachLoop()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable<int> j)
    {
        var i = Enumerable.Range(1, 10).ToArray();
        foreach (var c in Enumerable.Range(1, 10))
        {
            i.Count();
            [|j|].DefaultIfEmpty().MaxBy(k => k);
        }
    }
}";
 
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(j As Integer())
            Dim i = Enumerable.Range(1, 10)
            For Each index in Enumerable.Range(1, 10)
                [|i|].Aggregate(Function(m, n) m + n)
                j.Contains(100)
            Next
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestInvocationsAfterForEachLoop()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub()
    {
        IEnumerable<int> i = Enumerable.Range(1, 10);
        foreach (var c in [|i|])
        {
        }
        [|i|].Count();
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo()
            Dim i = Enumerable.Range(1, 10)
 
            For Each index in [|i|]
            Next
            [|i|].Count()
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestInvocationsAfterForEachLoopForArray()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub()
    {
        var i = Enumerable.Range(1, 10).ToArray();
        foreach (var c in i.Select(p => p))
        {
        }
        i.Count();
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo()
            Dim i = Enumerable.Range(1, 10).ToArray()
 
            For Each index in i
            Next
            i.Count()
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestWhileLoop()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable<int> j)
    {
        IEnumerable<int> i = Enumerable.Range(1, 10);
        while (true)
        {
            [|i|].ElementAt(100);
            [|j|].ElementAtOrDefault(100);
        }
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(j As IEnumerable(of Integer))
            Dim i As IEnumerable(Of Integer)= Enumerable.Range(1, 10)
 
            While (true)
                [|i|].ElementAt(100)
                [|j|].ElementAtOrDefault(100)
            End While
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestInvocationAfterIfBranchWithElse()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(int b, IEnumerable<int> j)
    {
        var i = Enumerable.Range(1, 10).ToArray();
        if (b == 1)
        {
            i.First();
            [|j|].FirstOrDefault();
        }
        else if (b == 3)
        {
            i.Last();
            [|j|].LastOrDefault();
        }
        else
        {
            i.LongCount();
            [|j|].Max();
        }
 
        i.Min();
        [|j|].Single();
    }
}";
 
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(b As Integer, j As IEnumerable(Of Integer))
            Dim i = Enumerable.Range(1, 10).ToArray()
            If b = 1 Then
                i.First()
                [|j|].FirstOrDefault()
            ElseIf b = 3 Then
                i.Last()
                [|j|].LastOrDefault()
            Else
                i.LongCount()
                [|j|].Max()
            End If
 
            i.Min()
            [|j|].Single()
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestInvocationAfterIfbranch()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable<int> h, int x)
    {
        IEnumerable<int> i = Enumerable.Range(1, 10);
        if (x == 1)
        {
            [|i|].Except([|h|]).ToList();
            [|i|].Intersect([|h|]).ToList();
        }
 
        [|i|].Max();
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(h As IEnumerable(Of Integer), x As Integer)
            Dim i = Enumerable.Range(1, 10)
            If x = 1 Then
                [|i|].Except([|h|]).ToList()
                [|i|].Intersect([|h|]).ToList()
            End If
 
            [|i|].Max()
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestInvocationBeforeIfbranch()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable<int> h, int x)
    {
        IEnumerable<int> i = Enumerable.Range(1, 10);
        [|i|].Max();
        if (x == 1)
        {
            [|i|].Except([|h|]).ToList();
            [|i|].Intersect([|h|]).ToList();
        }
 
        [|i|].Max();
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(h As IEnumerable(Of Integer), x As Integer)
            Dim i = Enumerable.Range(1, 10)
            [|i|].Max()
            If x = 1 Then
                [|i|].Except([|h|]).ToList()
                [|i|].Intersect([|h|]).ToList()
            End If
 
            [|i|].Max()
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestInvocationAfterIfbranchForArray()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable<int> h, int x)
    {
        var i = Enumerable.Range(1, 10).ToArray();
        if (x == 1)
        {
            i.Except([|h|]).ToList();
            i.Intersect([|h|]).ToList();
        }
 
        i.Max();
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(h As IEnumerable(Of Integer), x As Integer)
            Dim i = Enumerable.Range(1, 10).ToArray()
            If x = 1 Then
                i.Except([|h|]).ToList()
                i.Intersect([|h|]).ToList()
            End If
 
            i.Max()
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestNoInvocationAfterIfbranch()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable<int> h, int x)
    {
        IEnumerable<int> i = Enumerable.Range(1, 10);
        if (x == 1)
        {
            [|i|].Union([|h|]).ToList();
            [|i|].Join([|h|], n => n, n => n, (n, m) => n + m).ToList();
        }
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(h As IEnumerable(Of Integer), x As Integer)
            Dim i = Enumerable.Range(1, 10)
            If x = 1 Then
                [|i|].Union([|h|]).ToList()
                [|i|].Join([|h|], Function(n) n, Function(n) n, Function(m, n) m + n).ToList()
            End If
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestOneInvocationAfterIfBranch1()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(int b, int[] c)
    {
        IEnumerable<int> i = Enumerable.Range(1, 10);
        if (b == 1)
        {
            [|i|].SingleOrDefault();
            c.Max();
        }
        else if (b == 3)
        {
            [|i|].ToList();
            c.Min();
        }
        else
        {
            [|i|].Min();
            c.Average();
        }
 
        [|i|].Sum();
        c.First();
    }
}";
 
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(b As Integer, c As Integer())
            Dim i = Enumerable.Range(1, 10)
            If b = 1 Then
                [|i|].SingleOrDefault()
                c.Max()
            Else If b = 3
                [|i|].ToList()
                c.Min()
            Else
                [|i|].Min()
                c.Average()
            End If
 
            [|i|].Sum()
            c.First()
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestOneInvocationAfterIfBranch2()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(int b, IEnumerable<int> j)
    {
        var i = Enumerable.Range(1, 10).ToArray();
        i.First();
        [|j|].SingleOrDefault();
 
        if (b == 1)
        {
            i.First();
            [|j|].First();
        }
        else if (b == 3)
        {
            i.First();
            [|j|].First();
        }
        else if (b == 5)
        {
            i.First();
            [|j|].First();
        }
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(b As Integer, j As IEnumerable(Of Integer))
            Dim i = Enumerable.Range(1, 10).ToArray()
            i.First()
            [|j|].SingleOrDefault()
 
            If b = 1 Then
                i.First()
                [|j|].First()
            Else If b = 3
                i.First()
                [|j|].First()
            Else
                i.First()
                [|j|].First()
            End If
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestTwoInvocationsAfterIfElseBranch()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(bool flag, IEnumerable<int> j)
    {
        IEnumerable<int> i = Enumerable.Range(1, 10);
        var k = Enumerable.Range(1, 10).ToArray();
        if (flag)
        {
            [|i|].Single();
            [|j|].SingleOrDefault();
            k.Single();
        }
        else
        {
            [|i|].Sum();
            [|j|].ToArray();
            k.Last();
        }
 
        [|i|].ToDictionary(x => x);
        [|j|].First();
        k.LastOrDefault();
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(flag As Boolean, j As IEnumerable(Of Integer))
            Dim i = Enumerable.Range(1, 10)
            Dim k = Enumerable.Range(1, 10).ToArray()
 
            If flag Then
                [|i|].Single()
                [|j|].SingleOrDefault()
                k.Single()
            Else
                [|i|].Sum()
                [|j|].ToArray()
                k.Last()
            End If
 
            [|i|].ToDictionary(Function(x) x)
            [|j|].First()
            k.LastOrDefault()
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestExplicitDeclaration()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(bool flag)
    {
        IEnumerable<int> k = Enumerable.Range(1, 10).ToArray();
        if (flag)
        {
            k.Single();
        }
        else
        {
            k.Last();
        }
 
        k.LastOrDefault();
    }
}";
 
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(flag As Boolean)
            Dim k As IEnumerable(Of Integer) = Enumerable.Range(1, 10).ToArray()
 
            If flag Then
                k.Single()
            Else
                k.Last()
            End If
 
            k.LastOrDefault()
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestTwoInvocationsAfterIfBranch()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(bool flag, IEnumerable<int> j)
    {
        IEnumerable<int> i = Enumerable.Range(1, 10);
        var k = Enumerable.Range(1, 10).ToArray();
        if (flag)
        {
            [|i|].Single();
            [|j|].SingleOrDefault();
            k.Sum();
        }
 
        [|i|].ToDictionary(x => x);
        [|i|].Max();
 
        [|j|].First();
        [|j|].Min();
 
        k.Sum();
        k.Sum();
    }
}";
 
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(flag As Boolean, j As IEnumerable(Of Integer))
            Dim i As IEnumerable(Of Integer) = Enumerable.Range(1, 10)
            Dim k = Enumerable.Range(1, 10).ToArray()
 
            If flag Then
                [|i|].Single()
                [|j|].SingleOrDefault()
                k.Sum()
            End If
        
            [|i|].ToDictionary(Function(x) x)
            [|i|].Max()
 
            [|j|].First()
            [|j|].Min()
 
            k.Sum()
            k.Sum()
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestDifferntInvocationsInIfBranch()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(int b, IEnumerable<int> j)
    {
        IEnumerable<int> i = Enumerable.Range(1, 10);
        var k = Enumerable.Range(1, 10).ToArray();
        if (b == 0)
        {
            [|i|].Single();
            k.ElementAt(10);
        }
        else if (b == 1)
        {
            [|j|].SingleOrDefault();
            k.ElementAtOrDefault(10);
        }
 
        [|i|].ToDictionary(x => x);
        [|i|].Max();
 
        [|j|].Min();
        [|j|].First();
 
        k.ToHashSet();
        k.LongCount();
    }
}";
 
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(b As Boolean, j As IEnumerable(Of Integer))
            Dim i As IEnumerable(Of Integer) = Enumerable.Range(1, 10)
            Dim k = Enumerable.Range(1, 10).ToArray()
 
            If b = 0 Then
                [|i|].Single()
                k.ElementAt(10)
            Else if b = 1 Then
                [|j|].SingleOrDefault()
                k.ElementAtOrDefault(10)
            End If
        
            [|i|].ToDictionary(Function(x) x)
            [|i|].Max()
 
            [|j|].Min()
            [|j|].First()
 
            k.ToHashSet()
            k.LongCount()
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestDifferntInvocationsInIfBranch2()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(int b, IEnumerable<int> j)
    {
        IEnumerable<int> i = Enumerable.Range(1, 10);
        if (b == 0)
        {
            [|i|].Single();
        }
        else if (b == 1)
        {
            [|j|].SingleOrDefault();
        }
 
        [|i|].ToDictionary(x => x);
        [|j|].First();
    }
}";
 
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(b As Boolean, j As IEnumerable(Of Integer))
            Dim i As IEnumerable(Of Integer) = Enumerable.Range(1, 10)
            If b = 0 Then
                [|i|].Single()
            Else if b = 1 Then
                [|j|].SingleOrDefault()
            End If
        
            [|i|].ToDictionary(Function(x) x)
            [|j|].First()
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestDifferntInvocationsInIfBranch3()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(int b, IEnumerable<int> j)
    {
        IEnumerable<int> i = Enumerable.Range(1, 10);
        if (b == 0)
        {
            [|i|].Single();
        }
        else
        {
            [|j|].SingleOrDefault();
        }
 
        [|i|].ToDictionary(x => x);
        [|i|].ToDictionary(x => x);
 
        [|j|].First();
        [|j|].First();
    }
}";
 
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(b As Integer, j As IEnumerable(Of Integer))
            Dim i As IEnumerable(Of Integer) = Enumerable.Range(1, 10)
            If b = 0 Then
                [|i|].Single()
            Else if b = 1 Then
                [|j|].SingleOrDefault()
            End If
        
            [|i|].ToDictionary(Function(x) x)
            [|i|].ToDictionary(Function(x) x)
            [|j|].First()
            [|j|].First()
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestInvocationOnBranch1()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub()
    {
        IEnumerable<int> i = Enumerable.Range(1, 10);
        if ([|i|].Any())
        {
            [|i|].Single();
        }
        else
        {
            [|i|].SingleOrDefault();
        }
    }
}";
 
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo()
            Dim i As IEnumerable(Of Integer) = Enumerable.Range(1, 10)
            If [|i|].Any() Then
                [|i|].Single()
            Else
                [|i|].SingleOrDefault()
            End If
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestInvocationOnBranch2()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub()
    {
        IEnumerable<int> i = Enumerable.Range(1, 10);
        if ([|i|].Any())
        {
        }
        else if ([|i|].Max() == 10)
        {
        }
 
        var j = Enumerable.Range(1, 10).ToArray();
        if (j.Any())
        {
        }
        else if (j.Max() == 10)
        {
        }
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo()
            Dim i As IEnumerable(Of Integer) = Enumerable.Range(1, 10)
            If [|i|].Any() Then
            Else if [|i|].Max() = 10 Then
            End If
            
            Dim j = Enumerable.Range(1, 10).ToArray()
            If j.Any() Then
            Else if j.Max() = 10 Then
            End If
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestInvocationOnBranch3()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub()
    {
        IEnumerable<int> i = Enumerable.Range(1, 10);
        if ([|i|].Any())
        {
            [|i|].ToArray();
        }
        else if ([|i|].Max() == 10)
        {
        }
 
        var j = Enumerable.Range(1, 10).ToArray();
        if (j.Any())
        {
            j.ToDictionary(l => l);
        }
        else if (j.Max() == 10)
        {
        }
    }
}";
 
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo()
            Dim i As IEnumerable(Of Integer) = Enumerable.Range(1, 10)
            If [|i|].Any() Then
                [|i|].ToArray()
            Else if [|i|].Max() = 10 Then
            End If
            
            Dim j = Enumerable.Range(1, 10).ToArray()
            If j.Any() Then
                j.ToDictionary(Function(l) l)
            Else if j.Max() = 10 Then
            End If
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestInvocationOnBranch4()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub()
    {
        IEnumerable<int> i = Enumerable.Range(1, 10);
        if ([|i|].Any() && [|i|].Max() == 10)
        {
        }
        var j = Enumerable.Range(1, 10).ToArray();
        if (j.Any() && j.Max() == 10)
        {
        }
    }
}";
 
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo()
            Dim i As IEnumerable(Of Integer) = Enumerable.Range(1, 10)
            If [|i|].Any() AndAlso [|i|].Max() = 10 Then
            End If
 
            If [|i|].Any() And [|i|].Max() = 10 Then
            End If
            
            Dim j = Enumerable.Range(1, 10).ToArray()
            If j.Any() AndAlso j.Max() = 10 Then
            End If
 
            If j.Any() And j.Max() = 10 Then
            End If
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestInvocationOnBranch5()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub()
    {
        IEnumerable<int> i = Enumerable.Range(1, 10);
        if ([|i|].Any() || [|i|].Max() == 10)
        {
        }
 
        var j = Enumerable.Range(1, 10).ToArray();
        if (j.Any() || j.Max() == 10)
        {
        }
    }
}";
 
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo()
            Dim i As IEnumerable(Of Integer) = Enumerable.Range(1, 10)
            If [|i|].Any() OrElse [|i|].Max() = 10 Then
            End If
 
            If [|i|].Any() Or [|i|].Max() = 10 Then
            End If
            
            Dim j = Enumerable.Range(1, 10).ToArray()
            If j.Any() OrElse j.Max() = 10 Then
            End If
 
            If j.Any() Or j.Max() = 10 Then
            End If
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestInvocationOnBranch6()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub()
    {
        IEnumerable<int> i = Enumerable.Range(1, 10);
        while ([|i|].Min() == 10)
        {
        }
 
        var j = Enumerable.Range(1, 10).ToArray();
        while (j.Min() == 10)
        {
        }
    }
}";
 
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo()
            Dim i As IEnumerable(Of Integer) = Enumerable.Range(1, 10)
            While [|i|].Min() = 10
            End While
 
            Dim j = Enumerable.Range(1, 10).ToArray()
            While j.Min() = 10
            End While
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestInvocationOnBranch7()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub()
    {
        IEnumerable<int> i = Enumerable.Range(1, 10);
        if ([|i|].Any())
        {
        }
 
        [|i|].Min();
 
        var j = Enumerable.Range(1, 10).ToArray();
        if (j.Any())
        {
        }
 
        j.Min();
    }
}";
 
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo()
            Dim i As IEnumerable(Of Integer) = Enumerable.Range(1, 10)
            If [|i|].Any()
            End If
 
            [|i|].Min()
 
            Dim j = Enumerable.Range(1, 10).ToArray()
            If j.Any()
            End If
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestInvocationWithForEachLoop1()
        {
            var csharpCode = @"
using System;
using System.Linq;
using System.Collections.Generic;
 
public class Bar
{
    public void Sub(IEnumerable<int> j)
    {
        IEnumerable<int> i = Enumerable.Range(1, 10);
        foreach (var c in [|i|])
        {
        }
 
        [|i|].ToHashSet();
 
        foreach (var c2 in [|j|])
        {
        }
 
        [|j|].ToList();
    }
}";
 
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(j As IEnumerable(Of Integer))
            Dim i As IEnumerable(Of Integer) = Enumerable.Range(1, 10)
            
            For Each c In [|i|]
            Next
            [|i|].ToHashSet()
            
            For Each c2 In [|j|]
            Next
            [|j|].ToHashSet()
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestInvocationWithForEachLoop2()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable<int> j)
    {
        IEnumerable<int> i = Enumerable.Range(1, 10);
        foreach (var c in [|i|].Select(m => m + 1).Where(m => m != 100))
        {
        }
 
        [|i|].ToLookup(x => x);
 
        foreach (var c2 in [|j|].Select(m => m + 1).Where(m => m != 100))
        {
        }
 
        [|j|].ToImmutableArray();
 
        var k = Enumerable.Range(1, 10).ToArray();
        foreach (var c3 in k.Select(m => m + 1).Where(m => m != 100))
        {
        }
        k.ToImmutableArray();
    }
}";
 
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Collections.Immutable
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(j As IEnumerable(Of Integer))
            Dim i As IEnumerable(Of Integer) = Enumerable.Range(1, 10)
            
            For Each c In [|i|].Select(Function(m) m + 1).Where(Function(m) m <> 100)
            Next
            [|i|].ToLookUp(Function(x) x)
            
            For Each c2 In [|j|].Select(Function(m) m + 1).Where(Function(m) m <> 100)
            Next
            [|j|].ToHashSet()
 
            Dim k = Enumerable.Range(1, 10).ToArray
 
            For Each c3 In k.Select(Function(m) m + 1).Where(Function(m) m <> 100)
            Next
            k.ToImmutableArray()
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestInvocationWithForEachLoop3()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable<int> j)
    {
        IEnumerable<int> i = Enumerable.Range(1, 10);
        foreach (var c in [|i|].Select(m => m + 1).Where(m => m != 100))
        {
            [|i|].Where(x => x != 100).ToImmutableList();
        }
 
        [|i|].Select(k => k + 1).Skip(100).First();
 
        foreach (var c2 in [|j|].Select(m => m + 1).Where(m => m != 100))
        {
            [|j|].Where(x => x != 100).ToImmutableSortedDictionary(m => m, n => n);
        }
 
        [|j|].Select(k => k + 1).Skip(100).First();
 
        var o = Enumerable.Range(1, 10).ToArray();
        foreach (var c3 in o.Select(m => m + 1).Where(m => m != 100))
        {
            o.Where(x => x != 100).ToImmutableSortedDictionary(m => m, n => n);
        }
 
        o.Select(k => k + 1).Skip(100).First();
    }
}";
 
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Collections.Immutable
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(j As IEnumerable(Of Integer))
            Dim i As IEnumerable(Of Integer) = Enumerable.Range(1, 10)
            
            For Each c In [|i|].Select(Function(m) m + 1).Where(Function(m) m <> 100)
                [|i|].Where(Function(x) x <> 100).ToImmutableList()
            Next
            [|i|].Select(Function(k) k + 1).Skip(100).First()
            
            For Each c2 In [|j|].Select(Function(m) m + 1).Where(Function(m) m <> 100)
                [|j|].Where(Function(x) x <> 100).ToImmutableSortedDictionary(Function(m) m, Function(n) n)
            Next
            [|j|].Select(Function(k) k + 1).Skip(100).First()
 
            Dim o = Enumerable.Range(1, 10).ToArray
            For Each c3 In o.Select(Function(m) m + 1).Where(Function(m) m <> 100)
                o.Where(Function(x) x <> 100).ToImmutableSortedDictionary(Function(m) m, Function(n) n)
            Next
            o.Select(Function(k) k + 1).Skip(100).First()
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestInvocationAcceptObject()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable<int> h)
    {
        IEnumerable<int> i = Enumerable.Range(1, 10);
        TestMethod(i);
        i.First();
 
        TestMethod(h);
        h.First();
    }
 
    public void TestMethod(object o)
    {
    }
}";
 
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(h As IEnumerable(Of Integer))
            Dim i As IEnumerable(Of Integer) = Enumerable.Range(1, 10)
            TestMethod(i)
            i.First()
            
            TestMethod(h)
            h.First()
        End Sub
 
  
        Public Sub TestMethod(o As Object)
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestInvocationAcceptGenerics()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable<int> h)
    {
        IEnumerable<int> i = Enumerable.Range(1, 10);
        TestMethod(i);
        i.First();
        i.TestMethod2();
 
        TestMethod(h);
        h.First();
        h.TestMethod2();
    }
 
    public void TestMethod<T>(T o)
    {
    }
}
 
public static class Ex 
{
    public static void TestMethod2<T>(this T o)
    {
    }
}";
 
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
Imports System.Runtime.CompilerServices
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(h As IEnumerable(Of Integer))
            Dim i As IEnumerable(Of Integer) = Enumerable.Range(1, 10)
            TestMethod(i)
            i.First()
            i.TestMethod2()
 
            TestMethod(h)
            h.First()
            h.TestMethod2()
        End Sub
 
        Public Sub TestMethod(Of T)(o As T)
        End Sub
    End Class
End Namespace
 
Module Ex
 
    <Extension()>
    Public Sub TestMethod2(Of T)(q As T)
    End Sub
End Module
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestInvocationAcceptGenericsConstraintToIEnumerable()
        {
            var csharpCode = @"
using System;
using System.Linq;
using System.Collections.Generic;
 
public class Bar
{
    public void Sub(IEnumerable<int> h)
    {
        IEnumerable<int> i = Enumerable.Range(1, 10);
        TestMethod(i);
        i.First();
 
        TestMethod(h);
        h.First();
    }
 
    public void TestMethod<T>(T o) where T : IEnumerable<int>
    {
        var x = o;
    }
}";
 
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(h As IEnumerable(Of Integer))
            Dim i As IEnumerable(Of Integer) = Enumerable.Range(1, 10)
            TestMethod(i)
            i.First()
            
            TestMethod(h)
            h.First()
        End Sub
 
  
        Public Sub TestMethod(Of T As IEnumerable(Of Integer))(o As T)
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestExplictInvocations()
        {
            var csharpCode = @"
using System.Collections.Immutable;
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable<int> h)
    {
        IEnumerable<int> i = Enumerable.Range(1, 10);
        Enumerable.First(predicate: x => x != 100, source: [|i|]);
        [|i|].ToImmutableSortedSet();
 
        Enumerable.First(predicate: x => x != 100, source: [|h|]);
        [|h|].First();
    }
}";
 
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Collections.Immutable
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(h As IEnumerable(Of Integer))
            Dim i As IEnumerable(Of Integer) = Enumerable.Range(1, 10)
            Enumerable.First(predicate:= Function(x) x <> 100, source:= [|i|])
            [|i|].ToImmutableSortedSet()
            
            Enumerable.First(predicate:= Function(x) x <> 100, source:= [|h|])
            [|h|].First()
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestTakesTwoIEnumerables1()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable<int> h)
    {
        IEnumerable<int> i = Enumerable.Range(1, 10);
        [|i|].Concat([|h|]).ToArray();
        [|h|].Concat([|i|]).ToList();
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(h As IEnumerable(Of Integer))
            Dim i As IEnumerable(Of Integer) = Enumerable.Range(1, 10)
            [|i|].Concat([|h|]).ToArray()
            [|h|].Concat([|i|]).ToList()
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestTakesTwoIEnumerables2()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable<int> h)
    {
        IEnumerable<int> i = Enumerable.Range(1, 10);
        [|i|].SequenceEqual([|h|]);
        [|h|].SequenceEqual([|i|]);
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(h As IEnumerable(Of Integer))
            Dim i As IEnumerable(Of Integer) = Enumerable.Range(1, 10)
            [|i|].SequenceEqual([|h|])
            [|h|].SequenceEqual([|i|])
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestTakesTwoIEnumerables3()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable<int> h)
    {
        IEnumerable<int> x = Enumerable.Range(1, 10);
        [|x|].GroupJoin([|h|], i => i, i => i, (i, ints) => i).First();
        [|x|].GroupJoin([|h|], i => i, i => i, (i, ints) => i).Last();
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(h As IEnumerable(Of Integer))
            Dim x As IEnumerable(Of Integer) = Enumerable.Range(1, 10)
            [|x|].GroupJoin([|h|], Function(i) i, Function(i) i, Function(i, ints) i).First()
            [|x|].GroupJoin([|h|], Function(i) i, Function(i) i, Function(i, ints) i).Last()
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestDelayExecutions()
        {
            var csharpCode = @"
using System;
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub()
    {
        IEnumerable<int> x = Enumerable.Range(1, 10);
        var c1 = [|x|].Append(1).Cast<Object>().Distinct()
            .OfType<int>().OrderBy(i => i).OrderByDescending(i => i)
            .ThenBy(i => i).ThenByDescending(i => i)
            .Prepend(1).Reverse().Select(i => i + 1).Skip(100)
            .SkipWhile(i => i == 99).SkipLast(100).Take(1).TakeWhile(i => i == 100).TakeLast(100)
            .Where(i => i != 10).ToArray();
 
        var c2 = [|x|].Append(1).Cast<Object>().Distinct()
            .OfType<int>().OrderBy(i => i).OrderByDescending(i => i)
            .ThenBy(i => i).ThenByDescending(i => i)
            .Prepend(1).Reverse().Select(i => i + 1).Skip(100)
            .SkipWhile(i => i == 99).SkipLast(100).Take(1).TakeWhile(i => i == 100).TakeLast(100)
            .Where(i => i != 10).First();
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo()
            Dim x As IEnumerable(Of Integer) = Enumerable.Range(1, 10)
            Dim c1 = [|x|].Append(1).Cast(Of Object)().Distinct().
                OfType(Of Integer).OrderBy(Function(i) i).OrderByDescending(Function(i) i).
                ThenBy(Function(i) i).ThenByDescending(Function(i) i).
                Prepend(1).Reverse().Select(Function(i) i + 1).Skip(100).
                SkipWhile(Function(i) i = 99).SkipLast(100).Take(1).TakeWhile(Function(i) i = 100).TakeLast(100).
                Where(Function(i) i <> 10).ToArray()
 
            Dim c2 = [|x|].Append(1).Cast(Of Object)().Distinct().
                OfType(Of Integer).OrderBy(Function(i) i).OrderByDescending(Function(i) i).
                ThenBy(Function(i) i).ThenByDescending(Function(i) i).
                Prepend(1).Reverse().Select(Function(i) i + 1).Skip(100).
                SkipWhile(Function(i) i = 99).SkipLast(100).Take(1).TakeWhile(Function(i) i = 100).TakeLast(100).
                Where(Function(i) i <> 10).First()
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestGroupBy()
        {
            var csharpCode = @"
using System;
using System.Linq;
using System.Collections.Generic;
 
public class Bar
{
    public void Sub()
    {
        IEnumerable<int> x = Enumerable.Range(1, 10);
        var z = [|x|].GroupBy(i => i.GetHashCode()).ToArray();
        var z2 = [|x|].GroupBy(i => i.GetHashCode()).ToArray();
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo()
            Dim x As IEnumerable(Of Integer) = Enumerable.Range(1, 10)
            Dim z = [|x|].GroupBy(Function(i) i.GetHashCode()).ToArray()
            Dim z2= [|x|].GroupBy(Function(i) i.GetHashCode()).ToArray()
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestSelectMany()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable<IEnumerable<int>> y)
    {
        var a = [|y|].SelectMany(x => x).ToArray();
        var b = [|y|].SelectMany(x => x.ToArray()).ToArray();
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(y As IEnumerable(Of IEnumerable(Of Integer)))
            Dim a = [|y|].SelectMany(Function(x) x).ToArray()
            Dim b = [|y|].SelectMany(Function(x) x.ToArray()).ToArray()
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestIEnumerable()
        {
            var csharpCode = @"
using System.Collections;
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable h)
    {
        [|h|].OfType<int>().ToArray();
        [|h|].Cast<int>().ToList();
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(h As IEnumerable)
            [|h|].OfType(Of Integer).ToArray()
            [|h|].Cast(Of Integer).ToList()
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestIOrderedEnumerable()
        {
            var csharpCode = @"
using System.Linq;
 
public class Bar
{
    public void Sub(IOrderedEnumerable<int> h)
    {
        [|h|].Where(i => i != 10).ToArray();
        [|h|].ToList();
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(h As IOrderedEnumerable(Of Integer))
            [|h|].Where(Function(i) i <> 10).ToArray()
            [|h|].ToList()
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestExecutionInTheMiddle()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable<int> h)
    {
        [|h|].ToArray().Select(j => j + 1).Where(x => x != 100);
        [|h|].ToArray().Select(j => j + 1).Where(x => x != 100);
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(h As IEnumerable(Of Integer))
            [|h|].ToArray().Select(Function(j) j + 1).Where(Function(x) x <> 100)
            [|h|].ToArray().Select(Function(j) j + 1).Where(Function(x) x <> 100)
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestAssignmentAfterEnumeration()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable<int> h)
    {
        var d = [|h|].ToArray();
        var d2 = [|h|].ToArray();
 
        h = Enumerable.Range(1, 10);
        h.First();
 
        h = Enumerable.Range(1, 100);
        foreach (var i in h)
        {
        }
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(h As IEnumerable(Of Integer))
            Dim d = [|h|].ToArray()
            Dim d2 = [|h|].ToArray()
            
            h = Enumerable.Range(1, 10)
            h.First()
 
            h = Enumerable.Range(1, 100)
            For Each i In h
            Next
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestForEachLoopForLocalAssignment()
        {
            var csharpCode = @"
using System;
using System.Linq;
using System.Collections;
using System.Collections.Generic;
 
public class Bar
{
    public void Sub()
    {
        var d = Enumerable.Range(1, 100);
        foreach (var i in [|d|])
        {
        }
 
        var e = d;
        foreach (var i in [|e|])
        {
        }
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo()
            Dim d = Enumerable.Range(1, 100)
            For Each i In [|d|]
            Next
 
            Dim e = d
            For Each i In [|e|]
            Next
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestInvocationLocalAssignment()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable<int> h)
    {
        [|h|].ToArray();
        var c = h;
 
        [|c|].First();
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(h As IEnumerable(Of Integer))
            [|h|].ToArray()
            Dim c = h
            [|c|].First()
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestInvocationWithAssignment()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(bool flag, IEnumerable<int> h)
    {
        IEnumerable<int> i = Enumerable.Range(1, 10);
        var j = i;
        var k = j;
 
        var n = h;
        var m = n;
        
        if (flag)
        {
            foreach (var x in [|k|])
            {
            }
 
            foreach (var x in [|m|])
            {
            }
        }
        else
        {
            var d = [|i|].First();
            var d2 = [|h|].First();
        }
        
        foreach (var z in [|j|])
        {
        }
 
        foreach (var z in [|n|])
        {
        }
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(flag As Boolean, h As IEnumerable(Of Integer))
            Dim i As IEnumerable(Of Integer) = Enumerable.Range(1, 10)
            Dim j = i
            Dim k = j
            
            Dim n = h
            Dim m = n
 
            If Flag Then
                For Each x in [|k|]
                Next
 
                For Each x in [|m|]
                Next
            Else
                Dim d = [|i|].First()
                Dim d2 = [|h|].First()
            End If
 
            For Each z in [|j|]
            Next
 
            For Each z in [|n|]
            Next
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestForEachForIEnumerable()
        {
            var csharpCode = @"
using System.Collections;
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable h)
    {
        foreach (var i in [|h|])
        {
        }
 
        foreach (var i in [|h|])
        {
        }
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(h As IEnumerable)
            For Each i in [|h|]
            Next
 
            For Each i in [|h|]
            Next
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestForEachForIOrderedEnumerable()
        {
            var csharpCode = @"
using System.Collections;
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(IOrderedEnumerable<int> h)
    {
        foreach (var i in [|h|])
        {
        }
 
        foreach (var i in [|h|])
        {
        }
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(h As IOrderedEnumerable(Of Integer))
            For Each i in [|h|]
            Next
 
            For Each i in [|h|]
            Next
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestForEachLoop()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable<int> h)
    {
        foreach (var i in [|h|])
        {
        }
 
        foreach (var i in [|h|])
        {
        }
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace NS
    Public Class Bar
        Public Sub Goo(h As IEnumerable(Of Integer))
            For Each item In [|h|]
            Next
 
            For Each item In [|h|]
            Next
        End Sub
    End Class
End Namespace";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestEnumeratedParameterAfterLinqCallChain()
        {
            var csharpCode = @"
using System.Collections;
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable<int> i, IEnumerable<int> j, IEnumerable<int> k)
    {
        var z = [|k|].Concat([|j|]).Concat(i);
        [|j|].ElementAt(10);
        z.ToArray();
        [|k|].ToArray();
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace NS
    Public Class Bar
        Public Sub Goo(i As IEnumerable(Of Integer), j As IEnumerable(Of Integer), k As IEnumerable(Of Integer))
            Dim z = [|k|].Concat([|j|]).Concat(i)
            [|j|].ElementAt(10)
            z.ToArray()
            [|k|].ToArray()
        End Sub
    End Class
End Namespace";
 
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestEnumeratedLocalAfterLinqCallChain1()
        {
            var csharpCode = @"
using System.Collections;
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable<int> i, IEnumerable<int> k)
    {
        var j = Enumerable.Range(1, 10);
        var z = i.Concat([|j|]).Concat([|k|]);
        [|j|].ElementAt(10);
        z.ToArray();
        [|k|].ToArray();
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace NS
    Public Class Bar
        Public Sub Goo(i As IEnumerable(Of Integer), k As IEnumerable(Of Integer))
            Dim j = Enumerable.Range(1, 10)
            Dim z = i.Concat([|j|]).Concat([|k|])
            [|j|].ElementAt(10)
            z.ToArray()
            [|k|].ToArray()
        End Sub
    End Class
End Namespace";
 
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestEnumeratedLocalAfterLinqCallChain2()
        {
            var csharp = @"
using System.Collections;
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable<int> i, IEnumerable<int> k)
    {
        var j = Enumerable.Range(1, 10).Except([|i|]).Except([|k|]);
        var z = [|i|].Concat([|k|]);
        j.ElementAt(10);
        z.ToArray();
    }
}";
            await VerifyCSharpAsync(csharp);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace NS
    Public Class Bar
        Public Sub Goo(i As IEnumerable(Of Integer), k As IEnumerable(Of Integer))
            Dim j = Enumerable.Range(1, 10).Except([|i|]).Except([|k|])
            Dim z = [|i|].Concat([|k|])
            j.ElementAt(10)
            z.ToArray()
        End Sub
    End Class
End Namespace";
 
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestEnumeratedLocalAfterLinqCallChain3()
        {
            var csharpCode = @"
using System.Collections;
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable<int> i)
    {
        var j = Enumerable.Range(1, 10);
        var p = j;
        var z = i.Concat([|j|]).Concat([|p|]);
        [|j|].ElementAt(10);
        z.ToArray();
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace NS
    Public Class Bar
        Public Sub Goo(i As IEnumerable(Of Integer))
            Dim j = Enumerable.Range(1, 10)
            Dim p = j
            Dim z = i.Concat([|j|]).Concat([|p|])
            [|j|].ElementAt(10)
            z.ToArray()
        End Sub
    End Class
End Namespace";
 
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestConcatOneParameterMultipleTimes()
        {
            var csharpCode = @"
using System.Collections;
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable<int> i, IEnumerable<int> k)
    {
        var z = i.Except([|k|]).Concat([|k|]);
        z.ToArray();
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace NS
    Public Class Bar
        Public Sub Goo(i As IEnumerable(Of Integer), k As IEnumerable(Of Integer))
            Dim z = i.Except([|k|]).Concat([|k|])
            z.ToArray()
        End Sub
    End Class
End Namespace";
 
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestEnumeratedLocalWithMultipleAbstractLocations1()
        {
            var csharpCode = @"
using System.Collections;
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable<int> i, IEnumerable<int> j, bool flag)
    {
        var a = flag ? i : j;
        var b = [|a|].Except([|i|]);
 
        [|a|].ElementAt(10);
        [|i|].ElementAt(10);
        b.ToArray();
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace NS
    Public Class Bar
        Public Sub Goo(i As IEnumerable(Of Integer), j As IEnumerable(Of Integer), flag As Boolean)
            Dim a = If(flag, i, j)
            Dim b = [|a|].Except([|i|])
 
            [|a|].ElementAt(10)
            [|i|].ElementAt(10)
            b.ToArray()
        End Sub
    End Class
End Namespace";
 
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestEnumeratedLocalWithMultipleAbstractLocations2()
        {
            var csharpCode = @"
using System.Collections;
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable<int> i, int[] j, bool flag)
    {
        var a = flag ? i : j;
        var b = a.Except(j);
 
        a.ElementAt(10);
        i.ElementAt(10);
        b.ToArray();
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace NS
    Public Class Bar
        Public Sub Goo(i As IEnumerable(Of Integer), j As Integer(), flag As Boolean)
            Dim a = If(flag, i, j)
            Dim b = a.Except(j)
 
            a.ElementAt(10)
            i.ElementAt(10)
            b.ToArray()
        End Sub
    End Class
End Namespace";
 
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestEnumeratedLocalWithMultipleAbstractLocations3()
        {
            var csharpCode = @"
using System.Collections;
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(int[] i, int[] j, bool flag)
    {
        var a = flag ? i : j;
        var b = a.Except(j);
 
        [|b|].ToArray();
        [|b|].ToArray();
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace NS
    Public Class Bar
        Public Sub Goo(i As Integer(), j As Integer(), flag As Boolean)
            Dim a = If(flag, i, j)
            Dim b = a.Except(j)
 
            [|b|].ToArray()
            [|b|].ToArray()
        End Sub
    End Class
End Namespace";
 
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestDelayEnumerableFromArray()
        {
            var csharpCode = @"
using System.Collections;
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable<int> i, int[] j)
    {
        var z = j.Concat(i);
        j.ElementAt(10);
        z.ToArray();
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace NS
    Public Class Bar
        Public Sub Goo(i As IEnumerable(Of Integer), j As Integer())
            Dim z = j.Concat(i)
 
            j.ElementAt(10)
            z.ToArray()
        End Sub
    End Class
End Namespace";
 
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestDelayIOrderedEnumerable()
        {
            var csharpCode = @"
using System.Collections;
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable<int> i, IOrderedEnumerable<int> j, IEnumerable<int> k)
    {
        var z = i.Concat([|j|]).Concat(k);
        [|j|].ElementAt(10);
        z.ToArray();
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace NS
    Public Class Bar
        Public Sub Goo(i As IEnumerable(Of Integer), j As IOrderedEnumerable(Of Integer), k As IEnumerable(Of Integer))
            Dim z = i.Concat([|j|]).Concat(k)
            [|j|].ElementAt(10)
            z.ToArray()
        End Sub
    End Class
End Namespace";
 
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestNestedDelayIEnumerable()
        {
            var csharpCode = @"
using System.Collections;
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable<int> i, IOrderedEnumerable<int> j, IEnumerable<int> k)
    {
        var z = i.Concat(k.Concat([|j|]).Select(p => p).Where(p => p != 100)).Distinct().Reverse();
        [|j|].ElementAt(10);
        z.ToArray();
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace NS
    Public Class Bar
        Public Sub Goo(i As IEnumerable(Of Integer), j As IOrderedEnumerable(Of Integer), k As IEnumerable(Of Integer))
            Dim z = i.Concat(k.Concat([|j|])).Select(Function(p) p).Where(Function(p) p <> 100).Distinct().Reverse()
            [|j|].ElementAt(10)
            z.ToArray()
        End Sub
    End Class
End Namespace";
 
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestImplictExplictedFromArrayToIEnumerable()
        {
            var csharpCode = @"
using System.Collections;
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable<int> i)
    {
        IEnumerable<int> j = Enumerable.Range(1, 10).ToArray();
        var z = i.Zip(j, (a, b) => (a, b));
        j.ElementAt(10);
        z.ToArray();
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace NS
    Public Class Bar
        Public Sub Goo(i As IEnumerable(Of Integer))
            Dim j As IEnumerable(Of Integer) = Enumerable.Range(1, 10).ToArray()
            Dim z = i.Zip(j, Function(a, b) (a, b))
            j.ElementAt(10)
            z.ToArray()
        End Sub
    End Class
End Namespace";
 
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestCallExtensionMethodAsOrdinaryMethod()
        {
            var csharpCode = @"
using System.Collections;
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable<int> i)
    {
        IEnumerable<int> j = Enumerable.Range(1, 10);
        var z = Enumerable.Concat(i, [|j|]);
        Enumerable.ElementAt([|j|], 10);
        Enumerable.ToArray(z);
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace NS
    Public Class Bar
        Public Sub Goo(i As IEnumerable(Of Integer))
            Dim j As IEnumerable(Of Integer) = Enumerable.Range(1, 10)
            Dim z = Enumerable.Concat(i, [|j|])
            Enumerable.ElementAt([|j|], 10)
            Enumerable.ToArray(z)
        End Sub
    End Class
End Namespace";
 
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestAssignFromTranslatedQuery()
        {
            var csharpCode = @"
using System.Collections;
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable<int> i)
    {
        var k = from a in [|i|]
                select a + 1;
 
        k.ElementAt(10);
        [|i|].ElementAt(100);
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace NS
    Public Class Bar
        Public Sub Goo(i As IEnumerable(Of Integer))
            Dim k = From a In [|i|]
                    Select a + 1
            [|i|].ElementAt(10)
            k.ElementAt(100)
        End Sub
    End Class
End Namespace";
 
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestVBAggregateQuery()
        {
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace NS
    Public Class Bar
        Public Sub Goo(i As IEnumerable(Of Integer))
            Dim z = From q in [|i|]
                    Select q + 1
 
            Dim j = Aggregate k in [|z|]
                    Into Average(k)
 
            Dim j2 = Aggregate k in [|z|]
                    Into Sum(k)
        End Sub
    End Class
End Namespace";
 
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestAsEnumerable1()
        {
            var csharpCode = @"
using System.Collections;
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(int[] i)
    {
        var j = Enumerable.Range(1, 10);
        var z = [|j|].AsEnumerable();
        z.AsEnumerable().First();
        z.First();
 
        var x = i.AsEnumerable();
        i.AsEnumerable().First();
        i.First();
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace NS
    Public Class Bar
        Public Sub Goo(i As Integer())
            Dim j = Enumerable.Range(1, 10)
            Dim z = [|j|].AsEnumerable()
            z.AsEnumerable().ElementAt(10)
            z.ElementAt(10)
            
            Dim x = i.AsEnumerable()
            x.AsEnumerable().ElementAt(10)
            x.ElementAt(10)
        End Sub
    End Class
End Namespace";
 
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestAsEnumerable2()
        {
            var csharpCode = @"
using System.Collections;
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub()
    {
        var j = Enumerable.Range(1, 10);
        var z = [|j|].AsEnumerable();
        z.First();
        z.First();
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace NS
    Public Class Bar
        Public Sub Goo()
            Dim j = Enumerable.Range(1, 10)
            Dim z = [|j|].AsEnumerable()
            z.First()
            z.First()
        End Sub
    End Class
End Namespace";
 
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestZip()
        {
            var csharpCode1 = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable<int> j)
    {
        IEnumerable<int> i = Enumerable.Range(1, 10);
        var k = [|i|].Zip(j, (a, b) => (a, b));
        k.First();
        [|i|].First();
    }
}";
            await VerifyCSharpAsync(csharpCode1);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(j As IEnumerable(Of Integer))
            Dim i = Enumerable.Range(1, 10)
            Dim k = [|i|].Zip(j, Function(a, b) (a, b))
            k.First()
            [|i|].First()
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Theory]
        [InlineData("MaxBy")]
        [InlineData("MinBy")]
        public async Task TestNet6AddedEnumeratedMethods(string methodName)
        {
            var csharpCode = $@"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{{
    public void Sub(IEnumerable<int> j)
    {{
        var a = [|j|].{methodName}(p => p);
        [|j|].ElementAt(10);
    }}
}}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = $@"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(j As IEnumerable(Of Integer))
            Dim a = [|j|].{methodName}(Function (p) p)
            [|j|].ElementAt(10)
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Theory]
        [InlineData("ExceptBy")]
        [InlineData("IntersectBy")]
        [InlineData("UnionBy")]
        public async Task TestNet6AddedLinqChainMethods(string methodName)
        {
            var csharpCode = $@"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{{
    public void Sub(IEnumerable<int> j, IEnumerable<int> i)
    {{
        var a = [|j|].{methodName}(i, p => p).Count();
        [|j|].ElementAt(10);
    }}
}}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = $@"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(j As IEnumerable(Of Integer), i As IEnumerable(Of Integer))
            Dim a = [|j|].{methodName}(i, Function (p) p).Count()
            [|j|].ElementAt(10)
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestDistinctBy()
        {
            var csharpCode = $@"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{{
    public void Sub(IEnumerable<int> j)
    {{
        var a = [|j|].DistinctBy(p => p).Count();
        [|j|].ElementAt(10);
    }}
}}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = $@"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(j As IEnumerable(Of Integer))
            Dim a = [|j|].DistinctBy(Function (p) p).Count()
            [|j|].ElementAt(10)
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestChunk()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable<int> j)
    {
        var a = [|j|].Chunk(1000).Count();
        [|j|].ElementAt(10);
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = $@"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(j As IEnumerable(Of Integer))
            Dim a = [|j|].Chunk(100).Count()
            [|j|].ElementAt(10)
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestTryGetNonEnumeratedCount()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable<int> j)
    {
        if (j.TryGetNonEnumeratedCount(out var count))
        {
        }
 
        j.ElementAt(10);
    }
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = $@"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(j As IEnumerable(Of Integer))
            Dim count = 0
            If j.TryGetNonEnumeratedCount(count) then
 
            End If
            j.ElementAt(10)
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Theory]
        [InlineData(true)]
        [InlineData(false)]
        [InlineData(null)]
        public async Task TestAssumeMethodEnumeratesParametersFromEditorConfig(bool? assumeMethodEnumeratesParameters)
        {
            var diagnostic = assumeMethodEnumeratesParameters == true ? "[|j|]" : "j";
 
            var csharpCode = $@"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{{
    public void Sub(IEnumerable<int> j, IEnumerable<int> i)
    {{
        {diagnostic}.UnionBy(i, p => p).ElementAt(10);
        Method({diagnostic});
    }}
 
    private void Method(IEnumerable<int> k)
    {{
        foreach (var p in k) {{ }}
    }}
}}";
            await VerifyCSharpAsync(csharpCode, assumeMethodEnumeratesParameters: assumeMethodEnumeratesParameters);
 
            var vbCode = $@"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(j As IEnumerable(Of Integer), i As IEnumerable(Of Integer))
            {diagnostic}.UnionBy(i, Function(p) p).ElementAt(10)
            Method({diagnostic})
        End Sub
 
        Private Sub Method(j As IEnumerable(Of Integer))
            For Each kk in j
            Next
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode, assumeMethodEnumeratesParameters: assumeMethodEnumeratesParameters);
        }
 
        [Theory]
        [InlineData("M:Bar.Method1*")]
        [InlineData("")]
        public async Task TestEnumerationMethodFromEditorConfig(string editorConfig)
        {
            var diagnositcReference = string.IsNullOrEmpty(editorConfig) ? "j" : "[|j|]";
            var csharpCode = $@"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{{
    public void Sub(IEnumerable<int> j, IEnumerable<int> i)
    {{
        Method1({diagnositcReference});
        {diagnositcReference}.UnionBy(i, p => p).ElementAt(10);
    }}
 
    private void Method1(IEnumerable<int> k)
    {{
    }}
}}";
            await VerifyCSharpAsync(csharpCode, customizedEnumerationMethods: editorConfig);
 
            var vbCode = $@"
Imports System.Collections.Generic
Imports System.Linq
 
Public Class Bar
    Public Sub Goo(j As IEnumerable(Of Integer), i As IEnumerable(Of Integer))
        Method1({diagnositcReference})
        {diagnositcReference}.UnionBy(i, Function(p) p).ElementAt(10)
    End Sub
 
    Private Sub Method1(j As IEnumerable(Of Integer))
    End Sub
End Class
";
            await VerifyVisualBasicAsync(vbCode, customizedEnumerationMethods: editorConfig);
        }
 
        [Theory]
        [InlineData("M:Bar.Chain*")]
        [InlineData("")]
        public async Task TestLinqChainMethodFromEditorConfig(string editorConfig)
        {
            var diagnositcReference = string.IsNullOrEmpty(editorConfig) ? "j" : "[|j|]";
            var csharpCode = $@"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{{
    public void Sub(IEnumerable<int> j, IEnumerable<int> i)
    {{
        {diagnositcReference}.UnionBy(i, p => p).ElementAt(10);
        Chain({diagnositcReference}).ElementAt(100);
    }}
 
    private IEnumerable<int> Chain(IEnumerable<int> k)
    {{
        return k;
    }}
}}";
            await VerifyCSharpAsync(csharpCode, customizedLinqChainMethods: editorConfig);
 
            var vbCode = $@"
Imports System.Collections.Generic
Imports System.Linq
 
Public Class Bar
    Public Sub Goo(j As IEnumerable(Of Integer), i As IEnumerable(Of Integer))
        {diagnositcReference}.UnionBy(i, Function(p) p).ElementAt(10)
        Chain({diagnositcReference}).ElementAt(10)
    End Sub
 
    Private Function Chain(j As IEnumerable(Of Integer)) As IEnumerable(Of Integer)
        Return j
    End Function
End Class
";
            await VerifyVisualBasicAsync(vbCode, customizedLinqChainMethods: editorConfig);
        }
 
        [Fact]
        public async Task TestGenericConstraints1()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub<T>(T t) where T : IEnumerable<int>
    {
        var x = [|t|].Select(p => p).ElementAt(10000);
        var y = [|t|].Where(p => p != 100).ElementAt(10000);
    }
 
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(Of T As R, R As V, V As IEnumerable(Of Integer))(q As T)
            Dim x = [|q|].Select(Function(p) p).ElementAt(100)
            Dim y = [|q|].Where(Function(p) p <> 100).ElementAt(100)
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestGenericConstraints2()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub<T, R, V>(T t) where T : R where R : V where V: IEnumerable<int>
    {
        var x = [|t|].Select(p => p).ElementAt(10000);
        var y = [|t|].Where(p => p != 100).ElementAt(10000);
    }
 
}";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(Of T As R, R As V, V As IEnumerable(Of Integer))(q As T)
            Dim x = [|q|].Select(Function(p) p).ElementAt(100)
            Dim y = [|q|].Where(Function(p) p <> 10).ElementAt(100)
        End Sub
    End Class
End Namespace
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Theory]
        [InlineData("M:Bar.LinqChain1*|Ex.LinqChain2*")]
        [InlineData("")]
        public async Task TestGenericConstraints3(string editorConfig)
        {
            var diagnosticReference = string.IsNullOrEmpty(editorConfig) ? "t" : "[|t|]";
            var csharpCode = $@"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{{
    public void Sub()
    {{
        var t = Enumerable.Range(1, 100).OrderBy(i => i);
        var x = LinqChain1<IEnumerable<int>, IOrderedEnumerable<int>>({diagnosticReference}).ElementAt(10000);
        var y = {diagnosticReference}.LinqChain2<IEnumerable<int>, IOrderedEnumerable<int>>().ElementAt(10000);
    }}
 
    public T LinqChain1<T, U>(U u) where U : T where T : IEnumerable<int>
    {{
        return u;
    }}
}}
 
public static class Ex
{{
    public static T LinqChain2<T, U>(this U u) where U : T where T : IEnumerable<int>
    {{
        return u;
    }}
}}
";
            await VerifyCSharpAsync(csharpCode, customizedLinqChainMethods: editorConfig);
 
            var vbCode = $@"
Imports System.Collections.Generic
Imports System.Linq
Imports System.Runtime.CompilerServices
 
Public Class Bar
    Public Sub Goo()
        Dim t = Enumerable.Range(1, 100).OrderBy(Function(i) i)
        Dim x = LinqChain1(Of IEnumerable(Of Integer), IOrderedEnumerable(Of Integer))({diagnosticReference}).ElementAt(100)
        Dim y = {diagnosticReference}.LinqChain2().ElementAt(100)
    End Sub
 
    Public Shared Function LinqChain1(Of T As IEnumerable(Of Integer), U As T)(q As U) As T
        Return q
    End Function
End Class
 
Module Ex
 
    <Extension()>
    Public Function LinqChain2(Of T As IEnumerable(Of Integer))(q As T) As T
        Return q
    End Function
End Module
";
            await VerifyVisualBasicAsync(vbCode, customizedLinqChainMethods: editorConfig);
        }
 
        [Theory]
        [InlineData("M:Bar.LinqChain1*|Ex.LinqChain2*")]
        [InlineData("")]
        public async Task TestGenericConstraints4(string editorConfig)
        {
            var diagnosticReference = string.IsNullOrEmpty(editorConfig) ? "t" : "[|t|]";
            var csharpCode = $@"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{{
    public void Sub()
    {{
        var t = Enumerable.Range(1, 100).OrderBy(i => i);
        var x = LinqChain1({diagnosticReference}).ElementAt(10000);
        var y = {diagnosticReference}.LinqChain2().ElementAt(10000);
    }}
 
    public T LinqChain1<T>(T u)
    {{
        return u;
    }}
}}
 
public static class Ex
{{
    public static T LinqChain2<T>(this T u)
    {{
        return u;
    }}
}}
";
            await VerifyCSharpAsync(csharpCode, customizedLinqChainMethods: editorConfig);
 
            var vbCode = $@"
Imports System.Collections.Generic
Imports System.Linq
Imports System.Runtime.CompilerServices
 
Public Class Bar
    Public Sub Goo()
        Dim t = Enumerable.Range(1, 100).OrderBy(Function(i) i)
        Dim x = LinqChain1({diagnosticReference}).ElementAt(100)
        Dim y = {diagnosticReference}.LinqChain2().ElementAt(100)
    End Sub
 
    Public Function LinqChain1(Of T)(q As T) As T
        Return q
    End Function
End Class
 
Module Ex
 
    <Extension()>
    Public Function LinqChain2(Of T)(q As T) As T
        Return q
    End Function
End Module
";
            await VerifyVisualBasicAsync(vbCode, customizedLinqChainMethods: editorConfig);
        }
 
        [Theory]
        [InlineData("M:Bar.LinqChain1*|Ex.LinqChain2*")]
        [InlineData("")]
        public async Task TestGenericConstraints5(string editorConfig)
        {
            var diagnosticReference1 = string.IsNullOrEmpty(editorConfig) ? "t" : "[|t|]";
            var diagnosticReference2 = string.IsNullOrEmpty(editorConfig) ? "a" : "[|a|]";
            var csharpCode = $@"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{{
    public void Sub(IEnumerable<int> a)
    {{
        var t = Enumerable.Range(1, 100).OrderBy(i => i);
        var x = LinqChain1({diagnosticReference1}, {diagnosticReference2}).ElementAt(10000);
        var y = {diagnosticReference1}.LinqChain2({diagnosticReference2}).ElementAt(10000);
    }}
 
    public T LinqChain1<T>(T u, T v)
    {{
        return u;
    }}
}}
 
public static class Ex
{{
    public static T LinqChain2<T>(this T u, T v)
    {{
        return u;
    }}
}}
";
            await VerifyCSharpAsync(csharpCode, customizedLinqChainMethods: editorConfig);
 
            var vbCode = $@"
Imports System.Collections.Generic
Imports System.Linq
Imports System.Runtime.CompilerServices
 
Public Class Bar
    Public Sub Goo(a As IEnumerable(Of Integer))
        Dim t = Enumerable.Range(1, 100).OrderBy(Function(i) i)
        Dim x = LinqChain1({diagnosticReference1}, {diagnosticReference2}).ElementAt(100)
        Dim y = {diagnosticReference1}.LinqChain2({diagnosticReference2}).ElementAt(100)
    End Sub
 
    Public Function LinqChain1(Of T)(q As T, p As T) As T
        Return q
    End Function
End Class
 
Module Ex
 
    <Extension()>
    Public Function LinqChain2(Of T)(q As T, p As T) As T
        Return q
    End Function
End Module
";
            await VerifyVisualBasicAsync(vbCode, customizedLinqChainMethods: editorConfig);
        }
 
        [Theory]
        [InlineData("M:Bar.TestMethod*")]
        [InlineData("")]
        public async Task TestGenericConstraints6(string editorConfig)
        {
            var diagnosticReference1 = string.IsNullOrEmpty(editorConfig) ? "i" : "[|i|]";
            var diagnosticReference2 = string.IsNullOrEmpty(editorConfig) ? "h" : "[|h|]";
            var csharpCode = $@"
using System;
using System.Linq;
using System.Collections.Generic;
 
public class Bar
{{
    public void Sub(IEnumerable<int> h)
    {{
        IEnumerable<int> i = Enumerable.Range(1, 10);
        TestMethod({diagnosticReference1});
        {diagnosticReference1}.First();
 
        TestMethod({diagnosticReference2});
        {diagnosticReference2}.First();
    }}
 
    public void TestMethod<T>(T o) where T : IEnumerable<int>
    {{
        var x = o;
    }}
}}";
 
            await VerifyCSharpAsync(csharpCode, customizedEnumerationMethods: editorConfig);
 
            var vbCode = $@"
Imports System.Collections.Generic
Imports System.Linq
 
Public Class Bar
    Public Sub Goo(h As IEnumerable(Of Integer))
        Dim i As IEnumerable(Of Integer) = Enumerable.Range(1, 10)
        TestMethod({diagnosticReference1})
        {diagnosticReference1}.First()
        
        TestMethod({diagnosticReference2})
        {diagnosticReference2}.First()
    End Sub
 
 
    Public Sub TestMethod(Of T As IEnumerable(Of Integer))(o As T)
    End Sub
End Class
";
            await VerifyVisualBasicAsync(vbCode, customizedEnumerationMethods: editorConfig);
        }
 
        [Fact]
        public async Task TestGenericConstraints7()
        {
            var csharpCode = @"
using System.Linq;
using System.Collections.Generic;
 
public class Bar
{
    public void Sub(IEnumerable<int> h)
    {
        IEnumerable<int> i = Enumerable.Range(1, 10);
        i.TestMethod(h);
        i.Concat(h).ElementAt(100);
    }
}
 
public static class Ex
{
    public static void TestMethod<T, U>(this T u, U v) where U : IEnumerable<int>
    {
    }
}
";
 
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
Imports System.Runtime.CompilerServices
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(h As IEnumerable(Of Integer))
            Dim i As IEnumerable(Of Integer) = Enumerable.Range(1, 10)
            i.TestMethod(h)
            i.Concat(h).ElementAt(100)
        End Sub
 
    End Class
End Namespace
 
Module Ex
 
    <Extension()>
    Public Sub TestMethod(Of T, U As IEnumerable(Of Integer))(o As T, o2 As U)
    End Sub
End Module
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestGenericConstraints8()
        {
            var csharpCode = @"
using System.Linq;
using System.Collections.Generic;
 
public class Bar
{
    public void Sub(IEnumerable<int> h)
    {
        IEnumerable<int> i = Enumerable.Range(1, 10);
        i.TestMethod(h);
        i.Concat(h).ElementAt(100);
    }
}
 
public static class Ex
{
    public static void TestMethod<T, U>(this T u, U v) where T : IEnumerable<int>
    {
    }
}
";
 
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
Imports System.Runtime.CompilerServices
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(h As IEnumerable(Of Integer))
            Dim i As IEnumerable(Of Integer) = Enumerable.Range(1, 10)
            i.TestMethod(h)
            i.Concat(h).ElementAt(100)
        End Sub
 
    End Class
End Namespace
 
Module Ex
 
    <Extension()>
    Public Sub TestMethod(Of U, T As IEnumerable(Of Integer))(o As T, o2 As U)
    End Sub
End Module
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Theory]
        [InlineData("HashSet")]
        [InlineData("LinkedList")]
        [InlineData("List")]
        [InlineData("Queue")]
        [InlineData("SortedSet")]
        [InlineData("Stack")]
        public async Task TestObjectCreationOperation1(string typeName)
        {
            var csharpCode = $@"
using System.Linq;
using System.Collections.Generic;
 
public class Bar
{{
    public void Sub<T>(IEnumerable<int> collection1, IEnumerable<T> collection2)
    {{
        var s = new {typeName}<int>([|collection1|]);
        var result = [|collection1|].Count();
    }}
}}
";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = $@"
Imports System.Collections.Generic
Imports System.Linq
 
Module Program
    Sub Bar(Of T)(collection1 As IEnumerable(Of T))
        Dim x = New {typeName}(Of T)([|collection1|])
        Dim z = [|collection1|].Count()
    End Sub
End Module
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestObjectCreationOperation2()
        {
            var csharpCode = @"
using System.Linq;
using System.Collections.Generic;
 
public class Bar
{
    public void Sub<T>(IEnumerable<KeyValuePair<int, int>> collection1)
    {
        var s = new Dictionary<int, int>([|collection1|]);
        var result = [|collection1|].Count();
    }
}
";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = $@"
Imports System.Collections.Generic
Imports System.Linq
 
Module Program
    Sub Bar(Of T)(collection1 As IEnumerable(Of KeyValuePair(Of Integer, Integer)))
        Dim x = New Dictionary(Of Integer, Integer)([|collection1|])
        Dim z = [|collection1|].Count()
    End Sub
End Module
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Fact]
        public async Task TestObjectCreationOperation3()
        {
            var csharpCode = @"
using System.Linq;
using System.Collections.Generic;
 
public class Bar
{
    public void Sub<T>(IEnumerable<(int, int)> collection1)
    {
        var s = new PriorityQueue<int, int>([|collection1|]);
        var result = [|collection1|].Count();
    }
}
";
            await VerifyCSharpAsync(csharpCode);
 
            var vbCode = $@"
Imports System.Collections.Generic
Imports System.Linq
 
Module Program
    Sub Bar(Of T)(collection1 As IEnumerable(Of (A As Integer, B As Integer)))
        Dim x = New PriorityQueue(Of Integer, Integer)([|collection1|])
        Dim z = [|collection1|].Count()
    End Sub
End Module
";
            await VerifyVisualBasicAsync(vbCode);
        }
 
        [Theory]
        [InlineData("M:Bar.LinqChain1*|Ex.LinqChain2*")]
        [InlineData("")]
        public async Task TestLinqChainEnumeratedTheArgument(string editorConfig)
        {
            var diagnosticReference1 = string.IsNullOrEmpty(editorConfig) ? "t" : "[|t|]";
            var diagnosticReference2 = string.IsNullOrEmpty(editorConfig) ? "a" : "[|a|]";
            var csharpCode = $@"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{{
    public void Sub(IEnumerable<int> a)
    {{
        var t = Enumerable.Range(1, 100).OrderBy(i => i);
        var x = LinqChain1({diagnosticReference1}, {diagnosticReference2});
        var y = {diagnosticReference1}.LinqChain2({diagnosticReference2});
    }}
 
    public T LinqChain1<T>(T u, T v)
    {{
        return u;
    }}
}}
 
public static class Ex
{{
    public static T LinqChain2<T>(this T u, T v)
    {{
        return u;
    }}
}}
";
            await VerifyCSharpAsync(csharpCode,
                customizedEnumerationMethods: editorConfig,
                customizedLinqChainMethods: editorConfig);
 
            var vbCode = $@"
Imports System.Collections.Generic
Imports System.Linq
Imports System.Runtime.CompilerServices
 
Public Class Bar
    Public Sub Goo(a As IEnumerable(Of Integer))
        Dim t = Enumerable.Range(1, 100).OrderBy(Function(i) i)
        Dim x = LinqChain1({diagnosticReference1}, {diagnosticReference2})
        Dim y = {diagnosticReference1}.LinqChain2({diagnosticReference2})
    End Sub
 
    Public Function LinqChain1(Of T)(q As T, p As T) As T
        Return q
    End Function
End Class
 
Module Ex
 
    <Extension()>
    Public Function LinqChain2(Of T)(q As T, p As T) As T
        Return q
    End Function
End Module
";
            await VerifyVisualBasicAsync(vbCode,
                customizedEnumerationMethods: editorConfig,
                customizedLinqChainMethods: editorConfig);
        }
 
        [Fact]
        public async Task TestDomainMerge()
        {
            var csharpCode1 = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable<int> collection1, IEnumerable<int> collection2, IEnumerable<int> collection3)
    {
        var d = collection2.Count();
        foreach (var i in collection1)
        {
            [|collection3|].Count();
        }
    }
}";
            await VerifyCS.VerifyAnalyzerAsync(csharpCode1);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(collection1 As IEnumerable(Of Integer), collection2 As IEnumerable(Of Integer), collection3 As IEnumerable(Of Integer))
            Dim d = collection2.Count()
            For Each i In collection1
                [|collection3|].Count()
            Next
        End Sub
    End Class
End Namespace
";
            await VerifyVB.VerifyAnalyzerAsync(vbCode);
        }
 
        [Fact]
        public async Task TestValueReset1()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub()
    {
        for (int i = 0; i < 100; i++)
        {
            var x = Create();
            var d = x.ElementAt(10);
        }
    }
 
    private IEnumerable<int> Create() => Enumerable.Range(1, 10);
}";
            await VerifyCS.VerifyAnalyzerAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo()
            For i As Integer = 1 To 100
                Dim x = Create()
                Dim d = x.ElementAt(10)
            Next
        End Sub
 
        Private Function Create() As IEnumerable(Of Integer)
            Return Enumerable.Range(1, 10)
        End Function
    End Class
End Namespace
";
            await VerifyVB.VerifyAnalyzerAsync(vbCode);
        }
 
        [Fact]
        public async Task TestValueReset2()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub()
    {
        var x = Create();
        for (int i = 0; i < 100; i++)
        {
            var a = Create();
            var y = x;
            var d = [|y|].ElementAt(10);
        }
    }
 
    private IEnumerable<int> Create() => Enumerable.Range(1, 10);
}";
            await VerifyCS.VerifyAnalyzerAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo()
            Dim x = Create()
            For i As Integer = 1 To 100
                Dim a = Create()
                Dim y = x
                Dim d = [|y|].ElementAt(10)
            Next
        End Sub
 
        Private Function Create() As IEnumerable(Of Integer)
            Return Enumerable.Range(1, 10)
        End Function
    End Class
End Namespace
";
            await VerifyVB.VerifyAnalyzerAsync(vbCode);
        }
 
        [Fact]
        public async Task TestValueReset3()
        {
            var csharpCode = @"
using System.Collections.Generic;
using System.Linq;
 
public class Bar
{
    public void Sub(IEnumerable<int> n)
    {
        for (int i = 0; i < 100; i++)
        {
            var x = Create().Concat([|n|]);
            var d = x.ElementAt(10);
        }
    }
 
    private IEnumerable<int> Create() => Enumerable.Range(1, 10);
}";
            await VerifyCS.VerifyAnalyzerAsync(csharpCode);
 
            var vbCode = @"
Imports System.Collections.Generic
Imports System.Linq
 
Namespace Ns
    Public Class Hoo
        Public Sub Goo(n As IEnumerable(Of Integer))
            For i As Integer = 1 To 100
                Dim x = Create().Concat([|n|])
                Dim d = x.ElementAt(10)
            Next
        End Sub
 
        Private Function Create() As IEnumerable(Of Integer)
            Return Enumerable.Range(1, 10)
        End Function
    End Class
End Namespace
";
            await VerifyVB.VerifyAnalyzerAsync(vbCode);
        }
    }
}