罗斯林:如何获得未解决的类型

时间:2012-12-12 06:17:41

标签: roslyn

我正在使用Roslyn的2012年9月CTP。

在c#代码文档中获取未解析类型的最优雅方法是什么?例如。 Type Guid需要System命名空间。目前我有这样的事情:

            var semanticModel = (SemanticModel)document.GetSemanticModel();
            var tree = (SyntaxTree)document.GetSyntaxTree();

            //get unresolved types
            var unresolvedTypes = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>()
                .Where(x => semanticModel.GetSymbolInfo(x).Symbol == null);

使用IdentifierNameSyntax和GetSymbolInfo是否正确?

GetSymbolInfo GetTypeInfo 之间有什么区别,它们看起来与我非常相似。

1 个答案:

答案 0 :(得分:8)

这里有几个问题。

问:使用IdentifierNameSyntax是否正确? 答:您可能希望使用SimpleNameSyntax来处理解析泛型类型。此外,您可能不希望查看所有SimpleNameSyntax元素。对于实际上不在类型上下文中的事物,您将得到误报(例如,想象一些代码,如var x = Console();

问:使用GetSymbolInfo并检查是否正确? 答:是的,这是在这里检查的正确方法。

问:GetSymbolInfoGetTypeInfo之间的区别是什么? 答:对于表示类型名称的语法,没有区别。但是,对于任意表达式GetSymbolInfo表示表达式的特定符号(例如,方法调用,索引器访问,数组访问,重载运算符等),GetTypeInfo表示结果类型(以便您如果要为表达式添加声明,则会知道要生成什么类型​​。例如,InvocationExpressionSyntax为“myString.GetHashCode()”。 GetSymbolInfo将返回GetHashCode()的方法符号,而GetTypeInfo将返回System.Int32