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属性,但它只有在它指定一个位置,它指向专门为Test。在context.Node指定覆盖整个酒店,但它不是一个完整的其他几个跨度Location对象,所以我不能使用它们。


编辑 1


显然,使用 VS 2017 在 .Net Standard 中执行此操作很重要。.Net 4.5 分析器可以通过MSBuildWorkspace和SymbolFinder类访问用法,但是 .Net StandardMSBuildWorkspace出于某种原因没有,所以我无法获得当前解决方案传递给SymbolFinder.FindReferencesAsync().


智慧大石
浏览 190回答 1
1回答

宝慕林4294392

context.Node 指定了一些其他覆盖整个属性的跨度,但它不是一个完整的 Location 对象,所以我不能使用它们。答案在于Location从 a创建a TextSpan。为此,您可以Location.Create()在语法树和跨度中使用which 。两者都可以通过context.Node酒店获得。var propertyTypeIdentifier = ((PropertyDeclarationSyntax) context.Node).Type;name = propertyType.Name;location = Location.Create(propertyTypeIdentifier.SyntaxTree, propertyTypeIdentifier.Span);
打开App,查看更多内容
随时随地看视频慕课网APP