File: Symbols\Source\LocalTests.cs
Web Access
Project: src\src\Compilers\CSharp\Test\Symbol\Microsoft.CodeAnalysis.CSharp.Symbol.UnitTests.csproj (Microsoft.CodeAnalysis.CSharp.Symbol.UnitTests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
using System.Linq;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.VisualBasic;
using Roslyn.Test.Utilities;
using Xunit;
 
namespace Microsoft.CodeAnalysis.CSharp.UnitTests;
 
public class LocalTests : SemanticModelTestBase
{
    [WorkItem(59709, "https://github.com/dotnet/roslyn/issues/59709")]
    [Fact]
    public void ForEach()
    {
        var sourceCode = @"
class C
{
    void M()
    {
        var a = new int[] { 1, 2, 3 };
        foreach (var x in a)
        {
            var y = /*<bind>*/x/*</bind>*/;
        }
    }
}
";
        var compilation = CreateCompilation(sourceCode);
        var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(compilation);
 
        var symbol = (ILocalSymbol)semanticInfo.Symbol;
        Assert.False(symbol.IsUsing);
        Assert.True(symbol.IsForEach);
        Assert.False(symbol.IsForEach()); // VB extension method works only for VB locals
    }
 
    [WorkItem(59709, "https://github.com/dotnet/roslyn/issues/59709")]
    [Fact]
    public void ForEachVisualBasic()
    {
        var sourceCode = @"
Module M1
    Class C
        Sub S() As Object
            Dim a() As Integer = {1, 2, 3}
            For Each x As Integer In a
                Dim y = x
            Next
        End Sub
    End Class
End Module
";
        var compilation = CreateVisualBasicCompilation(sourceCode);
        var tree = compilation.SyntaxTrees[0];
        var expressionSyntax = tree.GetRoot().DescendantNodes().
            OfType<VisualBasic.Syntax.IdentifierNameSyntax>().Last();
        Assert.Equal("x", expressionSyntax.ToString());
        var model = compilation.GetSemanticModel(tree);
        var local = (ILocalSymbol)model.GetSymbolInfo(expressionSyntax).Symbol!;
        Assert.False(local.IsUsing);
        Assert.True(local.IsForEach);
        Assert.True(local.IsForEach());
    }
 
    [WorkItem(59709, "https://github.com/dotnet/roslyn/issues/59709")]
    [Fact]
    public void ForEachAwait()
    {
        var sourceCode = @"
class C
{
    void M()
    {
        var a = new int[] { 1, 2, 3 };
        await foreach (var x in a)
        {
            var y = /*<bind>*/x/*</bind>*/;
        }
    }
}
";
        var compilation = CreateCompilation(sourceCode);
        var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(compilation);
 
        var symbol = (ILocalSymbol)semanticInfo.Symbol;
        Assert.False(symbol.IsUsing);
        Assert.True(symbol.IsForEach);
    }
 
    [WorkItem(59709, "https://github.com/dotnet/roslyn/issues/59709")]
    [Fact]
    public void UsingBlock()
    {
        var sourceCode = @"
using System.IO;
class C
{
    void M()
    {
        using (var x = new StreamReader(""""))
        {
            /*<bind>*/x/*</bind>*/.Read();
        }
    }
}
";
        var compilation = CreateCompilation(sourceCode);
        var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(compilation);
 
        var symbol = (ILocalSymbol)semanticInfo.Symbol;
        Assert.False(symbol.IsForEach);
        Assert.True(symbol.IsUsing);
    }
 
    [WorkItem(59709, "https://github.com/dotnet/roslyn/issues/59709")]
    [Fact]
    public void UsingBlockAwait()
    {
        var sourceCode = @"
using System.IO;
class C
{
    void M()
    {
        await using (var x = new StreamReader(""""))
        {
            /*<bind>*/x/*</bind>*/.Read();
        }
    }
}
";
        var compilation = CreateCompilation(sourceCode);
        var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(compilation);
 
        var symbol = (ILocalSymbol)semanticInfo.Symbol;
        Assert.False(symbol.IsForEach);
        Assert.True(symbol.IsUsing);
    }
 
    [WorkItem(59709, "https://github.com/dotnet/roslyn/issues/59709")]
    [Fact]
    public void UsingDeclaration()
    {
        var sourceCode = @"
using System.IO;
class C
{
    void M()
    {
        using var x = new StreamReader("""");
        /*<bind>*/x/*</bind>*/.Read();
    }
}
";
        var compilation = CreateCompilation(sourceCode);
        var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(compilation);
 
        var symbol = (ILocalSymbol)semanticInfo.Symbol;
        Assert.False(symbol.IsForEach);
        Assert.True(symbol.IsUsing);
    }
}