簡體   English   中英

Roslyn Analyzer標記屬性的返回類型

[英]Roslyn Analyzer to mark return type of property

我正在為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屬性名稱下放置了綠色的波浪Usage.Test ,但我希望該屬性在返回類型下。

context.ContainingSymbol具有Locations屬性,但其中僅指定了一個位置,並且僅指向Test context.Node指定了其他覆蓋整個屬性的跨度,但它不是完整的Location對象,因此無法使用它們。

編輯1

顯然,在帶有VS 2017的.Net Standard中執行此操作很重要MSBuildWorkspace分析器可以通過MSBuildWorkspaceSymbolFinder類訪問用法,但是.Net Standard由於某些原因沒有MSBuildWorkspace ,因此我無法獲取當前解決方案以傳遞給SymbolFinder.FindReferencesAsync()

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM