【问题标题】:Roslyn Analyzer to mark return type of propertyRoslyn Analyzer 标记属性的返回类型
【发布时间】:2019-01-07 18:23:34
【问题描述】:

我正在为 Roslyn 编写一个需要标记属性返回类型的分析器。我让它标记属性声明本身。我查看了调试器,但找不到以返回类型令牌为目标的位置。

例子:

// important code for analzyer

public override void Initialize(AnalysisContext context)
{
    context.RegisterSyntaxNodeAction(AnalyzeSyntax, SyntaxKind.MethodDeclaration, SyntaxKind.PropertyDeclaration);
}

private static void AnalyzeSyntax(SyntaxNodeAnalysisContext context)
{
    var propertySymbol = context.ContainingSymbol as IPropertySymbol;
    var propertyType = propertySymbol.Type;
    if (propertyType.Name != "Class1") return;

    var diagnostic = Diagnostic.Create(Rule, propertySymbol.Locations[0], propertyType.Name);
    context.ReportDiagnostic(diagnostic);
    break;
}

// example where it should be working

public class Usage
{
    public Class1 Test { get; set; }
}

它目前将绿色波浪线放在Usage.Test 属性名称下,但我希望它在该属性的返回类型下。

context.ContainingSymbol 有一个Locations 属性,但它只指定了一个位置,并且它专门指向Testcontext.Node 指定了覆盖整个属性的其他几个跨度,但它不是完整的 Location 对象,所以我不能使用它们。

编辑 1

显然,我在 .Net Standard 和 VS 2017 中执行此操作很重要。.Net 4.5 分析器可以通过 MSBuildWorkspaceSymbolFinder 类访问用法,但 .Net Standard 没有 @987654330 @ 出于某种原因,我无法将当前解决方案传递给SymbolFinder.FindReferencesAsync()

【问题讨论】:

  • 你试过propertyType.Locations[0]吗?如果它仍然对您不起作用,您可以检索属性的相应声明语法节点 (propertySymbol.DeclaringSyntaxReferences[0]) 并查看其中的返回类型节点
  • 是的,propertyType.Locations[0] 是我现在的代码中的内容,但它似乎没有生成报告(在我的情况下是编译器警告)。我在语法参考中看不到如何到达返回类型节点。唯一的公共成员是 SpanSyntaxTree,它们不太有用。
  • 关于现在正在生成的报告,我的意思是我将其提交给ReportDiagnostics() 方法,但没有任何反应。没有波浪线,也没有编译器警告。

标签: c# roslyn-code-analysis


【解决方案1】:

context.Node 指定了覆盖整个属性的其他几个跨度,但它不是完整的 Location 对象,所以我不能使用它们。

答案在于从TextSpan 创建一个Location。为此,您可以使用Location.Create(),它接受语法树和跨度。这两个都可以通过context.Node 属性获得。

var propertyTypeIdentifier = ((PropertyDeclarationSyntax) context.Node).Type;

name = propertyType.Name;
location = Location.Create(propertyTypeIdentifier.SyntaxTree, propertyTypeIdentifier.Span);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 2021-04-02
    相关资源
    最近更新 更多