Пример #1
0
        public static Task <Document> RefactorAsync(
            Document document,
            BaseTypeSyntax baseType,
            CancellationToken cancellationToken)
        {
            SyntaxRemoveOptions removeOptions = RemoveHelper.DefaultRemoveOptions;

            if (baseType.GetLeadingTrivia().All(f => f.IsWhitespaceTrivia()))
            {
                removeOptions &= ~SyntaxRemoveOptions.KeepLeadingTrivia;
            }

            if (baseType.GetTrailingTrivia().All(f => f.IsWhitespaceTrivia()))
            {
                var baseList = (BaseListSyntax)baseType.Parent;

                if (baseList.Types.IsLast(baseType) &&
                    !GenericSyntax.HasConstraintClauses(baseList.Parent))
                {
                    removeOptions &= ~SyntaxRemoveOptions.KeepTrailingTrivia;
                }
            }

            return(document.RemoveNodeAsync(baseType, removeOptions, cancellationToken));
        }
Пример #2
0
        public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context)
        {
            if (!Settings.IsCodeFixEnabled(CodeFixIdentifiers.RemoveTypeParameter))
            {
                return;
            }

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

            if (!TryFindFirstAncestorOrSelf(root, context.Span, out TypeParameterSyntax typeParameter))
            {
                return;
            }

            foreach (Diagnostic diagnostic in context.Diagnostics)
            {
                switch (diagnostic.Id)
                {
                case CompilerDiagnosticIdentifiers.TypeParameterHasSameNameAsTypeParameterFromOuterType:
                {
                    TypeParameterInfo info;
                    if (TypeParameterInfo.TryCreate(typeParameter, out info))
                    {
                        CodeAction codeAction = CodeAction.Create(
                            $"Remove type parameter '{info.Name}'",
                            cancellationToken =>
                            {
                                SeparatedSyntaxList <TypeParameterSyntax> parameters = info.TypeParameterList.Parameters;

                                TypeParameterListSyntax newTypeParameterList = (parameters.Count == 1)
                                            ? default(TypeParameterListSyntax)
                                            : info.TypeParameterList.WithParameters(parameters.Remove(typeParameter));

                                SyntaxNode newNode = GenericSyntax.WithTypeParameterList(info.Declaration, newTypeParameterList);

                                TypeParameterConstraintClauseSyntax constraintClause = info.ConstraintClause;

                                if (constraintClause != null)
                                {
                                    newNode = GenericSyntax.WithConstraintClauses(newNode, info.ConstraintClauses.Remove(constraintClause));
                                }

                                return(context.Document.ReplaceNodeAsync(info.Declaration, newNode, cancellationToken));
                            },
                            GetEquivalenceKey(diagnostic));

                        context.RegisterCodeFix(codeAction, diagnostic);
                    }

                    break;
                }
                }
            }
        }
Пример #3
0
            private static string JsonToFormat(string json_result)
            {
                string to_return = "";
                var    settings  = new JsonSerializerSettings();

                JObject       jsonParsed = JsonConvert.DeserializeObject <JObject>(json_result, settings);
                GenericSyntax syntax     = new GenericSyntax(jsonParsed);

                to_return = syntax.ExportTagOrWords(true);
                //Debug.LogWarning(to_return);
                return(to_return);
            }
Пример #4
0
        private void RemoveConstraint(
            CodeFixContext context,
            Diagnostic diagnostic,
            TypeParameterConstraintSyntax constraint)
        {
            SeparatedSyntaxList <TypeParameterConstraintSyntax> constraints;

            if (GenericSyntax.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);
            }
        }
Пример #5
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 (GenericSyntax.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 (GenericSyntax.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 (GenericSyntax.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 (GenericSyntax.TryGetContainingList(constraint, out constraintClauses))
                    {
                        TypeParameterConstraintSyntax structConstraint = constraintClauses.Find(SyntaxKind.StructConstraint);
                        RemoveConstraint(context, diagnostic, structConstraint);
                    }

                    break;
                }
                }
            }
        }
        public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context)
        {
            if (!Settings.IsAnyCodeFixEnabled(
                    CodeFixIdentifiers.RemoveConstraintClauses,
                    CodeFixIdentifiers.CombineConstraintClauses))
            {
                return;
            }

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

            if (!TryFindFirstAncestorOrSelf(root, context.Span, out TypeParameterConstraintClauseSyntax constraintClause))
            {
                return;
            }

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

                    CodeAction codeAction = CodeAction.Create(
                        "Remove constraints",
                        cancellationToken =>
                        {
                            SyntaxNode node = constraintClause.Parent;

                            SyntaxNode newNode = GenericSyntax.RemoveConstraintClauses(node);

                            return(context.Document.ReplaceNodeAsync(node, newNode, cancellationToken));
                        },
                        GetEquivalenceKey(diagnostic));

                    context.RegisterCodeFix(codeAction, diagnostic);
                    break;
                }

                case CompilerDiagnosticIdentifiers.ConstraintClauseHasAlreadyBeenSpecified:
                {
                    if (!Settings.IsCodeFixEnabled(CodeFixIdentifiers.CombineConstraintClauses))
                    {
                        break;
                    }

                    SyntaxList <TypeParameterConstraintClauseSyntax> constraintClauses = GenericSyntax.GetContainingList(constraintClause);

                    int index = constraintClauses.IndexOf(constraintClause);

                    string name = constraintClause.NameText();

                    TypeParameterConstraintClauseSyntax constraintClause2 = constraintClauses.FirstOrDefault(f => string.Equals(name, f.NameText(), StringComparison.Ordinal));

                    if (constraintClause2 == null)
                    {
                        break;
                    }

                    CodeAction codeAction = CodeAction.Create(
                        $"Combine constraints for '{name}'",
                        cancellationToken =>
                        {
                            SyntaxNode node = constraintClause.Parent;

                            TypeParameterConstraintClauseSyntax newConstraintClause = constraintClause2.WithConstraints(constraintClause2.Constraints.AddRange(constraintClause.Constraints));

                            SyntaxList <TypeParameterConstraintClauseSyntax> newConstraintClauses = constraintClauses
                                                                                                    .Replace(constraintClause2, newConstraintClause)
                                                                                                    .RemoveAt(index);

                            SyntaxNode newNode = GenericSyntax.WithConstraintClauses(node, newConstraintClauses);

                            return(context.Document.ReplaceNodeAsync(node, newNode, cancellationToken));
                        },
                        GetEquivalenceKey(diagnostic));

                    context.RegisterCodeFix(codeAction, diagnostic);

                    break;
                }
                }
            }
        }