private IReadOnlyList <ScriptExportMethod> CreateMethods(IScriptExportManager manager)
        {
            if (Definition == null || Definition.BaseType == null || Definition.BaseType.Module == null)
            {
                return(Array.Empty <ScriptExportMethod>());
            }

            // we need to export only such properties that are declared as asbtract inside builin assemblies
            // and not overridden anywhere except current type
            List <MethodDefinition> overrides = new List <MethodDefinition>();

            foreach (MethodDefinition method in Definition.Methods)
            {
                if (method.IsVirtual && method.IsReuseSlot && !method.IsGetter && !method.IsSetter)
                {
                    overrides.Add(method);
                }
            }

            List <ScriptExportMethod> methods    = new List <ScriptExportMethod>();
            MonoTypeContext           context    = new MonoTypeContext(Definition);
            TypeDefinition            definition = Definition;

            while (true)
            {
                if (overrides.Count == 0)
                {
                    break;
                }
                if (definition.BaseType == null || definition.BaseType.Module == null)
                {
                    break;
                }

                context    = context.GetBase();
                definition = context.Type.Resolve();
                if (definition == null)
                {
                    break;
                }

                string module    = GetModuleName(definition);
                bool   isBuiltIn = ScriptExportManager.IsBuiltinLibrary(module);
                IReadOnlyDictionary <GenericParameter, TypeReference> arguments = context.GetContextArguments();
                // definition is a Template for GenericInstance, so we must recreate context
                MonoTypeContext definitionContext = new MonoTypeContext(definition, arguments);
                foreach (MethodDefinition method in definition.Methods)
                {
                    if (method.IsVirtual && (method.IsNewSlot || method.IsReuseSlot))
                    {
                        for (int i = 0; i < overrides.Count; i++)
                        {
                            MethodDefinition @override = overrides[i];
                            if (MonoUtils.AreSame(@override, definitionContext, method))
                            {
                                if (isBuiltIn && method.IsAbstract)
                                {
                                    ScriptExportMethod exportMethod = manager.RetrieveMethod(@override);
                                    methods.Add(exportMethod);
                                }

                                overrides.RemoveAt(i);
                                break;
                            }
                        }
                    }
                }
            }
            return(methods.ToArray());
        }