【发布时间】:2015-08-12 10:27:08
【问题描述】:
我的情况有点复杂。我必须为诸如仅分配但从未使用过的参数或从未使用过的局部变量等情况创建分析器/代码修复提供程序。
对于参数的情况,我要进行方法声明并查看参数列表以获取所有分析器。我正在检查方法中的赋值表达式,并过滤使用辅助方法分配的参数。
它变得模糊的地方是我不知道或不知道何时使用局部变量/参数。我已经浏览了符号,但他们无法告诉我使用/未使用的变量。我可以尝试通过在字符串中转换方法声明语法上下文并查找已分配的参数来查找在方法中提及变量名称的次数,但这只是一个糟糕的主意。
我真的被困住了,我希望任何有过这种情况经历的人为此提供一些帮助。
对于可能会问的人,我主要是在寻找分析器缺少的逻辑。我不知道代码修复提供程序将如何工作。如果您知道我能做什么,请随时将其包含在您的答案中!到目前为止,我认为可以从方法中删除未使用的局部变量,对于未使用的参数也是如此。我现在不确定。
更新
我现在正在尝试使用 DataFlow API,但目前它不适合我。这个线程最古老的答案给了我一个起点,但它实际上不起作用。
我想出了自己的方法:
private static bool IsLocalVariableBeingUsed(VariableDeclaratorSyntax variableDeclarator, SyntaxNodeAnalysisContext syntaxNode)
{
var model = syntaxNode.SemanticModel.Compilation.GetSemanticModel(variableDeclarator.SyntaxTree);
var methodBody = variableDeclarator.AncestorsAndSelf(false).OfType<MethodDeclarationSyntax>().First();
var lastMethodNode = methodBody?.ChildNodes().LastOrDefault();
if (lastMethodNode == null)
return false;
var readWrite = syntaxNode.SemanticModel.AnalyzeDataFlow(variableDeclarator, lastMethodNode);
}
但这也行不通。使用 NUnit 进行测试时:
var input = @"
class TestClass {
void TestMethod ()
{
int i;
}
}";
当运行时到达 readWrite 或 result(来自最旧的答案)时,我收到以下消息:
System.ArgumentOutRangeException Index was out of range Must be non negative and lesser than the size of the collection"
但在此之前,在我的分析器中,当我尝试验证我的节点以确保它不为空并为数据流 API 创建适当的元素时,没有代码中断(不确定这是否是适当的术语)但在我无法进步的那一刻。
【问题讨论】:
-
我真的不明白?应该使用 Analyzeflow 吗?这会带我去哪里?
-
你能写出这两种情况的代码示例吗?我只是想确定我明白我在做什么,因为我现在迷路了!
-
@SLaks 你能给我一些见解吗?我刚刚更新了我的帖子,我需要帮助! :-)