我正在为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
属性名称下放置了绿色的波浪形,但是我希望在该属性的返回类型下放置它。
context.ContainingSymbol
有一个Locations
属性,但是它只指定了一个位置,并且专门指向Test
。 context.Node
指定了覆盖整个属性的其他几个范围,但它不是完整的Location
对象,因此我不能使用它们。
编辑1
显然,在VS 2017的.Net Standard中执行此操作很重要。.Net4.5分析器可以通过MSBuildWorkspace
和SymbolFinder
类访问用法,但是.Net Standard不能。出于某种原因没有MSBuildWorkspace
,所以我无法将当前解决方案传递给SymbolFinder.FindReferencesAsync()
。
答案 0 :(得分:0)
context.Node指定了覆盖整个属性的其他几个范围,但它不是完整的Location对象,因此我不能使用它们。
答案在于从Location
创建TextSpan
。为此,您可以使用Location.Create()
来获取语法树和跨度。这两个属性都可以通过context.Node
属性使用。
var propertyTypeIdentifier = ((PropertyDeclarationSyntax) context.Node).Type;
name = propertyType.Name;
location = Location.Create(propertyTypeIdentifier.SyntaxTree, propertyTypeIdentifier.Span);