Roslyn检查是否已分配现场声明

时间:2017-05-23 18:27:24

标签: c# roslyn

我正在编写一个应用程序,用于转换密钥以使用RESX文件中的资源。此代码在使用之前使用局部变量:

public static void AnalyzeConstDeclaration(SyntaxNodeAnalysisContext context)
{
    var fieldDeclaration = (FieldDeclarationSyntax)context.Node;

    if (false == IsValidFieldDeclaration(context, fieldDeclaration))
    {
        return;
    }

    var firstVariable = fieldDeclaration.Declaration.Variables.FirstOrDefault();
    var dataFlowAnalysis = context.SemanticModel.AnalyzeDataFlow(firstVariable);

    var variableSymbol = context.SemanticModel.GetDeclaredSymbol(firstVariable);
    if (dataFlowAnalysis.WrittenOutside.Contains(variableSymbol))
    {
        return;
    }


    var firstSymbol = context.SemanticModel.GetDeclaredSymbol(firstVariable);

    context.ReportDiagnostic(Diagnostic.Create(Rule, context.Node.GetLocation(), firstSymbol.Name));
}

但是当我尝试获取dataFlowAnalysis时收到错误:

  

其他信息:statementOrExpression不是StatementSyntax或ExpressionSyntax。

理想情况下,只需要查看是否有人在声明之外写了这个变量。

1 个答案:

答案 0 :(得分:3)

DataFlow通过分析单个方法中的执行顺序来工作 它对于类级字段没有意义。

相反,您应该使用简单的语法访问者(或SymbolFinder)来搜索整个班级,以便对该字段进行分配。

您可能还想检查它是否作为ref参数传递。