[英]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
分析器可以通過MSBuildWorkspace
和SymbolFinder
類訪問用法,但是.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.