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()); }