gpt4 book ai didi

c# - 如何使用 Roslyn 评估局部变量/参数状态

转载 作者:太空宇宙 更新时间:2023-11-03 17:20:02 25 4
gpt4 key购买 nike

我的情况有点复杂。我必须为仅分配参数但从未使用过或从未使用过局部变量等情况创建分析器/代码修复提供程序。

对于参数情况,我去方法声明和查看参数列表以获取所有分析器。我在方法中遍历赋值表达式,并过滤使用辅助方法赋值的参数。

它变得模糊的地方是我不知道或不知道何时使用或不使用局部变量/参数。我已经查看了符号,但它们无法告诉我使用/未使用的变量。我可以尝试通过在字符串中转换方法声明语法上下文并查找分配的参数来查找方法中变量名称被提及的次数,但这只是一个糟糕的想法。

我真的被困住了,我会从任何以前有过这种情况的人那里得到一些帮助。

对于可能会问的人,我主要是在寻找分析器缺失的逻辑。我不知道代码修复提供程序将如何工作。如果您知道我能做什么,请随时将其包含在您的回答中!截至目前,我认为可以从方法中删除未使用的局部变量,同样可以删除未使用的参数。我现在不确定。

更新

我现在正在尝试使用 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 或结果(来自最早的答案)时,我收到以下消息:

System.ArgumentOutRangeException Index was out of range Must be non negative and lesser than the size of the collection"

但在此之前,在我的分析器中,当我尝试验证我的节点以确保它不为空并为数据流 API 创建适当的元素时,没有代码中断(不确定这是否是适当的术语)但是在我无法进步的那一刻。

最佳答案

您可以通过 DataFlowAnalysis API 查看大多数变量是否被使用(读/写)。我在 my blog 上写了这个 API 的介绍。 .

我相信你的情况,你正在寻找从未被读取的变量。

var tree = CSharpSyntaxTree.ParseText(@"
public class Sample
{
public void Foo()
{
int unused = 0;
int used = 1;
System.Console.Write(used);
}
}");

var Mscorlib = PortableExecutableReference.CreateFromAssembly(typeof(object).Assembly);
var compilation = CSharpCompilation.Create("MyCompilation",
syntaxTrees: new[] { tree }, references: new[] { Mscorlib });
var model = compilation.GetSemanticModel(tree);

var methodBody = tree.GetRoot().DescendantNodes().OfType<MethodDeclarationSyntax>().Single().Body;
DataFlowAnalysis result = model.AnalyzeDataFlow(methodBody);

var variablesDeclared = result.VariablesDeclared;
var variablesRead = result.ReadInside.Union(result.ReadOutside);

var unused = variablesDeclared.Except(variablesRead);

foreach(var variable in unused)
{
Console.WriteLine(variable);
}

关于c# - 如何使用 Roslyn 评估局部变量/参数状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30982549/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com