Пример #1
0
        private static void ReplaceMagicStrings(
            Dictionary <string, string> constants,
            SyntaxNode classNode,
            DocumentEditor editor,
            MagicStringsReplacementStatistics stats)
        {
            foreach (var child in classNode.DescendantNodes().OfType <LiteralExpressionSyntax>().Where(s => s.Kind() == SyntaxKind.StringLiteralExpression))
            {
                var value = child.WithoutTrivia().GetText().ToString();
                if (value == "\"\"")
                {
                    if (IsIgnoredEmptyStringNode(child))
                    {
                        continue;
                    }

                    var stringEmpty = SyntaxFactory.MemberAccessExpression(
                        SyntaxKind.SimpleMemberAccessExpression,
                        SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.StringKeyword)),
                        SyntaxFactory.IdentifierName("Empty"));

                    if (child.HasLeadingTrivia)
                    {
                        stringEmpty = stringEmpty.WithLeadingTrivia(child.GetLeadingTrivia());
                    }

                    if (child.HasTrailingTrivia)
                    {
                        stringEmpty = stringEmpty.WithTrailingTrivia(child.GetTrailingTrivia());
                    }

                    editor.ReplaceNode(child, stringEmpty);
                    stats.EmptyStringsReplaced++;
                }

                if (constants.TryGetValue(value, out var name))
                {
                    if (IsNodeConst(child))
                    {
                        continue;
                    }

                    var useConstant = SyntaxFactory.IdentifierName(name);

                    if (child.HasLeadingTrivia)
                    {
                        useConstant = useConstant.WithLeadingTrivia(child.GetLeadingTrivia());
                    }

                    if (child.HasTrailingTrivia)
                    {
                        useConstant = useConstant.WithTrailingTrivia(child.GetTrailingTrivia());
                    }

                    editor.ReplaceNode(child, useConstant);
                    stats.MagicStringsReplaced++;
                }
            }
        }
Пример #2
0
        public static async Task <BrpMagicStringsResult> Solve(string text)
        {
            using (var workspace = new AdhocWorkspace())
            {
                var projectInfo = ProjectInfo.Create(
                    ProjectId.CreateNewId(),
                    VersionStamp.Create(),
                    "NewProject",
                    "projName",
                    LanguageNames.CSharp);

                var newProject = workspace.AddProject(projectInfo);
                var document   = workspace.AddDocument(newProject.Id, "NewFile.cs", SourceText.From(text));
                var syntaxRoot = await document.GetSyntaxRootAsync();

                var editor = await DocumentEditor.CreateAsync(document);

                var stats = new MagicStringsReplacementStatistics();
                foreach (var classNode in syntaxRoot.DescendantNodes().OfType <ClassDeclarationSyntax>())
                {
                    var existingConstants = AnalyzeExistingConstants(classNode);
                    var constantsFromCode = AnalyzeMagicStrings(classNode);

                    var constantsToCreate = constantsFromCode
                                            .Where(c => !existingConstants.ContainsKey(c))
                                            .ToList();

                    var newConstants = CreateConstants(constantsToCreate, classNode, editor);
                    stats.ConstantsCreated += newConstants.Count;

                    var allConstants = existingConstants
                                       .Concat(newConstants)
                                       .ToDictionary(kv => kv.Key, kv => kv.Value);

                    ReplaceMagicStrings(allConstants, classNode, editor, stats);
                }

                var newDocument = editor.GetChangedDocument();
                var sourceText  = await newDocument.GetTextAsync();

                return(new BrpMagicStringsResult(sourceText.ToString(), stats));
            }
        }
Пример #3
0
 public BrpMagicStringsResult(string fileText, MagicStringsReplacementStatistics stats)
 {
     FileText = fileText;
     Stats    = stats;
 }