【问题标题】:Roslyn CodeFixProvider add attribute to the methodRoslyn CodeFixProvider 向方法添加属性
【发布时间】:2016-06-03 01:07:20
【问题描述】:

我正在为检测方法声明中是否缺少自定义属性的分析器构建 CodeFixProvider。基本上应该添加到方法中的自定义属性看起来像

    [CustomAttribute(param1: false, param2: new int[]{1,2,3})]

这是我目前所得到的:

    public sealed override async Task RegisterCodeFixesAsync( CodeFixContext context ) {
        var root = await context.Document.GetSyntaxRootAsync( context.CancellationToken ).ConfigureAwait( false );

        var diagnostic = context.Diagnostics.First();
        var diagnosticSpan = diagnostic.Location.SourceSpan;
        var declaration = root.FindToken( diagnosticSpan.Start ).Parent.AncestorsAndSelf( ).OfType<MethodDeclarationSyntax>( ).First( );

        context.RegisterCodeFix(
            CodeAction.Create(
                title: title,
                createChangedSolution: c => this.AddCustomAttribute(context.Document, declaration, c),
                equivalenceKey: title),
            diagnostic);
    }

    private async Task<Solution> AddCustomAttribute( Document document, MethodDeclarationSyntax methodDeclaration, CancellationToken cancellationToken ) {
        // I suspect I need to do something like methodDeclaration.AddAttributeLists(new AttributeListSyntax[] {
        // but not sure how to use it exactly

        throw new NotImplementedException( );
    }

【问题讨论】:

    标签: c# roslyn


    【解决方案1】:

    请记住,roslyn 语法树是不可变的。你需要类似的东西:

    private async Task<Solution> AddCustomAttribute(Document document, MethodDeclarationSyntax methodDeclaration, CancellationToken cancellationToken)
    {
        var root = await document.GetSyntaxRootAsync(cancellationToken);
        var attributes = methodDeclaration.AttributeLists.Add(
            SyntaxFactory.AttributeList(SyntaxFactory.SingletonSeparatedList<AttributeSyntax>(
                SyntaxFactory.Attribute(SyntaxFactory.IdentifierName("CustomAttribute"))
                //  .WithArgumentList(...)
            )).NormalizeWhitespace());
    
        return document.WithSyntaxRoot(
            root.ReplaceNode(
                methodDeclaration,
                methodDeclaration.WithAttributeLists(attributes)
            )).Project.Solution;
    }
    

    要获取属性构造函数.WithArgumentList() 的完整SyntaxFactory 代码,请将其放入Roslyn Quoter

    【讨论】:

    • 这行得通,但是你能指出我关于这个主题的好资源吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多