using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using Codelyzer.Analysis.Model; using CTA.Rules.Config; using CTA.Rules.Models; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.VisualBasic.Syntax; using Microsoft.CodeAnalysis.Editing; namespace CTA.Rules.Actions; public class VisualBasicActionsLoader : ActionLoaderBase { private readonly List _compilationUnitActions, _invocationExpressionActions, _namespaceActions, _identifierNameActions, _attributeActions, _attributeListActions, _typeBlockActions, _elementAccessActions, _expressionActions, _interfaceActions, _methodBlockActions, _objectCreationExpressionActions; private readonly object _compilationUnitObject, _invocationExpressionObject, _namespaceObject, _identifierNameObject, _attributeObject, _attributeListObject, _typeBlockObject, _elementAccessObject, _expressionObject, _interfaceObject, _methodBlockObject, _objectExpressionObject; /// /// Initializes a new ActionLoader that loads the default actions /// /// A directory containing additional actions to be used public VisualBasicActionsLoader(List assemblyPaths) { _compilationUnitActions = new List(); _invocationExpressionActions = new List(); _namespaceActions = new List(); _identifierNameActions = new List (); _attributeActions = new List (); _attributeListActions = new List (); _typeBlockActions = new List (); _elementAccessActions = new List (); _expressionActions = new List (); _interfaceActions = new List (); _methodBlockActions = new List (); _objectCreationExpressionActions = new List(); memberAccessActions = new List(); projectLevelActions = new List(); projectFileActions = new List(); projectTypeActions = new List(); var assemblies = GetAssemblies(assemblyPaths); foreach (var assembly in assemblies) { try { var types = assembly.GetTypes() .Where(t => t.Name.EndsWith("Actions") && (t.Namespace.EndsWith(ProjectLanguage.VisualBasic.ToString()) || t.Name.StartsWith("Project") || t.Name.StartsWith("MemberAccess"))).ToList(); TryCreateInstance(Constants.CompilationUnitActions, types, out _compilationUnitObject); TryCreateInstance(Constants.InvocationExpressionActions, types, out _invocationExpressionObject); TryCreateInstance(Constants.NamespaceActions, types, out _namespaceObject); TryCreateInstance(Constants.AttributeActions, types, out _attributeObject); TryCreateInstance(Constants.AttributeListActions, types, out _attributeListObject); TryCreateInstance(Constants.TypeBlockActions, types, out _typeBlockObject); TryCreateInstance(Constants.ElementAccessActions, types, out _elementAccessObject); TryCreateInstance(Constants.ExpressionActions, types, out _expressionObject); TryCreateInstance(Constants.InterfaceActions, types, out _interfaceObject); TryCreateInstance(Constants.MethodBlockActions, types, out _methodBlockObject); TryCreateInstance(Constants.ProjectLevelActions, types, out projectLevelObject); TryCreateInstance(Constants.ProjectFileActions, types, out projectFileObject); TryCreateInstance(Constants.ProjectTypeActions, types, out projectTypeObject); TryCreateInstance(Constants.IdentifierNameActions, types, out _identifierNameObject); TryCreateInstance(Constants.ObjectCreationExpressionActions, types, out _objectExpressionObject); TryCreateInstance(Constants.MemberAccessActions, types, out memberAccessObject); foreach (var t in types) { switch (t.Name) { case Constants.CompilationUnitActions: { _compilationUnitActions.AddRange(GetFuncMethods(t)); break; } case Constants.InvocationExpressionActions: { _invocationExpressionActions.AddRange(GetFuncMethods(t)); break; } case Constants.NamespaceActions: { _namespaceActions.AddRange(GetFuncMethods(t)); break; } case Constants.ProjectLevelActions: { projectLevelActions.AddRange(GetFuncMethods(t)); break; } case Constants.ProjectFileActions: { projectFileActions.AddRange(GetFuncMethods(t)); break; } case Constants.ProjectTypeActions: { projectTypeActions.AddRange(GetFuncMethods(t)); break; } case Constants.IdentifierNameActions: { _identifierNameActions.AddRange(GetFuncMethods(t)); break; } case Constants.AttributeActions: { _attributeActions.AddRange(GetFuncMethods(t)); break; } case Constants.AttributeListActions: { _attributeListActions.AddRange(GetFuncMethods(t)); break; } case Constants.TypeBlockActions: { _typeBlockActions.AddRange(GetFuncMethods(t)); break; } case Constants.InterfaceActions: { _interfaceActions.AddRange(GetFuncMethods(t)); break; } case Constants.ExpressionActions: { _expressionActions.AddRange(GetFuncMethods(t)); break; } case Constants.MethodBlockActions: { _methodBlockActions.AddRange(GetFuncMethods(t)); break; } case Constants.ElementAccessActions: { _elementAccessActions.AddRange(GetFuncMethods(t)); break; } case Constants.ObjectCreationExpressionActions: { _objectCreationExpressionActions.AddRange(GetFuncMethods(t)); break; } case Constants.MemberAccessActions: { memberAccessActions.AddRange(GetFuncMethods(t)); break; } default: { LogHelper.LogError($"Action type {t.Name} is not found"); break; } } } } catch (Exception ex) { LogHelper.LogError(ex, string.Format("Error loading actions from {0}", assembly.FullName, ex.Message)); } } } public Func GetInvocationExpressionAction(string name, dynamic value) { return GetAction> (_invocationExpressionActions, _invocationExpressionObject, name, value); } public Func GetCompilationUnitAction(string name, dynamic value) { return GetAction> (_compilationUnitActions, _compilationUnitObject, name, value); } public Func GetAttributeAction(string name, dynamic value) { return GetAction> (_attributeActions, _attributeObject, name, value); } public Func GetAttributeListAction(string name, dynamic value) { return GetAction> (_attributeListActions, _attributeListObject, name, value); } public Func GetClassAction(string name, dynamic value) { return GetAction> (_typeBlockActions, _typeBlockObject, name, value); } public Func GetInterfaceAction(string name, dynamic value) { return GetAction> (_interfaceActions, _interfaceObject, name, value); } public Func GetIdentifierNameAction(string name, dynamic value) { return GetAction> (_identifierNameActions, _identifierNameObject, name, value); } public Func GetExpressionAction(string name, dynamic value) { return GetAction> (_expressionActions, _expressionObject, name, value); } public Func GetMethodDeclarationAction(string name, dynamic value) { return GetAction> (_methodBlockActions, _methodBlockObject, name, value); } public Func GetNamespaceActions(string name, dynamic value) { return GetAction> (_namespaceActions, _namespaceObject, name, value); } public Func GetObjectCreationExpressionActions( string name, dynamic value) { return GetAction> (_objectCreationExpressionActions, _objectExpressionObject, name, value); } public Func GetElementAccessExpressionActions(string name, dynamic value) { return GetAction> (_elementAccessActions, _elementAccessObject, name, value); } }