using System; using System.Linq; using CTA.Rules.Actions.ActionHelpers; using CTA.Rules.Config; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Editing; using Microsoft.CodeAnalysis.VisualBasic; using Microsoft.CodeAnalysis.VisualBasic.Syntax; namespace CTA.Rules.Actions.VisualBasic { /// /// List of actions that can run on Compilation Units /// public class CompilationUnitActions { public Func GetAddStatementAction(string @namespace) { CompilationUnitSyntax AddStatement(SyntaxGenerator syntaxGenerator, CompilationUnitSyntax node) { var allImports = node.Imports; var importStatement = SyntaxFactory.ImportsStatement( SyntaxFactory.SeparatedList() .Add(SyntaxFactory.SimpleImportsClause( SyntaxFactory.ParseName(@namespace))) ).NormalizeWhitespace() .WithTrailingTrivia(SyntaxFactory.EndOfLine(Environment.NewLine + Environment.NewLine)); allImports = allImports.Add(importStatement); node = node.WithImports(allImports); return node; } return AddStatement; } public Func GetRemoveStatementAction(string @namespace) { CompilationUnitSyntax RemoveStatement(SyntaxGenerator syntaxGenerator, CompilationUnitSyntax node) { // remove duplicate directive references, don't use List based approach because // since we will be replacing the node after each loop, it update text span which will not remove duplicate namespaces var allImports = node.Imports; // difference in visual basic is that a single import statement can have multiple import clauses (namespaces) var removeItem = allImports.FirstOrDefault(i => i.ImportsClauses.Any(c => c.ToString() == @namespace)); if (removeItem == null) { return node; } allImports = allImports.Remove(removeItem); // re-add import if it had multiple clauses if (removeItem.ImportsClauses.Count > 1) { var removeClause = removeItem.ImportsClauses.FirstOrDefault(c => c.ToString() == @namespace); if (removeClause != null) { var newClauses = removeItem.ImportsClauses.Remove(removeClause); var newImportStatement = removeItem.WithImportsClauses(newClauses); allImports = allImports.Add(newImportStatement); } } node = node.WithImports(allImports); return RemoveStatement(syntaxGenerator, node); } return RemoveStatement; } public Func GetAddCommentAction(string comment) { CompilationUnitSyntax AddComment(SyntaxGenerator syntaxGenerator, CompilationUnitSyntax node) { return (CompilationUnitSyntax)CommentHelper.AddVBComment(node, comment); } return AddComment; } } }