2014-12-17 1 views
2

Я пытаюсь получить информацию типа из объекта ObjectCreationExpressionSyntax, но не удалось.SemanticModel.GetTypeInfo() для ObjectCreationExpressionSyntax.Type возвращает null

Вот пример того, что воспроизвести проблему (см "ti.Type является нулем" в коде):

using Microsoft.CodeAnalysis; 
using Microsoft.CodeAnalysis.CSharp; 
using Microsoft.CodeAnalysis.CSharp.Syntax; 
using Microsoft.CodeAnalysis.MSBuild; 

namespace RoslynExample 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string solutionPath = @"..\..\..\RoslynExample.sln"; 
      MSBuildWorkspace workspace = MSBuildWorkspace.Create(); 
      Solution solution = workspace.OpenSolutionAsync(solutionPath).Result; 

      foreach (var project in solution.Projects) 
      { 
       if (project.Name == "RoslynBugProject") 
       { 
        foreach (var document in project.Documents) 
        { 
         var compilationUnit = document.GetSyntaxRootAsync().Result; 
         var semanticModel = document.GetSemanticModelAsync().Result; 
         new MyWalker(semanticModel).Visit(compilationUnit); 
        } 
       } 
      } 
     } 
    } 

    partial class MyWalker : CSharpSyntaxWalker 
    { 
     private SemanticModel _semanticModel; 
     public MyWalker(SemanticModel semanticModel) 
     { 
      _semanticModel = semanticModel; 
     } 

     public override void VisitObjectCreationExpression(ObjectCreationExpressionSyntax node) 
     { 
      var ti = _semanticModel.GetTypeInfo(node.Type); **<--- ti.Type is null** 
      base.VisitObjectCreationExpression(node); 
     } 
    } 
} 

проект "RoslynBugProject":

namespace RoslynBugProject 
{ 
    internal class Query 
    { 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var query = new Query(); 
     } 
    } 
} 

Как получить тип информации? Предыдущая версия Roslyn возвращает не пустое значение.

ответ

5

Вы можете установить Roslyn Syntax Visualizer, который покажет вам дерево синтаксиса, а также позволит вам изучить API-интерфейс SemanticModel.

При этом установлено, вы можете попробовать щелкнуть правой кнопкой мыши на узлах и просят символа типа:

enter image description here

В этом случае, вы откроете для себя несколько вещей:

  • Если вы используете «View TypeSymbol (если есть)», вы можете получить символ от самого ObjectCreationExpression, но не от какого-либо из его дочерних элементов («Идентификационное имя» или «АргументList»), поэтому это можно устранить, передав node в GetTypeInfo вместо от node.Type.
  • При использовании «View Symbol (если таковые имеются)», вы можете получить символ из «ИмяИдентификатора», но не из ObjectCreationExpression, так что вы могли бы также исправить код, передав node.Type в GetSymbolInfo вместо GetTypeInfo.
+0

Привет, Дэвид, спасибо за ответ. И спасибо за ссылку на Visualizer. Вы очень мне помогаете. –

+0

Но почему Roslyn не возвращает информацию о типе для TypeSyntax? TypeSyntax широко используется в узлах синтаксиса. И для меня это выглядит немного странно, почему я не могу получить информацию о типе из синтаксиса типа. –

+1

Да, извините, мне следовало быть более основательным. Вы можете использовать GetSymbolInfo вместо GetTypeInfo, когда у вас есть TypeSyntax. Ответ обновлен, чтобы объяснить оба варианта. –