protected override IEnumerable <string> GenerateCode(List <object> includedMembers) { foreach (IMember member in includedMembers) { var invokeMethod = member.ReturnType.GetDelegateInvokeMethod(); if (invokeMethod == null) { continue; } var methodDeclaration = new MethodDeclaration() { Name = GetEventMethodName(member), ReturnType = new PrimitiveType("void"), Modifiers = Modifiers.Protected | Modifiers.Virtual, Parameters = { new ParameterDeclaration(Options.CreateShortType(invokeMethod.Parameters [1].Type), invokeMethod.Parameters [1].Name) }, Body = new BlockStatement() { new VariableDeclarationStatement( new SimpleType("var"), //Options.CreateShortType (member.ReturnType), handlerName, new MemberReferenceExpression(new ThisReferenceExpression(), member.Name) ), new IfElseStatement() { Condition = new BinaryOperatorExpression(new IdentifierExpression(handlerName), BinaryOperatorType.InEquality, new PrimitiveExpression(null)), TrueStatement = new ExpressionStatement(new InvocationExpression(new IdentifierExpression(handlerName)) { Arguments = { new ThisReferenceExpression(), new IdentifierExpression(invokeMethod.Parameters [1].Name) } }) } } }; yield return(methodDeclaration.GetText(Options.FormattingOptions)); } }
protected override IEnumerable <string> GenerateCode(List <object> includedMembers) { // Genereate Equals var methodDeclaration = new MethodDeclaration(); methodDeclaration.Name = "Equals"; methodDeclaration.ReturnType = new PrimitiveType("bool"); methodDeclaration.Modifiers = ICSharpCode.NRefactory.PlayScript.Modifiers.Public | ICSharpCode.NRefactory.PlayScript.Modifiers.Override; methodDeclaration.Body = new BlockStatement(); methodDeclaration.Parameters.Add(new ParameterDeclaration(new PrimitiveType("object"), "obj")); var paramId = new IdentifierExpression("obj"); IfElseStatement ifStatement = new IfElseStatement(); ifStatement.Condition = new BinaryOperatorExpression(paramId, BinaryOperatorType.Equality, new PrimitiveExpression(null)); ifStatement.TrueStatement = new ReturnStatement(new PrimitiveExpression(false)); methodDeclaration.Body.Statements.Add(ifStatement); ifStatement = new IfElseStatement(); var arguments = new List <Expression> (); arguments.Add(new ThisReferenceExpression()); arguments.Add(paramId.Clone()); ifStatement.Condition = new InvocationExpression(new IdentifierExpression("ReferenceEquals"), arguments); ifStatement.TrueStatement = new ReturnStatement(new PrimitiveExpression(true)); methodDeclaration.Body.Statements.Add(ifStatement); ifStatement = new IfElseStatement(); ifStatement.Condition = new BinaryOperatorExpression(new InvocationExpression(new MemberReferenceExpression(paramId.Clone(), "GetType")), BinaryOperatorType.InEquality, new TypeOfExpression(new SimpleType(Options.EnclosingType.Name))); ifStatement.TrueStatement = new ReturnStatement(new PrimitiveExpression(false)); methodDeclaration.Body.Statements.Add(ifStatement); var varType = new SimpleType(Options.EnclosingType.Name); var varDecl = new VariableDeclarationStatement(varType, "other", new CastExpression(varType.Clone(), paramId.Clone())); methodDeclaration.Body.Statements.Add(varDecl); var otherId = new IdentifierExpression("other"); Expression binOp = null; foreach (IMember member in includedMembers) { Expression right = new BinaryOperatorExpression(new IdentifierExpression(member.Name), BinaryOperatorType.Equality, new MemberReferenceExpression(otherId.Clone(), member.Name)); if (binOp == null) { binOp = right; } else { binOp = new BinaryOperatorExpression(binOp, BinaryOperatorType.ConditionalAnd, right); } } methodDeclaration.Body.Statements.Add(new ReturnStatement(binOp)); yield return(methodDeclaration.GetText(Options.FormattingOptions)); methodDeclaration = new MethodDeclaration(); methodDeclaration.Name = "GetHashCode"; methodDeclaration.ReturnType = new PrimitiveType("int"); methodDeclaration.Modifiers = ICSharpCode.NRefactory.PlayScript.Modifiers.Public | ICSharpCode.NRefactory.PlayScript.Modifiers.Override; methodDeclaration.Body = new BlockStatement(); binOp = null; foreach (IMember member in includedMembers) { Expression right; right = new InvocationExpression(new MemberReferenceExpression(new IdentifierExpression(member.Name), "GetHashCode")); IType type = member.ReturnType; if (type != null && type.Kind != TypeKind.Struct && type.Kind != TypeKind.Enum) { right = new ParenthesizedExpression(new ConditionalExpression(new BinaryOperatorExpression(new IdentifierExpression(member.Name), BinaryOperatorType.InEquality, new PrimitiveExpression(null)), right, new PrimitiveExpression(0))); } if (binOp == null) { binOp = right; } else { binOp = new BinaryOperatorExpression(binOp, BinaryOperatorType.ExclusiveOr, right); } } var uncheckedBlock = new BlockStatement(); uncheckedBlock.Statements.Add(new ReturnStatement(binOp)); methodDeclaration.Body.Statements.Add(new UncheckedStatement(uncheckedBlock)); yield return(methodDeclaration.GetText(Options.FormattingOptions)); }
protected override IEnumerable<string> GenerateCode (List<object> includedMembers) { // Genereate Equals var methodDeclaration = new MethodDeclaration (); methodDeclaration.Name = "Equals"; methodDeclaration.ReturnType = new PrimitiveType ("bool"); methodDeclaration.Modifiers = ICSharpCode.NRefactory.CSharp.Modifiers.Public | ICSharpCode.NRefactory.CSharp.Modifiers.Override; methodDeclaration.Body = new BlockStatement (); methodDeclaration.Parameters.Add (new ParameterDeclaration (new PrimitiveType ("object"), "obj")); var paramId = new IdentifierExpression ("obj"); IfElseStatement ifStatement = new IfElseStatement (); ifStatement.Condition = new BinaryOperatorExpression (paramId, BinaryOperatorType.Equality, new PrimitiveExpression (null)); ifStatement.TrueStatement = new ReturnStatement (new PrimitiveExpression (false)); methodDeclaration.Body.Statements.Add (ifStatement); ifStatement = new IfElseStatement (); var arguments = new List<Expression> (); arguments.Add (new ThisReferenceExpression ()); arguments.Add (paramId.Clone ()); ifStatement.Condition = new InvocationExpression (new IdentifierExpression ("ReferenceEquals"), arguments); ifStatement.TrueStatement = new ReturnStatement (new PrimitiveExpression (true)); methodDeclaration.Body.Statements.Add (ifStatement); ifStatement = new IfElseStatement (); ifStatement.Condition = new BinaryOperatorExpression (new InvocationExpression (new MemberReferenceExpression (paramId.Clone (), "GetType")), BinaryOperatorType.InEquality, new TypeOfExpression (new SimpleType (Options.EnclosingType.Name))); ifStatement.TrueStatement = new ReturnStatement (new PrimitiveExpression (false)); methodDeclaration.Body.Statements.Add (ifStatement); var varType = new SimpleType (Options.EnclosingType.Name); var varDecl = new VariableDeclarationStatement (varType, "other", new CastExpression (varType.Clone (), paramId.Clone ())); methodDeclaration.Body.Statements.Add (varDecl); var otherId = new IdentifierExpression ("other"); Expression binOp = null; foreach (IMember member in includedMembers) { Expression right = new BinaryOperatorExpression (new IdentifierExpression (member.Name), BinaryOperatorType.Equality, new MemberReferenceExpression (otherId.Clone (), member.Name)); if (binOp == null) { binOp = right; } else { binOp = new BinaryOperatorExpression (binOp, BinaryOperatorType.ConditionalAnd, right); } } methodDeclaration.Body.Statements.Add (new ReturnStatement (binOp)); yield return methodDeclaration.GetText (Options.FormattingOptions); methodDeclaration = new MethodDeclaration (); methodDeclaration.Name = "GetHashCode"; methodDeclaration.ReturnType = new PrimitiveType ("int"); methodDeclaration.Modifiers = ICSharpCode.NRefactory.CSharp.Modifiers.Public | ICSharpCode.NRefactory.CSharp.Modifiers.Override; methodDeclaration.Body = new BlockStatement (); binOp = null; foreach (IMember member in includedMembers) { Expression right; right = new InvocationExpression (new MemberReferenceExpression (new IdentifierExpression (member.Name), "GetHashCode")); IType type = member.ReturnType; if (type != null && type.Kind != TypeKind.Struct && type.Kind != TypeKind.Enum) right = new ParenthesizedExpression (new ConditionalExpression (new BinaryOperatorExpression (new IdentifierExpression (member.Name), BinaryOperatorType.InEquality, new PrimitiveExpression (null)), right, new PrimitiveExpression (0))); if (binOp == null) { binOp = right; } else { binOp = new BinaryOperatorExpression (binOp, BinaryOperatorType.ExclusiveOr, right); } } var uncheckedBlock = new BlockStatement (); uncheckedBlock.Statements.Add (new ReturnStatement (binOp)); methodDeclaration.Body.Statements.Add (new UncheckedStatement (uncheckedBlock)); yield return methodDeclaration.GetText (Options.FormattingOptions); }
protected override IEnumerable<string> GenerateCode (List<object> includedMembers) { foreach (IMember member in includedMembers) { var invokeMethod = member.ReturnType.GetDelegateInvokeMethod (); if (invokeMethod == null) continue; var methodDeclaration = new MethodDeclaration () { Name = GetEventMethodName (member), ReturnType = new PrimitiveType ("void"), Modifiers = Modifiers.Protected | Modifiers.Virtual, Parameters = { new ParameterDeclaration (Options.CreateShortType (invokeMethod.Parameters [1].Type), invokeMethod.Parameters [1].Name) }, Body = new BlockStatement () { new VariableDeclarationStatement ( new SimpleType ("var"),//Options.CreateShortType (member.ReturnType), handlerName, new MemberReferenceExpression (new ThisReferenceExpression (), member.Name) ), new IfElseStatement () { Condition = new BinaryOperatorExpression (new IdentifierExpression (handlerName), BinaryOperatorType.InEquality, new PrimitiveExpression (null)), TrueStatement = new ExpressionStatement (new InvocationExpression (new IdentifierExpression (handlerName)) { Arguments = { new ThisReferenceExpression (), new IdentifierExpression (invokeMethod.Parameters [1].Name) } }) } } }; yield return methodDeclaration.GetText (Options.FormattingOptions); } }