void AddCreatorDocs(CodeTypeDeclaration type, CodeMemberMethod method, int w, int n) { var tp = Types.GetTypeParameter(w, n); var idx = XmlDocs.GetIndex(tp); var fold = type.GetMethods("Fold").First(); method.Comments.AddDocs( XmlDocs.Param("value", " A <typeparamref name=\"" + tp + "\" /> containing the value", " to provide to the " + idx, " " + XmlDocs.See(DefaultNamespace, type, fold), " delegate." ), XmlDocs.Summary( " Creates a " + XmlDocs.See(DefaultNamespace, type) + " instance which", " holds a <typeparamref name=\"" + tp + "\" /> value." ), XmlDocs.Returns( " A " + XmlDocs.See(DefaultNamespace, type) + " instance which holds a ", " holds a <typeparamref name=\"" + tp + "\" /> value." ), XmlDocs.Remarks( " <para>", " When", " " + XmlDocs.See(DefaultNamespace, type, fold), " is invoked,", " the returned " + XmlDocs.See(DefaultNamespace, type) + " instance", " will invoke the " + idx + " delegate", " for conversions.", " </para>" ), XmlDocs.ArgumentNullException("value") ); }
CodeMemberMethod CreateCreator(CodeTypeDeclaration type, int w, int n) { var m = new CodeMemberMethod() { Attributes = MemberAttributes.Public | MemberAttributes.Static, Name = ((char)('A' + w)).ToString(), ReturnType = GetEitherType(n), }; m.Parameters.Add(new CodeParameterDeclarationExpression(Types.GetTypeParameter(w, n), "value")); m.Statements.ThrowWhenArgumentIsNull("value"); m.Statements.Add( new CodeMethodReturnStatement( new CodeObjectCreateExpression(A(w) + "Handler", new CodeVariableReferenceExpression("value")))); return(m); }
IEnumerable <string> GetFoldParametersDocs(CodeTypeDeclaration type, int n) { for (int i = 0; i < n; ++i) { var tp = Types.GetTypeParameter(i, n); yield return("<param name=\"" + a(i) + "\">"); yield return(" A <see cref=\"T:System.Func{" + tp + ",TResult}\" /> "); yield return(" used if the " + XmlDocs.See(DefaultNamespace, type) + " stores a "); yield return(" <typeparamref name=\"" + tp + "\" /> value into a "); yield return(" <typeparamref name=\"TResult\" /> value."); yield return("</param>"); } }
static CodeTypeDeclaration CreateHandler(int w, int n) { var h = new CodeTypeDeclaration(A(w) + "Handler") { TypeAttributes = TypeAttributes.NestedPrivate, }; h.BaseTypes.Add(GetEitherType(n)); h.Members.Add(new CodeMemberField(Types.GetTypeParameter(w, n), "_value") { Attributes = MemberAttributes.Final | MemberAttributes.Private, }); var c = new CodeConstructor() { Attributes = MemberAttributes.Public, }; c.Parameters.Add(new CodeParameterDeclarationExpression(Types.GetTypeParameter(w, n), "value")); c.Statements.Add( new CodeAssignStatement( new CodeVariableReferenceExpression("_value"), new CodeVariableReferenceExpression("value"))); h.Members.Add(c); // public override int GetHashCode (); var m = new CodeMemberMethod() { Attributes = MemberAttributes.Public | MemberAttributes.Override, Name = "GetHashCode", ReturnType = new CodeTypeReference(typeof(int)), }; m.Statements.Add( new CodeMethodReturnStatement( new CodeMethodInvokeExpression( new CodeVariableReferenceExpression("_value"), "GetHashCode"))); h.Members.Add(m); // public override bool Equals (object obj); m = new CodeMemberMethod() { Attributes = MemberAttributes.Public | MemberAttributes.Override, Name = "Equals", ReturnType = new CodeTypeReference(typeof(bool)), }; m.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference(typeof(object)), "obj")); m.Statements.Add(new CodeSnippetStatement(string.Format(" {0} o = obj as {0};", A(w) + "Handler"))); m.Statements.Add(new CodeConditionStatement( new CodeBinaryOperatorExpression( new CodeVariableReferenceExpression("o"), CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression(null)), new CodeMethodReturnStatement(new CodePrimitiveExpression(false)))); m.Statements.Add(new CodeMethodReturnStatement( new CodeMethodInvokeExpression( new CodeMethodReferenceExpression( new CodeThisReferenceExpression(), "Equals"), new CodeVariableReferenceExpression("o")))); h.Members.Add(m); // public override bool Equals (Either<...> obj); m = new CodeMemberMethod() { Attributes = MemberAttributes.Public | MemberAttributes.Override, Name = "Equals", ReturnType = new CodeTypeReference(typeof(bool)), }; m.Parameters.Add(new CodeParameterDeclarationExpression(GetEitherType(n), "obj")); m.Statements.Add(new CodeSnippetStatement(string.Format(" {0} o = obj as {0};", A(w) + "Handler"))); m.Statements.Add(new CodeConditionStatement( new CodeBinaryOperatorExpression( new CodeVariableReferenceExpression("o"), CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression(null)), new CodeMethodReturnStatement(new CodePrimitiveExpression(false)))); m.Statements.Add( new CodeMethodReturnStatement( new CodeMethodInvokeExpression( new CodePropertyReferenceExpression( new CodeTypeReferenceExpression( new CodeTypeReference("System.Collections.Generic.EqualityComparer", new CodeTypeReference(new CodeTypeParameter(Types.GetTypeParameter(w, n))))), "Default"), "Equals", new CodeVariableReferenceExpression("this._value"), new CodeVariableReferenceExpression("o._value")))); h.Members.Add(m); // public override TResult Fold<TResult>(...); m = new CodeMemberMethod() { Attributes = MemberAttributes.Public | MemberAttributes.Override, Name = "Fold", ReturnType = new CodeTypeReference(new CodeTypeParameter("TResult")), }; m.TypeParameters.Add(new CodeTypeParameter("TResult")); for (int i = 0; i < n; ++i) { m.Parameters.Add( new CodeParameterDeclarationExpression(GetFoldParameterType(i, n), a(i))); } m.Statements.Add( new CodeMethodInvokeExpression( new CodeMethodReferenceExpression(null, "CheckFolders"), Enumerable.Range(0, n).Select(i => new CodeVariableReferenceExpression(a(i))).ToArray())); m.Statements.Add( new CodeMethodReturnStatement( new CodeDelegateInvokeExpression( new CodeVariableReferenceExpression(a(w)), new CodeVariableReferenceExpression("_value")))); h.Members.Add(m); return(h); }
static CodeTypeReference GetFoldParameterType(int i, int n) { return(new CodeTypeReference("System.Func", new CodeTypeReference(Types.GetTypeParameter(i, n)), new CodeTypeReference(new CodeTypeParameter("TResult")))); }