Roslyn Analyzer标记属性的返回类型



我正在为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属性,但其中只指定了一个位置,并且它专门指向Testcontext.Node指定了覆盖整个属性的其他几个跨距,但它不是完整的Location对象,所以我不能使用它们。

编辑1

显然,重要的是,我正在VS 2017的.Net标准中做这件事。.Net 4.5分析器可以通过MSBuildWorkspaceSymbolFinder类访问用法,但由于某种原因,.Net Standard没有MSBuildWorkspace,因此我无法将当前解决方案传递给SymbolFinder.FindReferencesAsync()

上下文。Node指定了覆盖整个属性的其他几个跨距,但它不是一个完整的Location对象,所以我不能使用它们。

答案在于从TextSpan创建Location。要做到这一点,您可以使用Location.Create(),它接受语法树和跨度。这两者都可以通过context.Node属性获得。

var propertyTypeIdentifier = ((PropertyDeclarationSyntax) context.Node).Type;
name = propertyType.Name;
location = Location.Create(propertyTypeIdentifier.SyntaxTree, propertyTypeIdentifier.Span);

最新更新