Roslyn Analyzer标记属性的返回类型

时间:2018-07-31 11:07:56

标签: c# roslyn-code-analysis

我正在为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 Standard中执行此操作很重要。.Net4.5分析器可以通过MSBuildWorkspaceSymbolFinder类访问用法,但是.Net Standard不能。出于某种原因没有MSBuildWorkspace,所以我无法将当前解决方案传递给SymbolFinder.FindReferencesAsync()

1 个答案:

答案 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);