using System;
using System.Linq;
using CTA.Rules.Actions.ActionHelpers;
using CTA.Rules.Config;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Editing;
namespace CTA.Rules.Actions.Csharp
{
///
/// List of actions that can run on Compilation Units
///
public class CompilationUnitActions
{
public Func GetAddDirectiveAction(string @namespace)
{
CompilationUnitSyntax AddDirective(SyntaxGenerator syntaxGenerator, CompilationUnitSyntax node)
{
var allUsings = node.Usings;
var usingDirective = SyntaxFactory.UsingDirective(SyntaxFactory.ParseName(@namespace))
.NormalizeWhitespace().WithTrailingTrivia(SyntaxFactory.EndOfLine(Environment.NewLine + Environment.NewLine));
allUsings = allUsings.Add(usingDirective);
node = node.WithUsings(allUsings);
return node;
}
return AddDirective;
}
public Func GetRemoveDirectiveAction(string @namespace)
{
CompilationUnitSyntax RemoveDirective(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 allUsings = node.Usings;
var removeItem = allUsings.FirstOrDefault(u => @namespace == u.Name.ToString());
if (removeItem == null)
return node;
allUsings = allUsings.Remove(removeItem);
node = node.WithUsings(allUsings);
return RemoveDirective(syntaxGenerator,node);
}
return RemoveDirective;
}
public Func GetAddCommentAction(string comment)
{
CompilationUnitSyntax AddComment(SyntaxGenerator syntaxGenerator, CompilationUnitSyntax node)
{
return (CompilationUnitSyntax)CommentHelper.AddCSharpComment(node, comment);
}
return AddComment;
}
}
}