c# - 用于字符串比较的 Roslyn Analyzer
问题描述
我想编写一个用于字符串比较的 roslyn 分析器。这些情况是: s1 可以是一个字符串。所以如果 s1.equals(s2) 或 s1 == s2; 它应该修复为 string.equals(s1,s2,Stringcomparsion.Ordinal)
我对树有了基本的了解,还需要创建一个 Analyzer 文件和一个 CodeFixProvider 类。
所以我试图获取例如语法树。s1.等于(s2)。
现在为了编写分析代码方法,我不知道如何验证 s1 是否为字符串。所以我在这里需要帮助。
我正在尝试关注这篇文章,https://www.meziantou.net/writing-a-roslyn-analyzer.htm。
例如。
Class{
string s1 = "one";
string s2 = "two";
bool res = one.equals(two);
}
应该重构为:
Class{
string s1 = "one";
string s2 = "two";
bool res = string.equals(one,two, StringComparsion.Ordinal);
}
解决方案
您可以检查规则 MA0006 的实现:GitHub
您还可以查看我关于其他字符串分析器的字符串比较的帖子:https ://www.meziantou.net/string-comparisons-are-harder-than-it-seems.htm#getting-warnings-in
[DiagnosticAnalyzer(LanguageNames.CSharp)]
public sealed class UseStringEqualsAnalyzer : DiagnosticAnalyzer
{
public override void Initialize(AnalysisContext context)
{
context.EnableConcurrentExecution();
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
context.RegisterOperationAction(AnalyzeInvocation, OperationKind.BinaryOperator);
}
private static void AnalyzeInvocation(OperationAnalysisContext context)
{
var operation = (IBinaryOperation)context.Operation;
if (operation.OperatorKind == BinaryOperatorKind.Equals ||
operation.OperatorKind == BinaryOperatorKind.NotEquals)
{
if (operation.LeftOperand.Type.IsString() && operation.RightOperand.Type.IsString())
{
if (IsNull(operation.LeftOperand) || IsNull(operation.RightOperand))
return;
// EntityFramework Core doesn't support StringComparison and evaluates everything client side...
// https://github.com/aspnet/EntityFrameworkCore/issues/1222
if (operation.IsInExpressionArgument())
return;
context.ReportDiagnostic(s_rule, operation, $"{operation.OperatorKind} operator");
}
}
}
private static bool IsNull(IOperation operation)
{
return operation.ConstantValue.HasValue && operation.ConstantValue.Value == null;
}
}
推荐阅读
- java - 如何将 Room 实体的 ArrayList 传递给另一个活动?(安卓室)
- macos - x86 组装;覆盖.bss 值?
- powershell - 通过 Jenkins 运行 powershell 脚本时出现此错误:“NativeCommandError”不确定如何使用调用命令
- r - 是否有一个 R 函数可以从 Github 存储库一次读取多个 CSV?
- html - 为什么我的链接没有居中?(在菜单栏中)
- go - 了解如何构建 Go 源代码
- scala - org.apache.spark.sql.AnalysisException:必须使用 writeStream.start() kafka 执行带有流源的查询
- sql - 我们如何优化同一张表上的 NOT IN 子查询?
- python - 循环而不结束流
- android - 在 Android Studio 4.1 中扫描文件以索引永远不会结束