diff --git a/Editor/Attributes/SerializeReferenceButtonAttributeDrawer.cs b/Editor/Attributes/SerializeReferenceButtonAttributeDrawer.cs index e266bde..3353d9b 100644 --- a/Editor/Attributes/SerializeReferenceButtonAttributeDrawer.cs +++ b/Editor/Attributes/SerializeReferenceButtonAttributeDrawer.cs @@ -1,5 +1,6 @@ #if UNITY_EDITOR - +using System; +using System.Collections.Generic; using UnityEditor; using UnityEngine; @@ -12,15 +13,13 @@ public class SerializeReferenceButtonAttributeDrawer : PropertyDrawer } public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) - { + { + EditorGUI.BeginProperty(position, label, property); - - EditorGUI.BeginProperty(position, label, property); - - var labelPosition = new Rect(position.x, position.y, position.width, EditorGUIUtility.singleLineHeight); - EditorGUI.LabelField(labelPosition, label); - - var typeRestrictions = SerializedReferenceUIDefaultTypeRestrictions.GetAllBuiltInTypeRestrictions(fieldInfo); + Rect labelPosition = new Rect(position.x, position.y, position.width, EditorGUIUtility.singleLineHeight); + EditorGUI.LabelField(labelPosition, label); + + IEnumerable> typeRestrictions = SerializedReferenceUIDefaultTypeRestrictions.GetAllBuiltInTypeRestrictions(fieldInfo); property.DrawSelectionButtonForManagedReference(position, typeRestrictions); EditorGUI.PropertyField(position, property, GUIContent.none, true); diff --git a/Editor/Attributes/SerializeReferenceMenuAttributeDrawer.cs b/Editor/Attributes/SerializeReferenceMenuAttributeDrawer.cs index 4c1f71a..89aa9ab 100644 --- a/Editor/Attributes/SerializeReferenceMenuAttributeDrawer.cs +++ b/Editor/Attributes/SerializeReferenceMenuAttributeDrawer.cs @@ -1,5 +1,6 @@ #if UNITY_EDITOR - +using System; +using System.Collections.Generic; using UnityEditor; using UnityEngine; @@ -14,13 +15,12 @@ public class SerializeReferenceMenuAttributeDrawer : PropertyDrawer public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { EditorGUI.BeginProperty(position, label, property); - - var typeRestrictions = SerializedReferenceUIDefaultTypeRestrictions.GetAllBuiltInTypeRestrictions(fieldInfo); + + IEnumerable> typeRestrictions = SerializedReferenceUIDefaultTypeRestrictions.GetAllBuiltInTypeRestrictions(fieldInfo); property.ShowContextMenuForManagedReferenceOnMouseMiddleButton(position, typeRestrictions); EditorGUI.PropertyField(position, property, true); EditorGUI.EndProperty(); } } -#endif - +#endif \ No newline at end of file diff --git a/Editor/Core/ManagedReferenceUtility.cs b/Editor/Core/ManagedReferenceUtility.cs index b624883..ff81572 100644 --- a/Editor/Core/ManagedReferenceUtility.cs +++ b/Editor/Core/ManagedReferenceUtility.cs @@ -1,5 +1,4 @@ #if UNITY_EDITOR - using System; using System.Collections.Generic; using System.Linq; @@ -12,7 +11,7 @@ public static class ManagedReferenceUtility /// Creates instance of passed type and assigns it to managed reference public static object AssignNewInstanceOfTypeToManagedReference(this SerializedProperty serializedProperty, Type type) { - var instance = Activator.CreateInstance(type); + object instance = Activator.CreateInstance(type); serializedProperty.serializedObject.Update(); serializedProperty.managedReferenceValue = instance; @@ -32,34 +31,44 @@ public static class ManagedReferenceUtility /// Collects appropriate types based on managed reference field type and filters. Filters all derive public static IEnumerable GetAppropriateTypesForAssigningToManagedReference(this SerializedProperty property, List> filters = null) { - var fieldType = property.GetManagedReferenceFieldType(); + Type fieldType = property.GetManagedReferenceFieldType(); return GetAppropriateTypesForAssigningToManagedReference(fieldType, filters); } /// Filters derived types of field typ parameter and finds ones whose are compatible with managed reference and filters. public static IEnumerable GetAppropriateTypesForAssigningToManagedReference(Type fieldType, List> filters = null) { - var appropriateTypes = new List(); + List appropriateTypes = new List(); // Get and filter all appropriate types - var derivedTypes = TypeCache.GetTypesDerivedFrom(fieldType); - foreach (var type in derivedTypes) + TypeCache.TypeCollection derivedTypes = TypeCache.GetTypesDerivedFrom(fieldType); + foreach (Type type in derivedTypes) { // Skips unity engine Objects (because they are not serialized by SerializeReference) if (type.IsSubclassOf(typeof(Object))) + { continue; + } // Skip abstract classes because they should not be instantiated if (type.IsAbstract) + { continue; - // Skip generic classes because they can not be instantiated + } + // Skip generic classes because they can not be instantiated if (type.ContainsGenericParameters) + { continue; + } // Skip types that has no public empty constructors (activator can not create them) if (type.IsClass && type.GetConstructor(Type.EmptyTypes) == null) // Structs still can be created (strangely) + { continue; + } // Filter types by provided filters if there is ones - if (filters != null && filters.All(f => f == null || f.Invoke(type)) == false) + if (filters != null && filters.All(f => f == null || f.Invoke(type)) == false) + { continue; + } appropriateTypes.Add(type); } @@ -70,9 +79,11 @@ public static class ManagedReferenceUtility /// Gets real type of managed reference public static Type GetManagedReferenceFieldType(this SerializedProperty property) { - var realPropertyType = GetRealTypeFromTypename(property.managedReferenceFieldTypename); - if (realPropertyType != null) + Type realPropertyType = GetRealTypeFromTypename(property.managedReferenceFieldTypename); + if (realPropertyType != null) + { return realPropertyType; + } Debug.LogError($"Can not get field type of managed reference : {property.managedReferenceFieldTypename}"); return null; @@ -81,21 +92,25 @@ public static class ManagedReferenceUtility /// Gets real type of managed reference's field typeName public static Type GetRealTypeFromTypename(string stringType) { - var names = GetSplitNamesFromTypename(stringType); - var realType = Type.GetType($"{names.ClassName}, {names.AssemblyName}"); + (string AssemblyName, string ClassName) = GetSplitNamesFromTypename(stringType); + Type realType = Type.GetType($"{ClassName}, {AssemblyName}"); + return realType; } /// Get assembly and class names from typeName public static (string AssemblyName, string ClassName) GetSplitNamesFromTypename(string typename) { - if (string.IsNullOrEmpty(typename)) + if (string.IsNullOrEmpty(typename)) + { return ("",""); - - var typeSplitString = typename.Split(char.Parse(" ")); - var typeClassName = typeSplitString[1]; - var typeAssemblyName = typeSplitString[0]; - return (typeAssemblyName, typeClassName); + } + + string[] typeSplitString = typename.Split(char.Parse(" ")); + string typeClassName = typeSplitString[1]; + string typeAssemblyName = typeSplitString[0]; + + return (typeAssemblyName, typeClassName); } } #endif \ No newline at end of file diff --git a/Editor/Core/SerializeReferenceGenericSelectionMenu.cs b/Editor/Core/SerializeReferenceGenericSelectionMenu.cs index 44d36d5..d16cb05 100644 --- a/Editor/Core/SerializeReferenceGenericSelectionMenu.cs +++ b/Editor/Core/SerializeReferenceGenericSelectionMenu.cs @@ -1,5 +1,4 @@ #if UNITY_EDITOR - using System; using System.Collections.Generic; using System.Linq; @@ -16,8 +15,8 @@ public static class SerializeReferenceGenericSelectionMenu /// As well as any custom restriction that is based on input type. /// And it will be performed on each Appropriate type found by TypeCache. public static void ShowContextMenuForManagedReference(this SerializedProperty property, Rect position, IEnumerable> filters = null) - { - var context = new GenericMenu(); + { + GenericMenu context = new GenericMenu(); FillContextMenu(filters, context, property); context.DropDown(position); } @@ -31,38 +30,40 @@ public static class SerializeReferenceGenericSelectionMenu /// And it will be performed on each Appropriate type found by TypeCache. public static void ShowContextMenuForManagedReference(this SerializedProperty property, IEnumerable> filters = null) { - var context = new GenericMenu(); + GenericMenu context = new GenericMenu(); FillContextMenu(filters, context, property); context.ShowAsContext(); } private static void FillContextMenu(IEnumerable> enumerableFilters, GenericMenu contextMenu, SerializedProperty property) { - var filters = enumerableFilters.ToList();// Prevents possible multiple enumerations + List> filters = enumerableFilters.ToList();// Prevents possible multiple enumerations // Adds "Make Null" menu command contextMenu.AddItem(new GUIContent("Null"), false, property.SetManagedReferenceToNull); - + // Collects appropriate types - var appropriateTypes = property.GetAppropriateTypesForAssigningToManagedReference(filters); + IEnumerable appropriateTypes = property.GetAppropriateTypesForAssigningToManagedReference(filters); // Adds appropriate types to menu - foreach (var appropriateType in appropriateTypes) + foreach (Type appropriateType in appropriateTypes) + { AddItemToContextMenu(appropriateType, contextMenu, property); + } } private static void AddItemToContextMenu(Type type, GenericMenu genericMenuContext, SerializedProperty property) { - var assemblyName = type.Assembly.ToString().Split('(', ',')[0]; - var entryName = type + " ( " + assemblyName + " )"; + string assemblyName = type.Assembly.ToString().Split('(', ',')[0]; + string entryName = type + " ( " + assemblyName + " )"; genericMenuContext.AddItem(new GUIContent(entryName), false, AssignNewInstanceCommand, new GenericMenuParameterForAssignInstanceCommand(type, property)); } private static void AssignNewInstanceCommand(object objectGenericMenuParameter ) { - var parameter = (GenericMenuParameterForAssignInstanceCommand) objectGenericMenuParameter; - var type = parameter.Type; - var property = parameter.Property; + GenericMenuParameterForAssignInstanceCommand parameter = (GenericMenuParameterForAssignInstanceCommand) objectGenericMenuParameter; + Type type = parameter.Type; + SerializedProperty property = parameter.Property; property.AssignNewInstanceOfTypeToManagedReference(type); } @@ -78,5 +79,4 @@ public static class SerializeReferenceGenericSelectionMenu public readonly Type Type; } } - #endif \ No newline at end of file diff --git a/Editor/DefaultUI/SerializeReferenceInspectorMiddleMouseMenu.cs b/Editor/DefaultUI/SerializeReferenceInspectorMiddleMouseMenu.cs index ca13d23..c5883d3 100644 --- a/Editor/DefaultUI/SerializeReferenceInspectorMiddleMouseMenu.cs +++ b/Editor/DefaultUI/SerializeReferenceInspectorMiddleMouseMenu.cs @@ -1,5 +1,4 @@ #if UNITY_EDITOR - using System; using System.Collections.Generic; using UnityEditor; @@ -7,15 +6,15 @@ using UnityEngine; public static class SerializeReferenceInspectorMiddleMouseMenu { - public static void ShowContextMenuForManagedReferenceOnMouseMiddleButton(this SerializedProperty property, - Rect position, IEnumerable> filters = null) + public static void ShowContextMenuForManagedReferenceOnMouseMiddleButton(this SerializedProperty property, Rect position, IEnumerable> filters = null) { - var e = Event.current; - if (e.type != EventType.MouseDown || !position.Contains(e.mousePosition) || e.button != 2) + Event e = Event.current; + if (e.type != EventType.MouseDown || !position.Contains(e.mousePosition) || e.button != 2) + { return; + } property.ShowContextMenuForManagedReference(filters); } } - #endif \ No newline at end of file diff --git a/Runtime/Attributes/SerializedReferenceUIDefaultTypeRestrictions.cs b/Runtime/Attributes/SerializedReferenceUIDefaultTypeRestrictions.cs index 80dd966..a07108c 100644 --- a/Runtime/Attributes/SerializedReferenceUIDefaultTypeRestrictions.cs +++ b/Runtime/Attributes/SerializedReferenceUIDefaultTypeRestrictions.cs @@ -6,10 +6,10 @@ public static class SerializedReferenceUIDefaultTypeRestrictions { public static IEnumerable> GetAllBuiltInTypeRestrictions(FieldInfo fieldInfo) { - var result = new List>(); - - var attributeObjects = fieldInfo.GetCustomAttributes(false); - foreach (var attributeObject in attributeObjects) + List> result = new List>(); + + object[] attributeObjects = fieldInfo.GetCustomAttributes(false); + foreach (object attributeObject in attributeObjects) { switch (attributeObject) { diff --git a/Runtime/Core/SerializeReferenceTypeRestrictionFilters.cs b/Runtime/Core/SerializeReferenceTypeRestrictionFilters.cs index bfe06a6..7cd7ed7 100644 --- a/Runtime/Core/SerializeReferenceTypeRestrictionFilters.cs +++ b/Runtime/Core/SerializeReferenceTypeRestrictionFilters.cs @@ -1,13 +1,10 @@ - using System; +using System; using System.Linq; public static class SerializeReferenceTypeRestrictionFilters { - public static Func TypeIsNotSubclassOrEqualOrHasInterface(Type[] types) => type => - TypeIsSubclassOrEqualOrHasInterface(types).Invoke(type) == false; - - public static Func TypeIsSubclassOrEqualOrHasInterface(Type[] types) => type => - types.Any(e => e.IsInterface ? TypeHasInterface(type, e) : TypeIsSubclassOrEqual(type, e)); + public static Func TypeIsNotSubclassOrEqualOrHasInterface(Type[] types) => type => TypeIsSubclassOrEqualOrHasInterface(types).Invoke(type) == false; + public static Func TypeIsSubclassOrEqualOrHasInterface(Type[] types) => type => types.Any(e => e.IsInterface ? TypeHasInterface(type, e) : TypeIsSubclassOrEqual(type, e)); public static bool TypeIsSubclassOrEqual(Type type, Type comparator) => type.IsSubclassOf(comparator) || type == comparator; public static bool TypeHasInterface(this Type type, Type comparator) => type.GetInterface(comparator.ToString()) != null;