在开发定制的独立代码分析以帮助开发人员根据VS中的最佳实践编写C#代码时,我们正在使用Roslyn及其功能。
我们的要求之一是有些棘手,我们需要解析和编译存在以下问题的方法:
var myVariable = SomeExpression...;
return myVariable;
这意味着如果定义了一个变量,然后立即返回并且不再使用它,则[GCop] [1]应该警告开发人员,并说不需要声明变量。
protected override void Analyze(SyntaxNodeAnalysisContext context)
{
NodeToAnalyze = context.Node;
var varDeclareSyntax = (LocalDeclarationStatementSyntax)NodeToAnalyze;
if (varDeclareSyntax == null) return;
var variableDeclare = varDeclareSyntax.ChildNodes().OfType<VariableDeclarationSyntax>().FirstOrDefault();
if (variableDeclare == null) return;
var varDeclarator = variableDeclare.ChildNodes().OfType<VariableDeclaratorSyntax>().FirstOrDefault();
if (varDeclarator == null) return;
var identifierToken = varDeclarator.Identifier.Text;
var method = varDeclarator.GetSingleAncestor<MethodDeclarationSyntax>();
var varDeclaratorIndex = method.DescendantNodes().OfType<CSharpSyntaxNode>().IndexOf(varDeclarator);
/// ??????? TO DO :
现在我们可以访问节点=>(
var item = 10;
)问题是我们如何才能访问下一行
return item;
我已经找到了myVariable Syntax节点及其值,但我不知道我们如何才能很好地找到Identider返回值
最佳答案
LocalDeclarationStatement包含在更大的语法节点中,并且是ReturnStatementSyntax.
的同级元素。您的分析实际上不应该从LocalDeclarationStatement开始-从BlockSyntax或其他内容开始,然后从中查找声明并从中返回。
尝试此操作的另一种方法是先开始查找ReturnStatementSyntax,一旦看到它是一个简单变量的返回,则可以调用SemanticModel.GetSymbolInfo()来查找符号,然后从该符号转到定义该符号的语法。然后,您可以从那里查看它们是否并排放置。