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++; } } }
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)); } }
public BrpMagicStringsResult(string fileText, MagicStringsReplacementStatistics stats) { FileText = fileText; Stats = stats; }