为了账号安全,请及时绑定邮箱和手机立即绑定

Roslyn Analyzer 标记属性的返回类型

Roslyn Analyzer 标记属性的返回类型

C#
智慧大石 2021-11-07 20:35:23
我正在为 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);



查看完整回答
反对 回复 2021-11-07
  • 1 回答
  • 0 关注
  • 189 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信