Boo.Lang.Compiler.Steps.BindTypeMembers.CreateEventRaiseMethod C# (CSharp) Method

CreateEventRaiseMethod() private method

private CreateEventRaiseMethod ( Boo.Lang.Compiler.Ast.Event node, Boo.Lang.Compiler.Ast.Field backingField ) : Method
node Boo.Lang.Compiler.Ast.Event
backingField Boo.Lang.Compiler.Ast.Field
return Boo.Lang.Compiler.Ast.Method
        Method CreateEventRaiseMethod(Event node, Field backingField)
        {
            TypeMemberModifiers modifiers = RemoveAccessiblityModifiers(node.Modifiers);
            if (node.IsPrivate)
            {
                modifiers |= TypeMemberModifiers.Private;
            }
            else
            {
                modifiers |= TypeMemberModifiers.Protected | TypeMemberModifiers.Internal;
            }

            Method method = CodeBuilder.CreateMethod("raise_" + node.Name,
                TypeSystemServices.VoidType,
                modifiers);

            ICallableType type = GetEntity(node.Type) as ICallableType;
            if (null != type)
            {
                int index = CodeBuilder.GetFirstParameterIndex(node);
                foreach (IParameter parameter in type.GetSignature().Parameters)
                {
                    method.Parameters.Add(
                        CodeBuilder.CreateParameterDeclaration(
                        index,
                        parameter.Name,
                        parameter.Type,
                        parameter.IsByRef));
                    ++index;
                }
            }

            MethodInvocationExpression mie = CodeBuilder.CreateMethodInvocation(
                CodeBuilder.CreateReference(backingField),
                NameResolutionService.ResolveMethod(GetType(backingField.Type), "Invoke"));
            foreach (ParameterDeclaration parameter in method.Parameters)
            {
                mie.Arguments.Add(CodeBuilder.CreateReference(parameter));
            }

            IfStatement stmt = new IfStatement(node.LexicalInfo);
            stmt.Condition = CodeBuilder.CreateNotNullTest(
                CodeBuilder.CreateReference(backingField));
            stmt.TrueBlock = new Block();
            stmt.TrueBlock.Add(mie);
            method.Body.Add(stmt);
            return method;
        }