private void EvaluateArgument( PlaywrightMember arg, Type playwrightSharpType, MethodInfo playwrightSharpMethod, StringBuilder report, List <object> membersQueue, Mismatch mismatches) { var types = arg.Type.Union.Any() ? arg.Type.Union : new[] { arg.Type }; foreach (var type in types.Where(t => t.Name != "null")) { var playwrightSharpArgument = playwrightSharpMethod.GetParameters().FirstOrDefault(p => IsParameterNameMatch(p.Name, arg.Name)); var mismatch = mismatches.Entities.FirstOrDefault(e => e.ClassName == playwrightSharpType.Name)? .Members.FirstOrDefault(m => m.MemberName == playwrightSharpMethod.Name)? .Arguments.FirstOrDefault(m => m.UpstreamArgumentName == arg.Name); if (playwrightSharpArgument != null) { if (!IsSameType(playwrightSharpArgument.ParameterType, type)) { // Look for a matching overload. var overloadMethod = GetBestMethodOverload(playwrightSharpType, playwrightSharpMethod.Name, arg.Name, type); if (overloadMethod != null) { membersQueue.Remove(overloadMethod); playwrightSharpArgument = overloadMethod.GetParameters().FirstOrDefault(p => IsParameterNameMatch(p.Name, arg.Name)); report.AppendLine("<li>"); report.AppendLine($"{arg.Name} ({type.Name.ToHtml()}): found as {playwrightSharpArgument.Name} ({playwrightSharpArgument.ParameterType})"); } else { report.AppendLine("<li style='color: coral'>"); report.AppendLine($"{playwrightSharpType.Name}.{arg.Name} ({type.Name.ToHtml()}): found as {playwrightSharpArgument.Name} but with type {playwrightSharpArgument.ParameterType} (PW001)"); if (mismatch == null && type.Name != "Object" && type.Name != "Array") { LogWarning("PW001", $"{playwrightSharpType.Name}.{playwrightSharpMethod.Name} => {arg.Name} ({type.Name.ToHtml()}): found as {playwrightSharpArgument.Name} but with type {playwrightSharpArgument.ParameterType}"); } } } else { report.AppendLine("<li>"); report.AppendLine($"{arg.Name} ({type.Name.ToHtml()}): found as {playwrightSharpArgument.Name} ({playwrightSharpArgument.ParameterType})"); } if (type.Name == "Object" || type.Name == "Array") { report.AppendLine("<ul>"); if (arg.Type.Properties != null) { foreach (var prop in arg.Type.Properties.Where(p => !p.Langs.Only.Any())) { // Look for a matching overload. var overrideMethod = GetBestMethodOverload(playwrightSharpType, playwrightSharpMethod.Name, arg.Name.ToLower(), type); if (overrideMethod != null) { playwrightSharpArgument = overrideMethod.GetParameters().FirstOrDefault(p => IsParameterNameMatch(p.Name, arg.Name)); } if (( playwrightSharpArgument.ParameterType.IsInterface || playwrightSharpArgument.ParameterType.IsClass) && playwrightSharpArgument.ParameterType != typeof(string)) { EvaluateProperty(prop, GetBaseType(playwrightSharpArgument.ParameterType), report, mismatches); } else { EvaluateArgument(prop, playwrightSharpType, playwrightSharpMethod, report, membersQueue, mismatches); } } } report.AppendLine("</ul>"); } report.AppendLine("</li>"); } else { // Look for a matching override. var overrideMethod = playwrightSharpType.GetMethods().FirstOrDefault(m => m.Name == playwrightSharpMethod.Name && m.GetParameters().Any(p => IsParameterNameMatch(p.Name, arg.Name.ToLower()) && IsSameType(p.ParameterType, type))); if (overrideMethod != null) { membersQueue.Remove(overrideMethod); playwrightSharpArgument = overrideMethod.GetParameters().FirstOrDefault(p => IsParameterNameMatch(p.Name, arg.Name)); report.AppendLine("<li>"); report.AppendLine($"{arg.Name} ({type.Name.ToHtml()}): found as {playwrightSharpArgument.Name} ({playwrightSharpArgument.ParameterType})"); } else { if (mismatch == null) { LogWarning("PW002", $"{playwrightSharpType.Name}.{playwrightSharpMethod.Name} => {arg.Name} argument not found."); report.AppendLine("<li style='color: red'>"); report.AppendLine($"{arg.Name} NOT FOUND (PW002)"); report.AppendLine("</li>"); } else { report.AppendLine("<li style='color: coral'>"); report.AppendLine($"{arg.Name} NOT FOUND => {mismatch.Justification}"); report.AppendLine("</li>"); } } } } }
private void EvaluateMethod( PlaywrightMember member, Type playwrightSharpType, StringBuilder report, List <object> membersQueue, Mismatch mismatches) { string memberName = TranslateMethodName(member.Name); var typeToCheck = playwrightSharpType; MethodInfo playwrightSharpMethod = null; if (memberName == "toString") { report.AppendLine("<li>"); report.AppendLine($"{memberName}: found as ToString"); report.AppendLine("</li>"); return; } while (typeToCheck != null) { playwrightSharpMethod = typeToCheck.GetMethods().FirstOrDefault(m => string.Equals(m.Name, memberName, StringComparison.OrdinalIgnoreCase)); if (playwrightSharpMethod == null) { playwrightSharpMethod = typeToCheck.GetMethods().FirstOrDefault(m => m.Name.ToLower() == memberName.ToLower() + "async"); } if (playwrightSharpMethod == null) { playwrightSharpMethod = typeToCheck.GetMethods().FirstOrDefault(m => m.Name.ToLower() == $"get{memberName.ToLower()}async"); } if (playwrightSharpMethod == null) { playwrightSharpMethod = typeToCheck.GetMethods().FirstOrDefault(m => m.Name.ToLower() == $"get{memberName.ToLower()}"); } if (playwrightSharpMethod != null) { break; } typeToCheck = typeToCheck.GetTypeInfo().ImplementedInterfaces.FirstOrDefault(); } if (playwrightSharpMethod != null) { membersQueue.Remove(playwrightSharpMethod); report.AppendLine("<li>"); report.AppendLine($"{memberName}: found as {playwrightSharpMethod.Name}"); report.AppendLine("<ul>"); if (member.Args != null) { foreach (var arg in member.Args.Where(a => !a.Langs.Only.Any())) { var matchingMethod = GetBestMethodOverload(playwrightSharpType, playwrightSharpMethod.Name, arg.Name); // we flatten options if (arg.Type.Properties?.Any() == true && (arg.Name == "options" || matchingMethod == null)) { foreach (var property in arg.Type.Properties.Where(p => !p.Langs.Only.Any())) { EvaluateArgument(property, typeToCheck, playwrightSharpMethod, report, membersQueue, mismatches); } } else { EvaluateArgument(arg, typeToCheck, matchingMethod ?? playwrightSharpMethod, report, membersQueue, mismatches); } } } report.AppendLine("</ul>"); report.AppendLine("</li>"); } else { var playwrightSharpProperty = playwrightSharpType.GetProperties().FirstOrDefault(p => string.Equals(p.Name, memberName, StringComparison.OrdinalIgnoreCase)); if (playwrightSharpProperty == null && memberName.StartsWith("set")) { playwrightSharpProperty = playwrightSharpType.GetProperties().FirstOrDefault(p => string.Equals(p.Name, memberName.Substring(3, memberName.Length - 3), StringComparison.OrdinalIgnoreCase)); } if (playwrightSharpProperty != null) { membersQueue.Remove(playwrightSharpProperty); report.AppendLine("<li>"); report.AppendLine($"{memberName}: found as as Property {playwrightSharpProperty.Name}"); report.AppendLine("</li>"); } else { var mismatch = mismatches.Entities.FirstOrDefault(e => e.ClassName == playwrightSharpType.Name)? .Members.FirstOrDefault(m => m.UpstreamMemberName == memberName); if (mismatch == null) { LogWarning("PW007", $"{playwrightSharpType.Name}.{memberName} not found"); report.AppendLine("<li style='color: red'>"); report.AppendLine($"{memberName} NOT FOUND (PW007)"); report.AppendLine("</li>"); } else { report.AppendLine("<li style='color: coral'>"); report.AppendLine($"{memberName} NOT FOUND ==> {mismatch.Justification}</span>"); report.AppendLine("</li>"); } } } }