代码之家  ›  专栏  ›  技术社区  ›  gregsdennis

Roslyn Analyzer标记属性的返回类型

  •  0
  • gregsdennis  · 技术社区  · 7 年前

    我正在为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 属性,但它只有一个指定的位置,并且只指向 Test . 这个 context.Node 指定一些覆盖整个属性的其他跨距,但它不是完整的 Location 对象,所以我不能使用它们。

    编辑1

    显然,我在.NET标准中使用vs 2017进行这项工作很重要。.NET 4.5分析器可以通过 MSBuildWorkspace SymbolFinder 类,但.NET标准没有 MSBuildWorkspace 因为某些原因,所以我无法将当前的解决方案传递给 SymbolFinder.FindReferencesAsync() .

    1 回复  |  直到 7 年前
        1
  •  0
  •   gregsdennis    7 年前

    Location TextSpan Location.Create() context.Node

    var propertyTypeIdentifier = ((PropertyDeclarationSyntax) context.Node).Type;
    
    name = propertyType.Name;
    location = Location.Create(propertyTypeIdentifier.SyntaxTree, propertyTypeIdentifier.Span);