static IEnumerable <ValidMethodMap> CalculateMethodMap(Object target, Type[] t, bool allowSubclasses) { var validMethods = new List <ValidMethodMap>(); if (target == null || t == null) { return(validMethods); } Type componentType = target.GetType(); var componentMethods = componentType.GetMethods().Where(x => !x.IsSpecialName).ToList(); var wantedProperties = componentType.GetProperties().AsEnumerable(); wantedProperties = wantedProperties.Where(x => x.GetCustomAttributes(typeof(ObsoleteAttribute), true).Length == 0 && x.GetSetMethod() != null); componentMethods.AddRange(wantedProperties.Select(x => x.GetSetMethod())); foreach (var componentMethod in componentMethods) { var componentParamaters = componentMethod.GetParameters(); if (componentParamaters.Length != t.Length) { continue; } if (componentMethod.GetCustomAttributes(typeof(ObsoleteAttribute), true).Length > 0) { continue; } if (componentMethod.ReturnType != typeof(void)) { continue; } bool paramatersMatch = true; for (int i = 0; i < t.Length; i++) { if (!componentParamaters[i].ParameterType.IsAssignableFrom(t[i])) { paramatersMatch = false; } if (allowSubclasses && t[i].IsAssignableFrom(componentParamaters[i].ParameterType)) { paramatersMatch = true; } } if (paramatersMatch) { var vmm = new ValidMethodMap(); vmm.target = target; vmm.methodInfo = componentMethod; validMethods.Add(vmm); } } return(validMethods); }
private static void AddFunctionsForScript( GenericMenu menu, SerializedProperty listener, ValidMethodMap method, string targetName) { PersistentListenerMode mode1 = method.mode; var objectReferenceValue = listener.FindPropertyRelative("_vmName").stringValue; string stringValue = listener.FindPropertyRelative("_methodName").stringValue; PersistentListenerMode mode2 = GetMode(listener.FindPropertyRelative("_mode")); SerializedProperty propertyRelative = listener.FindPropertyRelative("_arguments").FindPropertyRelative("m_ObjectArgumentAssemblyTypeName"); StringBuilder stringBuilder = new StringBuilder(); int length = method.methodInfo.GetParameters().Length; for (int index = 0; index < length; ++index) { System.Reflection.ParameterInfo parameter = method.methodInfo.GetParameters()[index]; stringBuilder.Append(string.Format("{0}", (object)GetTypeName(parameter.ParameterType))); if (index < length - 1) { stringBuilder.Append(", "); } } bool flag = objectReferenceValue == method.target && stringValue == method.methodInfo.Name && mode1 == mode2; if (flag && mode1 == PersistentListenerMode.Object && method.methodInfo.GetParameters().Length == 1) { flag &= method.methodInfo.GetParameters()[0].ParameterType.AssemblyQualifiedName == propertyRelative.stringValue; } string formattedMethodName = GetFormattedMethodName(targetName, method.fieldName, stringBuilder.ToString(), mode1 == PersistentListenerMode.EventDefined); GenericMenu genericMenu = menu; GUIContent content = new GUIContent(formattedMethodName); int num = flag ? 1 : 0; // ISSUE: reference to a compiler-generated field if (_menuCallBack1 == null) { // ISSUE: reference to a compiler-generated field _menuCallBack1 = new GenericMenu.MenuFunction2(SetEventFunction); } // ISSUE: reference to a compiler-generated field GenericMenu.MenuFunction2 fMgCache1 = _menuCallBack1; // ISSUE: variable of a boxed type var local = (ValueType) new UnityEventFunction(listener, method.target, method.methodInfo, mode1, method.fieldName); genericMenu.AddItem(content, num != 0, fMgCache1, (object)local); }
static void AddFunctionsForScript(GenericMenu menu, SerializedProperty listener, ValidMethodMap method, string targetName) { PersistentListenerMode mode = method.mode; // find the current event target... var listenerTarget = listener.FindPropertyRelative(kInstancePath).objectReferenceValue; var methodName = listener.FindPropertyRelative(kMethodNamePath).stringValue; var setMode = GetMode(listener.FindPropertyRelative(kModePath)); var typeName = listener.FindPropertyRelative(kArgumentsPath).FindPropertyRelative(kObjectArgumentAssemblyTypeName); var args = new StringBuilder(); var count = method.methodInfo.GetParameters().Length; for (int index = 0; index < count; index++) { var methodArg = method.methodInfo.GetParameters()[index]; args.Append(string.Format("{0}", GetTypeName(methodArg.ParameterType))); if (index < count - 1) { args.Append(", "); } } var isCurrentlySet = listenerTarget == method.target && methodName == method.methodInfo.Name && mode == setMode; if (isCurrentlySet && mode == PersistentListenerMode.Object && method.methodInfo.GetParameters().Length == 1) { isCurrentlySet &= (method.methodInfo.GetParameters()[0].ParameterType.AssemblyQualifiedName == typeName.stringValue); } string path = GetFormattedMethodName(targetName, method.methodInfo.Name, args.ToString(), mode == PersistentListenerMode.EventDefined); menu.AddItem(new GUIContent(path), isCurrentlySet, SetEventFunction, new UnityEventFunction(listener, method.target, method.methodInfo, mode)); }
static IEnumerable <ValidMethodMap> CalculateMethodMap(Object target, Type[] t, bool allowSubclasses) { var validMethods = new List <ValidMethodMap>(); if (target == null || t == null) { return(validMethods); } // find the methods on the behaviour that match the signature Type componentType = target.GetType(); var componentMethods = componentType.GetMethods().Where(x => !x.IsSpecialName).ToList(); var wantedProperties = componentType.GetProperties().AsEnumerable(); wantedProperties = wantedProperties.Where(x => x.GetCustomAttributes(typeof(ObsoleteAttribute), true).Length == 0 && x.GetSetMethod() != null); componentMethods.AddRange(wantedProperties.Select(x => x.GetSetMethod())); foreach (var componentMethod in componentMethods) { //Debug.Log ("Method: " + componentMethod); // if the argument length is not the same, no match var componentParamaters = componentMethod.GetParameters(); if (componentParamaters.Length != t.Length) { continue; } // Don't show obsolete methods. if (componentMethod.GetCustomAttributes(typeof(ObsoleteAttribute), true).Length > 0) { continue; } if (componentMethod.ReturnType != typeof(void)) { continue; } // if the argument types do not match, no match bool paramatersMatch = true; for (int i = 0; i < t.Length; i++) { if (!componentParamaters[i].ParameterType.IsAssignableFrom(t[i])) { paramatersMatch = false; } if (allowSubclasses && t[i].IsAssignableFrom(componentParamaters[i].ParameterType)) { paramatersMatch = true; } } // valid method if (paramatersMatch) { var vmm = new ValidMethodMap { target = target, methodInfo = componentMethod }; validMethods.Add(vmm); } } return(validMethods); }
private static void AddFunctionsForScript(GenericMenu menu, SerializedProperty listener, ValidMethodMap method, string targetName) { var mode1 = method.mode; var objectReferenceValue = listener.FindPropertyRelative("m_Target").objectReferenceValue; var stringValue = listener.FindPropertyRelative("m_MethodName").stringValue; var mode2 = GetMode(listener.FindPropertyRelative("m_Mode")); var propertyRelative = listener.FindPropertyRelative("m_Arguments").FindPropertyRelative("m_ObjectArgumentAssemblyTypeName"); var stringBuilder = new StringBuilder(); int length = method.methodInfo.GetParameters().Length; for (int index = 0; index < length; ++index) { var parameter = method.methodInfo.GetParameters()[index]; stringBuilder.Append(string.Format("{0}", GetTypeName(parameter.ParameterType))); if (index < length - 1) { stringBuilder.Append(", "); } } var on = objectReferenceValue == method.target && stringValue == method.methodInfo.Name && mode1 == mode2; if (on && mode1 == PersistentListenerMode.Object && method.methodInfo.GetParameters().Length == 1) { on &= method.methodInfo.GetParameters()[0].ParameterType.AssemblyQualifiedName == propertyRelative.stringValue; } var formattedMethodName = GetFormattedMethodName(targetName, method.methodInfo.Name, stringBuilder.ToString(), mode1 == PersistentListenerMode.EventDefined); menu.AddItem(new GUIContent(formattedMethodName), on, new GenericMenu.MenuFunction2(SetEventFunction), new UnityEventFunction(listener, method.target, method.methodInfo, mode1)); }
private static void AddFunctionsForScript(GenericMenu menu, SerializedProperty listener, ValidMethodMap method, string targetName) { PersistentListenerMode mode = method.mode; UnityEngine.Object objectReferenceValue = listener.FindPropertyRelative("m_Target").objectReferenceValue; string stringValue = listener.FindPropertyRelative("m_MethodName").stringValue; PersistentListenerMode mode2 = GetMode(listener.FindPropertyRelative("m_Mode")); SerializedProperty property = listener.FindPropertyRelative("m_Arguments").FindPropertyRelative("m_ObjectArgumentAssemblyTypeName"); StringBuilder builder = new StringBuilder(); int length = method.methodInfo.GetParameters().Length; for (int i = 0; i < length; i++) { System.Reflection.ParameterInfo info = method.methodInfo.GetParameters()[i]; builder.Append(string.Format("{0}", GetTypeName(info.ParameterType))); if (i < (length - 1)) { builder.Append(", "); } } bool on = ((objectReferenceValue == method.target) && (stringValue == method.methodInfo.Name)) && (mode == mode2); if ((on && (mode == PersistentListenerMode.Object)) && (method.methodInfo.GetParameters().Length == 1)) { on &= method.methodInfo.GetParameters()[0].ParameterType.AssemblyQualifiedName == property.stringValue; } string text = GetFormattedMethodName(targetName, method.methodInfo.Name, builder.ToString(), mode == PersistentListenerMode.EventDefined); menu.AddItem(new GUIContent(text), on, new GenericMenu.MenuFunction2(UnityEventDrawer.SetEventFunction), new UnityEventFunction(listener, method.target, method.methodInfo, mode)); }
private static void AddFunctionsForScript(GenericMenu menu, SerializedProperty listener, ValidMethodMap method, string targetName) { PersistentListenerMode mode = method.mode; UnityEngine.Object objectReferenceValue = listener.FindPropertyRelative("m_Target").objectReferenceValue; string stringValue = listener.FindPropertyRelative("m_MethodName").stringValue; PersistentListenerMode mode2 = GetMode(listener.FindPropertyRelative("m_Mode")); SerializedProperty property = listener.FindPropertyRelative("m_Arguments").FindPropertyRelative("m_ObjectArgumentAssemblyTypeName"); StringBuilder builder = new StringBuilder(); int length = method.methodInfo.GetParameters().Length; for (int i = 0; i < length; i++) { System.Reflection.ParameterInfo info = method.methodInfo.GetParameters()[i]; builder.Append($"{GetTypeName(info.ParameterType)}"); if (i < (length - 1)) { builder.Append(", "); } } bool on = ((objectReferenceValue == method.target) && (stringValue == method.methodInfo.Name)) && (mode == mode2); if ((on && (mode == PersistentListenerMode.Object)) && (method.methodInfo.GetParameters().Length == 1)) { on &= method.methodInfo.GetParameters()[0].ParameterType.AssemblyQualifiedName == property.stringValue; } string text = GetFormattedMethodName(targetName, method.methodInfo.Name, builder.ToString(), mode == PersistentListenerMode.EventDefined); if (< > f__mg$cache1 == null) {
private static void AddFunctionsForScript(GenericMenu menu, SerializedProperty listener, ValidMethodMap method, string targetName) { PersistentListenerMode mode = method.mode; Object objectReferenceValue = listener.FindPropertyRelative("m_Target").objectReferenceValue; string stringValue = listener.FindPropertyRelative("m_MethodName").stringValue; PersistentListenerMode mode2 = GetMode(listener.FindPropertyRelative("m_Mode")); SerializedProperty property = listener.FindPropertyRelative("m_Arguments").FindPropertyRelative("m_ObjectArgumentAssemblyTypeName"); StringBuilder builder = new StringBuilder(); int length = method.methodInfo.GetParameters().Length; for (int i = 0; i < length; i++) { ParameterInfo info = method.methodInfo.GetParameters()[i]; builder.Append(string.Format("{0}", GetTypeName(info.ParameterType))); if (i < (length - 1)) { builder.Append(", "); } } bool on = ((objectReferenceValue == method.target) && (stringValue == method.methodInfo.Name)) && (mode == mode2); if ((on && (mode == PersistentListenerMode.Object)) && (method.methodInfo.GetParameters().Length == 1)) { on &= method.methodInfo.GetParameters()[0].ParameterType.AssemblyQualifiedName == property.stringValue; } string text = GetFormattedMethodName(targetName, method.methodInfo.Name, builder.ToString(), mode == PersistentListenerMode.EventDefined); menu.AddItem(new GUIContent(text), on, new GenericMenu.MenuFunction2(UnityEventDrawer.SetEventFunction), new UnityEventFunction(listener, method.target, method.methodInfo, mode)); }
static void AddFunctionsForScript(GenericMenu menu, SerializedProperty propCall, ValidMethodMap method, string targetName) { PersistentListenerMode mode = method.mode; var propTarget = propCall.FindPropertyRelative(targetPath).objectReferenceValue; var propMethodName = propCall.FindPropertyRelative(methodNamePath).stringValue; var propMode = GetMode(propCall.FindPropertyRelative(modePath)); var args = new StringBuilder(); var count = method.methodInfo.GetParameters().Length; for (int index = 0; index < count; index++) { var methodArg = method.methodInfo.GetParameters()[index]; args.Append(string.Format("{0}", GetTypeName(methodArg.ParameterType))); if (index < count - 1) { args.Append(", "); } } var isCurrentlySet = propTarget == method.target && propMethodName == method.methodInfo.Name && mode == propMode; string path = GetFormattedMethodName(targetName, method.methodInfo.Name, args.ToString(), mode == PersistentListenerMode.EventDefined); menu.AddItem(new GUIContent(path), isCurrentlySet, SetEventFunction, new UnityEventFunction(propCall, method.target, method.methodInfo, mode)); }
static void AddFunctionsForScript(GenericMenu menu, SerializedProperty propCall, ValidMethodMap method, string targetName, bool multiple) { var propTarget = propCall.FindPropertyRelative(targetPath).objectReferenceValue; var propMethodName = propCall.FindPropertyRelative(methodNamePath).stringValue; var propModes = propCall.FindPropertyRelative(modesPath); var isCurrentlySet = propTarget == method.target && propMethodName == method.methodInfo.Name && propModes.arraySize == method.modes.Length; if (isCurrentlySet) { for (var i = 0; i < propModes.arraySize; ++i) { if ((PersistentListenerMode)propModes.GetArrayElementAtIndex(i).enumValueIndex != method.modes[i]) { isCurrentlySet = false; break; } } } string path = GetFormattedMethodName(targetName, method.methodInfo.Name, GetMethodParameters(method.methodInfo), false, multiple); menu.AddItem(new GUIContent(path), isCurrentlySet, SetEventFunction, new UnityEventFunction(propCall, method.target, method.methodInfo)); }
private static void GeneratePopUpForType(GenericMenu menu, Object target, bool useFullTargetName, SerializedProperty propCall) { var methods = new List <ValidMethodMap>(); string targetName = useFullTargetName ? target.GetType().FullName : target.GetType().Name; Type[] t = new[] { typeof(float), typeof(int), typeof(string), typeof(bool), typeof(Color), typeof(Object) }; PersistentListenerMode[] modeList = new[] { PersistentListenerMode.Float, PersistentListenerMode.Int, PersistentListenerMode.String, PersistentListenerMode.Bool, PersistentListenerMode.String, PersistentListenerMode.Object }; if (target == null || t == null) { return; } Type componentType = target.GetType(); var componentMethods = componentType.GetMethods().Where(x => !x.IsSpecialName).ToList(); var wantedProperties = componentType.GetProperties().AsEnumerable(); wantedProperties = wantedProperties.Where(x => x.GetCustomAttributes(typeof(ObsoleteAttribute), true).Length == 0 && x.GetSetMethod() != null); componentMethods.AddRange(wantedProperties.Select(x => x.GetSetMethod())); foreach (var componentMethod in componentMethods) { var componentParamaters = componentMethod.GetParameters(); if (componentParamaters.Length < 1) { continue; } if (componentMethod.GetCustomAttributes(typeof(ObsoleteAttribute), true).Length > 0) { continue; } if (componentMethod.ReturnType != typeof(void)) { continue; } var modes = new PersistentListenerMode[componentParamaters.Length]; bool paramatersMatch = true; for (int i = 0; i < componentParamaters.Length; i++) { bool paramaterMatch = false; for (int j = 0; j < t.Length; j++) { if (t[j].IsAssignableFrom(componentParamaters[i].ParameterType)) { modes[i] = modeList[j]; paramaterMatch = true; break; } } if (!paramaterMatch) { paramatersMatch = false; break; } } if (paramatersMatch) { var vmm = new ValidMethodMap(); vmm.target = target; vmm.methodInfo = componentMethod; vmm.modes = modes; methods.Add(vmm); } } if (methods.Count > 0) { var orderedFields = methods.FindAll(e => e.methodInfo.Name.StartsWith("set_")).OrderBy(e => e.methodInfo.Name); var orderedMethods = methods.FindAll(e => !e.methodInfo.Name.StartsWith("set_")).OrderBy(e => e.methodInfo.Name).ThenBy(e => e.methodInfo.GetParameters().Length); Dictionary <string, int> methodsCount = new Dictionary <string, int>(); foreach (var validMethod in orderedMethods) { if (methodsCount.ContainsKey(validMethod.methodInfo.Name)) { methodsCount[validMethod.methodInfo.Name]++; } else { methodsCount.Add(validMethod.methodInfo.Name, 1); } } foreach (var validMethod in orderedFields) { AddFunctionsForScript(menu, propCall, validMethod, targetName, false); } menu.AddSeparator(targetName + "/"); foreach (var validMethod in orderedMethods) { AddFunctionsForScript(menu, propCall, validMethod, targetName, methodsCount[validMethod.methodInfo.Name] > 1); } } }
private static void GeneratePopUpForType(GenericMenu menu, Object target, bool useFullTargetName, SerializedProperty propCall) { var methods = new List <ValidMethodMap>(); string targetName = useFullTargetName ? target.GetType().FullName : target.GetType().Name; Type[] t = new[] { typeof(float), typeof(int), typeof(string), typeof(bool), typeof(Color), typeof(Object) }; PersistentListenerMode[] modeList = new[] { PersistentListenerMode.Float, PersistentListenerMode.Int, PersistentListenerMode.String, PersistentListenerMode.Bool, PersistentListenerMode.String, PersistentListenerMode.Object }; if (target == null || t == null) { return; } Type componentType = target.GetType(); var wantedProperties = componentType.GetProperties().AsEnumerable(); wantedProperties = wantedProperties.Where(x => x.GetCustomAttributes(typeof(ObsoleteAttribute), true).Length == 0 && x.GetSetMethod() != null); var componentMethods = wantedProperties.Select(x => x.GetSetMethod()); foreach (var componentMethod in componentMethods) { var componentParamaters = componentMethod.GetParameters(); if (componentParamaters.Length != 1) { continue; } if (componentMethod.GetCustomAttributes(typeof(ObsoleteAttribute), true).Length > 0) { continue; } if (componentMethod.ReturnType != typeof(void)) { continue; } var modes = new PersistentListenerMode[componentParamaters.Length]; bool paramatersMatch = true; for (int i = 0; i < componentParamaters.Length; i++) { bool paramaterMatch = false; for (int j = 0; j < t.Length; j++) { if (t[j].IsAssignableFrom(componentParamaters[i].ParameterType)) { modes[i] = modeList[j]; paramaterMatch = true; break; } } if (!paramaterMatch) { paramatersMatch = false; break; } } if (paramatersMatch) { var vmm = new ValidMethodMap(); vmm.target = target; vmm.methodInfo = componentMethod; vmm.modes = modes; methods.Add(vmm); } } menu.AddItem(new GUIContent(targetName + "/Self"), string.IsNullOrEmpty(propCall.FindPropertyRelative(methodNamePath).stringValue) && propCall.FindPropertyRelative(targetPath).objectReferenceValue == target, SetTargetFunction, new object[] { propCall, target }); menu.AddSeparator(targetName + "/"); if (methods.Count > 0) { var orderedFields = methods.OrderBy(e => e.methodInfo.Name); foreach (var validMethod in orderedFields) { AddFunctionsForScript(menu, propCall, validMethod, targetName, false); } } }