How to get TypeInfo from SemanticModel for MemberAccessExpressionSyntax from lambda expression?

Viewed 89

For example I have the code:

using System.Linq;

namespace MyNamespace
{
    class Person
    {
        public string Name { get; set; }
    }
    
    class Program
    {
        static void Main()
        {
            string name = new Person().Name; // SemanticModel.GetTypeInfo() returns string. It's OK.
            string[] names = new Person[] { new Person() }.Select(p => p.Name).ToArray(); // SemanticModel.GetTypeInfo() returns ErrorTypeSymbol.
                     names = new Person[] { new Person() }.Select(Person p => p.Name).ToArray(); // SemanticModel.GetTypeInfo() returns string. It's OK.
        }
    }
}

I want to get TypeInfo for p.Name from lambda expression of LINQ Select extension. I'm writing in my Roslyn analyzer:

syntaxTree.GetRoot().DescendantNodes().OfType<MemberAccessExpressionSyntax>().ToArray();

And I got:

[0] = {MemberAccessExpressionSyntax} new Person().Name
[1] = {MemberAccessExpressionSyntax} new Person[] { new Person() }.Select(p => p.Name).ToArray
[2] = {MemberAccessExpressionSyntax} new Person[] { new Person() }.Select
[3] = {MemberAccessExpressionSyntax} p.Name

Then I'm trying to get TypeInfo for the first MemberAccessExpressionSyntax new Person().Name:

context.Compilation.GetSemanticModel(syntaxTree).GetTypeInfo(syntaxTree.GetRoot().DescendantNodes().OfType<MemberAccessExpressionSyntax>().ToArray()[0]).Type.Name

It returns String. It's OK.

But when I'm trying to get type of MemberAccessExpression from lambda expression Select(p => p.Name):

context.Compilation.GetSemanticModel(syntaxTree).GetTypeInfo(syntaxTree.GetRoot().DescendantNodes().OfType<MemberAccessExpressionSyntax>().ToArray()[3]).Type.Name

It returns empty string.

How to get TypeInfo from SemanticModel for MemberAccessExpressionSyntax from lambda expression without explicit type declaration?

0 Answers
Related