Boo.Lang.Compiler.Steps.IntroduceModuleClasses.OnModule C# (CSharp) Метод

OnModule() публичный Метод

public OnModule ( Module node ) : void
node Boo.Lang.Compiler.Ast.Module
Результат void
        public override void OnModule(Module node)
        {
            bool hasModuleClass = true;
            ClassDefinition moduleClass = FindModuleClass(node);
            if (null == moduleClass)
            {
                moduleClass = new ClassDefinition();
                moduleClass.IsSynthetic = true;
                hasModuleClass = false;
            }

            Method entryPoint = moduleClass.Members["Main"] as Method;

            int removed = 0;
            TypeMember[] members = node.Members.ToArray();
            for (int i=0; i<members.Length; ++i)
            {
                TypeMember member = members[i];
                if (member is TypeDefinition) continue;
                if (member.NodeType == NodeType.Method)
                {
                    if (EntryPointMethodName == member.Name)
                    {
                        entryPoint = (Method)member;
                    }
                    member.Modifiers |= TypeMemberModifiers.Static;
                }
                node.Members.RemoveAt(i-removed);
                moduleClass.Members.Add(member);
                ++removed;
            }

            if (node.Globals.Statements.Count > 0)
            {
                Method method = new Method(node.Globals.LexicalInfo);
                method.IsSynthetic = true;
                method.Parameters.Add(new ParameterDeclaration("argv", new ArrayTypeReference(new SimpleTypeReference("string"))));
                method.ReturnType = CodeBuilder.CreateTypeReference(TypeSystemServices.VoidType);
                method.Body = node.Globals;
                method.Name = EntryPointMethodName;
                method.Modifiers = TypeMemberModifiers.Static | TypeMemberModifiers.Private;
                moduleClass.Members.Add(method);

                node.Globals = null;
                entryPoint = method;
            }

            if (null != entryPoint)
            {
                ContextAnnotations.SetEntryPoint(Context, entryPoint);
            }

            if (hasModuleClass || _forceModuleClass || (moduleClass.Members.Count > 0))
            {
                if (!hasModuleClass)
                {
                    moduleClass.Name = BuildModuleClassName(node);
                    moduleClass.Attributes.Add(CreateBooModuleAttribute());
                    node.Members.Add(moduleClass);
                }

                moduleClass.Members.Add(AstUtil.CreateConstructor(node, TypeMemberModifiers.Private));
                moduleClass.Modifiers = TypeMemberModifiers.Public |
                                        TypeMemberModifiers.Final |
                                        TypeMemberModifiers.Transient;

                ((ModuleEntity)node.Entity).InitializeModuleClass(moduleClass);
            }
        }