[英]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.