示例#1
0
        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>");
                        }
                    }
                }
            }
        }
示例#2
0
        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>");
                    }
                }
            }
        }