Ejemplo n.º 1
0
            async Task <ClassDeclarationSyntax> RenameDeclarationsAsync(ClassDeclarationSyntax classNode)
            {
                if (CheckOption((int)CamelCasedClassFields.CleanupTypes.NormalFields))
                {
                    var renamingResult = await new FieldRenamer(WorkingDocument).RenameDeclarationsAsync(classNode);

                    if (renamingResult != null && renamingResult.Node != null)
                    {
                        classNode       = renamingResult.Node as ClassDeclarationSyntax;
                        WorkingDocument = renamingResult.Document;
                    }

                    if (renamingResult != null)
                    {
                        var lineSpan = classNode.GetFileLinePosSpan();

                        AddReport(new ChangesReport(classNode)
                        {
                            LineNumber = lineSpan.StartLinePosition.Line,
                            Column     = lineSpan.StartLinePosition.Character,
                            Message    = "Camel Cased Fields",
                            Generator  = nameof(CamelCasedFields),
                        });
                    }
                }

                if (CheckOption((int)CamelCasedClassFields.CleanupTypes.ConstFields))
                {
                    var renamingResult = await new CONSTRenamer(WorkingDocument).RenameDeclarationsAsync(classNode);

                    if (renamingResult != null && renamingResult.Node != null)
                    {
                        classNode       = renamingResult.Node as ClassDeclarationSyntax;
                        WorkingDocument = renamingResult.Document;
                    }

                    if (renamingResult != null)
                    {
                        var lineSpan = classNode.GetFileLinePosSpan();

                        AddReport(new ChangesReport(classNode)
                        {
                            LineNumber = lineSpan.StartLinePosition.Line,
                            Column     = lineSpan.StartLinePosition.Character,
                            Message    = "CamelCasedFields",
                            Generator  = nameof(CamelCasedFields)
                        });
                    }
                }

                return(classNode);
            }
            SyntaxNode Apply(ClassDeclarationSyntax classDescriptionNode)
            {
                var newDeclarationDic = new Dictionary <NewFieldDeclarationDicKey, NewFieldDeclarationDicItem>();

                var fieldDeclarations =
                    classDescriptionNode
                    .Members
                    .OfType <FieldDeclarationSyntax>()
                    .Where(fd => fd.AttributeLists.Any() == false)
                    .Where(fd => fd.HasStructuredTrivia == false)
                    .Where(fd => fd.DescendantTrivia().Any(t => t.IsKind(SyntaxKind.SingleLineCommentTrivia) || t.IsKind(SyntaxKind.MultiLineCommentTrivia)) == false)
                    .Where(fd => fd.Declaration.Variables.All(x => x.Initializer == null || x.Initializer.Value is LiteralExpressionSyntax))
                    .ToList();

                foreach (var fieldDeclarationItem in fieldDeclarations)
                {
                    var variableType = GetSystemTypeOfTypeNode(fieldDeclarationItem.Declaration);

                    var key = GetKey(fieldDeclarationItem);

                    if (newDeclarationDic.ContainsKey(key) == false)
                    {
                        newDeclarationDic
                        .Add
                        (
                            key,
                            new NewFieldDeclarationDicItem
                        {
                            VariablesWithoutInitializer = new List <VariableDeclaratorSyntax>(),
                            VariablesWithInitializer    = new List <VariableDeclaratorSyntax>(),
                            OldFieldDeclarations        = new List <FieldDeclarationSyntax>()
                        }
                        );
                    }

                    var currentItem = newDeclarationDic[key];

                    currentItem.OldFieldDeclarations.Add(fieldDeclarationItem);

                    var newDeclaration = VisitFieldDeclaration(fieldDeclarationItem) as FieldDeclarationSyntax;

                    currentItem.VariablesWithoutInitializer
                    .AddRange(newDeclaration.Declaration.Variables.Where(v => v.Initializer == null));
                    currentItem.VariablesWithInitializer
                    .AddRange(newDeclaration.Declaration.Variables.Where(v => v.Initializer != null));
                }

                var newDeclarationDicAllItems = newDeclarationDic.ToList();

                newDeclarationDic.Clear();

                foreach (var newDelarationItem in newDeclarationDicAllItems)
                {
                    var finalList = newDelarationItem.Value.VariablesWithoutInitializer.Select(x => x.WithoutTrailingTrivia().WithLeadingTrivia(spaceTrivia)).ToList();
                    finalList.AddRange(newDelarationItem.Value.VariablesWithInitializer.Select(x => x.WithoutTrailingTrivia().WithLeadingTrivia(spaceTrivia)));

                    finalList[0] = finalList[0].WithoutLeadingTrivia();

                    newDelarationItem.Value.NewFieldDeclaration =
                        newDelarationItem.Value.FirstOldFieldDeclarations
                        .WithDeclaration(
                            newDelarationItem.Value.FirstOldFieldDeclarations
                            .Declaration
                            .WithVariables(SyntaxFactory.SeparatedList(finalList))
                            );

                    if (newDelarationItem.Value.NewFieldDeclaration.Span.Length <= SimplifyClassFieldDeclaration.Options.MaxFieldDeclarationLength)
                    {
                        newDeclarationDic.Add(newDelarationItem.Key, newDelarationItem.Value);
                    }
                    else
                    {
                        foreach (var item in newDelarationItem.Value.OldFieldDeclarations)
                        {
                            fieldDeclarations.Remove(item);
                        }
                    }
                }

                var replaceList = newDeclarationDic.Select(x => x.Value.FirstOldFieldDeclarations).ToList();

                var newClassDescriptionNode =
                    classDescriptionNode
                    .ReplaceNodes
                    (
                        fieldDeclarations,
                        (node1, node2) =>
                {
                    if (replaceList.Contains(node1))
                    {
                        var dicItem = newDeclarationDic[GetKey(node1 as FieldDeclarationSyntax)];

                        return
                        (dicItem
                         .NewFieldDeclaration
                         .WithLeadingTrivia(dicItem.FirstOldFieldDeclarations.GetLeadingTrivia())
                         .WithTrailingTrivia(dicItem.FirstOldFieldDeclarations.GetTrailingTrivia()));
                    }

                    return(null);
                }
                    );

                if (replaceList.Any() && isReportOnlyMode)
                {
                    var lineSpan = classDescriptionNode.GetFileLinePosSpan();

                    AddReport(new ChangesReport(classDescriptionNode)
                    {
                        LineNumber = lineSpan.StartLinePosition.Line,
                        Column     = lineSpan.StartLinePosition.Character,
                        Message    = "Field initialize can be in one line",
                        Generator  = nameof(SimplifyClassFieldDeclarations)
                    });
                }

                return(newClassDescriptionNode);
            }