繁体   English   中英

Roslyn Analyzer标记属性的返回类型

[英]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分析器可以通过MSBuildWorkspaceSymbolFinder类访问用法,但是.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM