private IReadOnlyList <ScriptExportProperty> CreateProperties(IScriptExportManager manager) { if (Definition == null || Definition.BaseType == null || Definition.BaseType.Module == null) { return(Array.Empty <ScriptExportProperty>()); } // we need to export only such properties that are declared as asbtract inside builin assemblies // and not overridden anywhere except current type List <PropertyDefinition> overrides = new List <PropertyDefinition>(); foreach (PropertyDefinition property in Definition.Properties) { MethodDefinition method = property.GetMethod == null ? property.SetMethod : property.GetMethod; if (method.IsVirtual && method.IsReuseSlot) { overrides.Add(property); } } List <ScriptExportProperty> properties = new List <ScriptExportProperty>(); 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(context.Type); bool isBuiltIn = ScriptExportManager.IsBuiltinLibrary(module); foreach (PropertyDefinition property in definition.Properties) { MethodDefinition method = property.GetMethod == null ? property.SetMethod : property.GetMethod; if (method.IsVirtual && (method.IsNewSlot || method.IsReuseSlot)) { for (int i = 0; i < overrides.Count; i++) { PropertyDefinition @override = overrides[i]; if (@override.Name == property.Name) { if (isBuiltIn && method.IsAbstract) { ScriptExportProperty exportProperty = manager.RetrieveProperty(@override); properties.Add(exportProperty); } overrides.RemoveAt(i); break; } } } } } return(properties.ToArray()); }
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()); }