【问题标题】:Roslyn : How to get unresolved typesRoslyn:如何获得未解析的类型
【发布时间】:2023-03-22 12:30:01
【问题描述】:

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

在 c# 代码文档中获取未解析类型的最优雅方法是什么?例如。类型 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 是否正确?

还有GetSymbolInfoGetTypeInfo有什么区别,我觉得它们都非常相似。

【问题讨论】:

    标签: roslyn


    【解决方案1】:

    这里有几个问题。

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

    问:使用GetSymbolInfo并检查null是否正确?
    A: 是的,在这里检查是正确的。

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

    【讨论】:

    • var x = Console(); 这样的东西是不可编译的,所以检查这样的代码的正确性是可以的,对吧?如果没有,应该避免哪些SimpleNameSyntax 元素?
    猜你喜欢
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    相关资源
    最近更新 更多