我需要实现一个Roslyn分析器和CodeFixProvider来替换属性和参数中声明的类型。例如,我有一个声明,比如
public IReadOnlyCollection<string> Collection { get; }我需要把它换成
public IReadOnlyList<string> Collection { get; }问:使用DiagnosticAnalyzer的后代类在源代码中查找此类位置的最佳方式是什么?有许多方法,例如:
RegisterSyntaxNodeAction()
RegisterSymbolAction()
RegisterSyntaxTreeAction()从哪里开始会更好呢?如果可能的话,也能找到一些例子,那就太好了。
发布于 2020-07-03 17:06:28
最后,我设法以这种方式实现它:
public override void Initialize(AnalysisContext context)
{
context.EnableConcurrentExecution();
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.Analyze | GeneratedCodeAnalysisFlags.ReportDiagnostics);
context.RegisterSyntaxNodeAction(
AnalyzeNode,
SyntaxKind.PropertyDeclaration,
SyntaxKind.FieldDeclaration,
SyntaxKind.Parameter);
}
private void AnalyzeNode(SyntaxNodeAnalysisContext context)
{
var type = context.Node switch
{
PropertyDeclarationSyntax p => p.Type,
FieldDeclarationSyntax p => p.Declaration.Type,
ParameterSyntax p => p.Type,
_ => null
};
if (type is null)
return;
if (!(type is GenericNameSyntax))
return;
if (type.GetFirstToken().ToString() == "IReadOnlyCollection")
{
var diagnostic = Diagnostic.Create(Rule, type.GetLocation());
context.ReportDiagnostic(diagnostic);
}
}据我所知看起来不错。如果您知道更好的方法,请随时添加更多详细信息。
https://stackoverflow.com/questions/62689892
复制相似问题