Roslyn 检查字段声明是否已分配给
Roslyn Check If Field Declaration has been assigned to
我正在编写一个将密钥转换为使用来自 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 时,我收到一个错误:
Additional information: statementOrExpression is not a StatementSyntax or an ExpressionSyntax.
理想情况下,如何只需要查看是否有人在声明之外写入了该变量。
DataFlow 通过分析单个方法中的执行顺序来工作。
对于 class 级字段没有意义。
相反,您应该使用简单的语法访问者(或 SymbolFinder
)来搜索整个 class 以查找字段的分配。
您可能还想检查它是否曾作为 ref
参数传递。
我正在编写一个将密钥转换为使用来自 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 时,我收到一个错误:
Additional information: statementOrExpression is not a StatementSyntax or an ExpressionSyntax.
理想情况下,如何只需要查看是否有人在声明之外写入了该变量。
DataFlow 通过分析单个方法中的执行顺序来工作。
对于 class 级字段没有意义。
相反,您应该使用简单的语法访问者(或 SymbolFinder
)来搜索整个 class 以查找字段的分配。
您可能还想检查它是否曾作为 ref
参数传递。