private static void ImplementInterfaceMethods(Class @class, Class @interface) { var parameterTypeComparer = new ParameterTypeComparer(); foreach (var method in @interface.Methods) { if (@class.Methods.Any(m => m.OriginalName == method.OriginalName && m.Parameters.SequenceEqual(method.Parameters, parameterTypeComparer))) { continue; } var impl = new Method(method) { Namespace = @class, IsVirtual = false, IsOverride = false }; var rootBaseMethod = @class.GetRootBaseMethod(method, true); if (rootBaseMethod != null && rootBaseMethod.IsDeclared) { impl.ExplicitInterfaceImpl = @interface; } @class.Methods.Add(impl); } foreach (var @base in @interface.Bases) { ImplementInterfaceMethods(@class, @base.Class); } }
private static List <Method> GetRelevantAbstractMethods(Class @class) { var abstractMethods = GetAbstractMethods(@class); var overriddenMethods = GetOverriddenMethods(@class); var paramTypeCmp = new ParameterTypeComparer(); for (var i = abstractMethods.Count - 1; i >= 0; i--) { var @abstract = abstractMethods[i]; if (overriddenMethods.Find(m => m.Name == @abstract.Name && m.ReturnType == @abstract.ReturnType && m.Parameters.SequenceEqual(@abstract.Parameters, paramTypeCmp)) != null) { abstractMethods.RemoveAt(i); } } return(abstractMethods); }
private static IEnumerable <Method> GetRelevantAbstractMethods(Class @class) { var abstractMethods = GetAbstractMethods(@class); var overriddenMethods = GetOverriddenMethods(@class); var paramTypeCmp = new ParameterTypeComparer(); for (var i = abstractMethods.Count - 1; i >= 0; i--) { var @abstract = abstractMethods[i]; var @override = overriddenMethods.Find(m => m.Name == @abstract.Name && m.ReturnType == @abstract.ReturnType && m.Parameters.SequenceEqual(@abstract.Parameters, paramTypeCmp)); if (@override != null) { if (@abstract.IsOverride) { var abstractMethod = abstractMethods[i]; bool found; var rootBaseMethod = abstractMethod; do { rootBaseMethod = @class.GetBaseMethod(rootBaseMethod, false, true); if (found = (rootBaseMethod == @override)) { break; } } while (rootBaseMethod != null); if (!found) { abstractMethods.RemoveAt(i); } } else { abstractMethods.RemoveAt(i); } } } return(abstractMethods); }
private static void ImplementInterfaceMethods(Class @class, Class @interface) { var parameterTypeComparer = new ParameterTypeComparer(); foreach (var method in @interface.Methods) { if (@class.Methods.Any(m => m.OriginalName == method.OriginalName && m.Parameters.SequenceEqual(method.Parameters, parameterTypeComparer))) continue; var impl = new Method(method) { Namespace = @class, IsVirtual = false, IsOverride = false }; var rootBaseMethod = @class.GetRootBaseMethod(method, true); if (rootBaseMethod != null && rootBaseMethod.IsDeclared) impl.ExplicitInterfaceImpl = @interface; @class.Methods.Add(impl); } foreach (var @base in @interface.Bases) ImplementInterfaceMethods(@class, @base.Class); }
private static IEnumerable<Method> GetRelevantAbstractMethods(Class @class) { var abstractMethods = GetAbstractMethods(@class); var overriddenMethods = GetOverriddenMethods(@class); var paramTypeCmp = new ParameterTypeComparer(); for (var i = abstractMethods.Count - 1; i >= 0; i--) { var @abstract = abstractMethods[i]; var @override = overriddenMethods.Find(m => m.Name == @abstract.Name && m.ReturnType == @abstract.ReturnType && m.Parameters.SequenceEqual(@abstract.Parameters, paramTypeCmp)); if (@override != null) { if (@abstract.IsOverride) { var abstractMethod = abstractMethods[i]; bool found; var rootBaseMethod = abstractMethod; do { rootBaseMethod = @class.GetRootBaseMethod(rootBaseMethod, false, true); if (found = (rootBaseMethod == @override)) break; } while (rootBaseMethod != null); if (!found) abstractMethods.RemoveAt(i); } else { abstractMethods.RemoveAt(i); } } } return abstractMethods; }
private static List<Method> GetRelevantAbstractMethods(Class @class) { var abstractMethods = GetAbstractMethods(@class); var overriddenMethods = GetOverriddenMethods(@class); var paramTypeCmp = new ParameterTypeComparer(); for (int i = abstractMethods.Count - 1; i >= 0; i--) { var @abstract = abstractMethods[i]; if (overriddenMethods.Find(m => m.Name == @abstract.Name && m.ReturnType == @abstract.ReturnType && m.Parameters.Count == @abstract.Parameters.Count && m.Parameters.SequenceEqual(@abstract.Parameters, paramTypeCmp)) != null) { abstractMethods.RemoveAt(i); } } return abstractMethods; }
private void DocumentSignalEvent(CodeTypeDeclaration type, CodeMemberMethod signal, IEnumerable<CodeMemberMethod> methods, CodeTypeMember signalEvent, string signature) { IEqualityComparer<CodeParameterDeclarationExpression> parameterTypeComparer = new ParameterTypeComparer(); var signalArgs = signal.Parameters.Cast<CodeParameterDeclarationExpression>().ToList(); foreach (CodeMemberMethod method in from method in methods where (method.Name == signal.Name || method.Name == "On" + signal.Name) select method) { int skip = 0; var args = method.Parameters.Cast<CodeParameterDeclarationExpression>().ToList(); while (true) { if ((method.Parameters.Count - skip == signal.Parameters.Count && args.Take(args.Count - skip).SequenceEqual(signalArgs.Take(signalArgs.Count), parameterTypeComparer))) { for (int i = 0; i < signal.Parameters.Count; i++) { CodeParameterDeclarationExpression parameter = signal.Parameters[i]; if (parameter.Name.StartsWith("arg") && parameter.Name.Length > 3 && char.IsDigit(parameter.Name[3])) { parameter.Name = method.Parameters[i].Name; } } signalEvent.Comments.AddRange(method.Comments); signal.Comments.AddRange(method.Comments); return; } if (args.Count == 0 || !args[args.Count - 1 - skip].Name.Contains(" = ") || skip >= args.Count) { break; } ++skip; } } this.documentation.DocumentMember(signature, signalEvent, type); }