2017-05-23 17 views
1

に割り当てられている場合のRoslynチェック私は、キーをRESXファイルからリソースを使用するように変換するアプリケーションを作成しています。このコードは、前のローカル変数で働いていた:私はdataFlowAnalysisを取得しようとすると、フィールド宣言が

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)); 
} 

は、しかし、私はエラーが表示されます。

Additional information: statementOrExpression is not a StatementSyntax or an ExpressionSyntax.

はどのように理想的には誰もがこの変数に書かれているかどうかを確認する必要がありますすることができます宣言の外側にある。

答えて

2

DataFlowは、単一のメソッド内で実行順序を分析することによって機能します。
クラスレベルのフィールドには意味がありません。

代わりに、単純な構文ビジター(またはSymbolFinder)を使用して、クラス全体を検索してフィールドへの割り当てを行う必要があります。

refパラメータとして渡されたかどうかを確認することもできます。