Beispiel #1
0
        private void RemoveConstraint(
            CodeFixContext context,
            Diagnostic diagnostic,
            TypeParameterConstraintSyntax constraint)
        {
            SeparatedSyntaxList <TypeParameterConstraintSyntax> constraints;

            if (GenericDeclarationHelper.TryGetContainingList(constraint, out constraints))
            {
                CodeAction codeAction = CodeAction.Create(
                    $"Remove constraint '{constraint}'",
                    cancellationToken => context.Document.RemoveNodeAsync(constraint, RemoveHelper.GetRemoveOptions(constraint), cancellationToken),
                    GetEquivalenceKey(diagnostic, constraint.Kind().ToString()));

                context.RegisterCodeFix(codeAction, diagnostic);
            }
        }
Beispiel #2
0
        public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context)
        {
            if (!Settings.IsAnyCodeFixEnabled(
                    CodeFixIdentifiers.RemoveConstraint,
                    CodeFixIdentifiers.MoveConstraint))
            {
                return;
            }

            SyntaxNode root = await context.GetSyntaxRootAsync().ConfigureAwait(false);

            if (!TryFindFirstAncestorOrSelf(root, context.Span, out TypeParameterConstraintSyntax constraint))
            {
                return;
            }

            foreach (Diagnostic diagnostic in context.Diagnostics)
            {
                switch (diagnostic.Id)
                {
                case CompilerDiagnosticIdentifiers.NewConstraintMustBeLastConstraintSpecified:
                {
                    if (!Settings.IsCodeFixEnabled(CodeFixIdentifiers.MoveConstraint))
                    {
                        break;
                    }

                    SeparatedSyntaxList <TypeParameterConstraintSyntax> constraints;

                    if (GenericDeclarationHelper.TryGetContainingList(constraint, out constraints))
                    {
                        MoveConstraint(context, diagnostic, constraint, constraints, constraints.Count - 1);
                    }

                    break;
                }

                case CompilerDiagnosticIdentifiers.DuplicateConstraintForTypeParameter:
                {
                    if (Settings.IsCodeFixEnabled(CodeFixIdentifiers.RemoveConstraint))
                    {
                        RemoveConstraint(context, diagnostic, constraint);
                    }

                    break;
                }

                case CompilerDiagnosticIdentifiers.ClassOrStructConstraintMustComeBeforeAnyOtherConstraints:
                {
                    if (!Settings.IsCodeFixEnabled(CodeFixIdentifiers.MoveConstraint))
                    {
                        break;
                    }

                    SeparatedSyntaxList <TypeParameterConstraintSyntax> constraints;
                    if (GenericDeclarationHelper.TryGetContainingList(constraint, out constraints))
                    {
                        if (IsDuplicateConstraint(constraint, constraints))
                        {
                            RemoveConstraint(context, diagnostic, constraint);
                        }
                        else
                        {
                            MoveConstraint(context, diagnostic, constraint, constraints, 0);
                        }
                    }

                    break;
                }

                case CompilerDiagnosticIdentifiers.CannotSpecifyBothConstraintClassAndClassOrStructConstraint:
                {
                    if (!Settings.IsCodeFixEnabled(CodeFixIdentifiers.RemoveConstraint))
                    {
                        break;
                    }

                    RemoveConstraint(context, diagnostic, constraint);

                    SeparatedSyntaxList <TypeParameterConstraintSyntax> constraintClauses;
                    if (GenericDeclarationHelper.TryGetContainingList(constraint, out constraintClauses))
                    {
                        TypeParameterConstraintSyntax classConstraint = constraintClauses.Find(SyntaxKind.ClassConstraint);

                        if (classConstraint != null)
                        {
                            RemoveConstraint(context, diagnostic, classConstraint);
                        }

                        TypeParameterConstraintSyntax structConstraint = constraintClauses.Find(SyntaxKind.StructConstraint);

                        if (structConstraint != null)
                        {
                            RemoveConstraint(context, diagnostic, structConstraint);
                        }
                    }

                    break;
                }

                case CompilerDiagnosticIdentifiers.NewConstraintCannotBeUsedWithStructConstraint:
                {
                    if (!Settings.IsCodeFixEnabled(CodeFixIdentifiers.RemoveConstraint))
                    {
                        break;
                    }

                    RemoveConstraint(context, diagnostic, constraint);

                    SeparatedSyntaxList <TypeParameterConstraintSyntax> constraintClauses;
                    if (GenericDeclarationHelper.TryGetContainingList(constraint, out constraintClauses))
                    {
                        TypeParameterConstraintSyntax structConstraint = constraintClauses.Find(SyntaxKind.StructConstraint);
                        RemoveConstraint(context, diagnostic, structConstraint);
                    }

                    break;
                }
                }
            }
        }