在开发定制的独立代码分析以帮助开发人员根据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;

c# - 我怎样才能在罗斯林退货?-LMLPHP

我已经找到了myVariable Syntax节点及其值,但我不知道我们如何才能很好地找到Identider返回值

最佳答案

LocalDeclarationStatement包含在更大的语法节点中,并且是ReturnStatementSyntax.的同级元素。您的分析实际上不应该从LocalDeclarationStatement开始-从BlockSyntax或其他内容开始,然后从中查找声明并从中返回。

尝试此操作的另一种方法是先开始查找ReturnStatementSyntax,一旦看到它是一个简单变量的返回,则可以调用SemanticModel.GetSymbolInfo()来查找符号,然后从该符号转到定义该符号的语法。然后,您可以从那里查看它们是否并排放置。

10-06 13:38