我正在為 Roslyn 編寫一個需要標記屬性返回類型的分析器。我有它標記屬性聲明本身。我已經查看了調試器,但找不到針對返回類型標記的位置。例子:// important code for analzyerpublic 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 workingpublic class Usage{ public Class1 Test { get; set; }}它目前在Usage.Test屬性名稱下放置綠色波浪線,但我希望它位于該屬性的返回類型下。該context.ContainingSymbol有一個Locations屬性,但它只有在它指定一個位置,它指向專門為Test。在context.Node指定覆蓋整個酒店,但它不是一個完整的其他幾個跨度Location對象,所以我不能使用它們。編輯 1顯然,使用 VS 2017 在 .Net Standard 中執行此操作很重要。.Net 4.5 分析器可以通過MSBuildWorkspace和SymbolFinder類訪問用法,但是 .Net StandardMSBuildWorkspace出于某種原因沒有,所以我無法獲得當前解決方案傳遞給SymbolFinder.FindReferencesAsync().
1 回答

寶慕林4294392
TA貢獻2021條經驗 獲得超8個贊
context.Node 指定了一些其他覆蓋整個屬性的跨度,但它不是一個完整的 Location 對象,所以我不能使用它們。
答案在于Location從 a創建a TextSpan。為此,您可以Location.Create()在語法樹和跨度中使用which 。兩者都可以通過context.Node酒店獲得。
var propertyTypeIdentifier = ((PropertyDeclarationSyntax) context.Node).Type;
name = propertyType.Name;
location = Location.Create(propertyTypeIdentifier.SyntaxTree, propertyTypeIdentifier.Span);
- 1 回答
- 0 關注
- 215 瀏覽
添加回答
舉報
0/150
提交
取消