using Mono.Cecil; using Mono.Cecil.Rocks; using ReCodeIt.Enums; using ReCodeIt.Models; namespace ReCodeIt.ReMapper.Search; internal static class Methods { /// /// returns a match on all types with the specified methods /// /// /// /// /// Match if type contains any supplied methods public static EMatchResult Include(TypeDefinition type, SearchParams parms, ScoringModel score) { if (parms.IncludeMethods is null || parms.IncludeMethods.Count == 0) return EMatchResult.Disabled; var matches = type.Methods .Where(method => parms.IncludeMethods.Any(include => method.Name.Contains(include))) .Count(); score.Score += matches > 0 ? matches : -matches; score.FailureReason = matches > 0 ? EFailureReason.None : EFailureReason.MethodsInclude; return matches > 0 ? EMatchResult.Match : EMatchResult.NoMatch; } /// /// Returns a match on all types without methods /// /// /// /// /// Match if type has no methods public static EMatchResult Exclude(TypeDefinition type, SearchParams parms, ScoringModel score) { if (parms.ExcludeMethods is null || parms.ExcludeMethods.Count == 0) return EMatchResult.Disabled; var matches = type.Methods .Where(method => parms.ExcludeMethods.Contains(method.Name)) .Count(); score.Score += matches > 0 ? -matches : 1; score.FailureReason = matches > 0 ? EFailureReason.MethodsExclude : EFailureReason.None; return matches > 0 ? EMatchResult.NoMatch : EMatchResult.Match; } /// /// Returns a match if the type has the provided number of methods /// /// /// /// /// public static EMatchResult Count(TypeDefinition type, SearchParams parms, ScoringModel score) { if (parms.MethodCount is null) return EMatchResult.Disabled; var numMethods = type.Methods.Count - type.GetConstructors().Count(); bool match = numMethods == parms.MethodCount; score.Score += match ? (int)parms.MethodCount : -(int)parms.MethodCount; score.FailureReason = match ? EFailureReason.None : EFailureReason.MethodsCount; return match ? EMatchResult.Match : EMatchResult.NoMatch; } }