Skip to content

Commit

Permalink
Improved compilation speed.
Browse files Browse the repository at this point in the history
  • Loading branch information
ChanyaVRC committed Jul 24, 2021
1 parent 8df1c26 commit 5f757be
Show file tree
Hide file tree
Showing 18 changed files with 206 additions and 184 deletions.
2 changes: 1 addition & 1 deletion Assets/UdonSharp/Editor/Editors/EasyEventEditor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1131,7 +1131,7 @@ void FindValidMethods(Object targetObject, PersistentListenerMode listenerMode,
// For some reason BindingFlags.FlattenHierarchy does not seem to work, so we manually traverse the base types instead
while (objectType != null)
{
MethodInfo[] foundMethodsOnType = objectType.GetMethods(BindingFlags.Public | (cachedSettings.showPrivateMembers ? BindingFlags.NonPublic : BindingFlags.Default) | BindingFlags.Instance);
MethodInfo[] foundMethodsOnType = UdonSharpUtils.GetTypeMethods(objectType,BindingFlags.Public | (cachedSettings.showPrivateMembers ? BindingFlags.NonPublic : BindingFlags.Default) | BindingFlags.Instance);

foundMethods.AddRange(foundMethodsOnType);

Expand Down
20 changes: 4 additions & 16 deletions Assets/UdonSharp/Editor/Editors/UdonSharpBehaviourEditor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -171,10 +171,7 @@ public static void OverrideUdonBehaviourDrawer()

System.Type fieldType = customEditorField.FieldType;

removeTypeMethod = fieldType.GetMethods(BindingFlags.Public | BindingFlags.Instance)
.FirstOrDefault(e => e.Name == "Remove" &&
e.GetParameters().Length == 1 &&
e.GetParameters()[0].ParameterType == typeof(System.Type));
removeTypeMethod = fieldType.GetMethod("Remove", BindingFlags.Public | BindingFlags.Instance, null, new Type[] { typeof(System.Type) }, null);

monoEditorTypeType = editorAttributesClass.GetNestedType("MonoEditorType", BindingFlags.NonPublic);
monoEditorTypeInspectedTypeField = monoEditorTypeType.GetField("m_InspectedType", BindingFlags.Public | BindingFlags.Instance);
Expand All @@ -183,20 +180,11 @@ public static void OverrideUdonBehaviourDrawer()
monoEditorTypeListType = typeof(List<>).MakeGenericType(monoEditorTypeType);


addTypeMethod = fieldType.GetMethods(BindingFlags.Public | BindingFlags.Instance)
.FirstOrDefault(e => e.Name == "Add" &&
e.GetParameters().Length == 2 &&
e.GetParameters()[0].ParameterType == typeof(System.Type) &&
e.GetParameters()[1].ParameterType == monoEditorTypeListType);
addTypeMethod = fieldType.GetMethod("Add", BindingFlags.Public | BindingFlags.Instance, null, new Type[] { typeof(System.Type), monoEditorTypeListType }, null);

listAddTypeMethod = monoEditorTypeListType.GetMethods(BindingFlags.Public | BindingFlags.Instance)
.FirstOrDefault(e => e.Name == "Add" &&
e.GetParameters().Length == 1 &&
e.GetParameters()[0].ParameterType == monoEditorTypeType);
listAddTypeMethod = monoEditorTypeListType.GetMethod("Add", BindingFlags.Public | BindingFlags.Instance, null, new Type[] { monoEditorTypeType }, null);

listClearMethod = monoEditorTypeListType.GetMethods(BindingFlags.Public | BindingFlags.Instance)
.FirstOrDefault(e => e.Name == "Clear" &&
e.GetParameters().Length == 0);
listClearMethod = monoEditorTypeListType.GetMethod("Clear", BindingFlags.Public | BindingFlags.Instance, null, Array.Empty<Type>(), null);

customEditorDictionary = customEditorField.GetValue(null);

Expand Down
6 changes: 3 additions & 3 deletions Assets/UdonSharp/Editor/Editors/UdonSharpGUI.cs
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ void ShowDropDown(Rect controlRect, Vector2 size)
popupLocationArray.SetValue(4, 1); // PopupLocation.Overlay
}

MethodInfo showAsDropDownMethod = typeof(EditorWindow).GetMethods(BindingFlags.NonPublic | BindingFlags.Instance).First(e => e.GetParameters().Length == 3);
MethodInfo showAsDropDownMethod = UdonSharpUtils.GetTypeMethods(typeof(EditorWindow), BindingFlags.NonPublic | BindingFlags.Instance).First(e => e.GetParameters().Length == 3);

showAsDropDownMethod.Invoke(this, new object[] { controlRect, size, popupLocationArray });
}
Expand Down Expand Up @@ -546,7 +546,7 @@ private static object DrawUnityObjectField(GUIContent fieldName, string symbol,
if (IsNormalUnityObject(declaredType, fieldDefinition))
return EditorGUILayout.ObjectField(fieldName, (UnityEngine.Object)value, declaredType, true);

MethodInfo doObjectFieldMethod = typeof(EditorGUI).GetMethods(BindingFlags.Static | BindingFlags.NonPublic).Where(e => e.Name == "DoObjectField" && e.GetParameters().Length == 8).FirstOrDefault();
MethodInfo doObjectFieldMethod = UdonSharpUtils.GetTypeMethods(typeof(EditorGUI), BindingFlags.Static | BindingFlags.NonPublic).FirstOrDefault(e => e.Name == "DoObjectField" && e.GetParameters().Length == 8);

if (doObjectFieldMethod == null)
throw new System.Exception("Could not find DoObjectField() method");
Expand Down Expand Up @@ -1622,7 +1622,7 @@ public static bool DrawConvertToUdonBehaviourButton(UnityEngine.Object[] targets
EditorGUI.BeginDisabledGroup(EditorApplication.isPlaying);
if (GUILayout.Button("Convert to UdonBehaviour", GUILayout.Height(25)))
{
UdonSharpEditorUtility.ConvertToUdonBehavioursInternal(Array.ConvertAll(targets, e => e as UdonSharpBehaviour).Where(e => e != null && !UdonSharpEditorUtility.IsProxyBehaviour(e)).ToArray(), true, true, true);
UdonSharpEditorUtility.ConvertToUdonBehavioursInternal(targets.Select(e => e as UdonSharpBehaviour).Where(e => e != null && !UdonSharpEditorUtility.IsProxyBehaviour(e)).ToArray(), true, true, true);
EditorGUI.EndDisabledGroup();

return true;
Expand Down
46 changes: 23 additions & 23 deletions Assets/UdonSharp/Editor/Editors/UdonTypeExposureTree.cs
Original file line number Diff line number Diff line change
Expand Up @@ -138,16 +138,16 @@ private string GetMemberUdonName(TreeViewItem item, ExposureLookupType lookupTyp

if (member.MemberType == MemberTypes.Constructor || member.MemberType == MemberTypes.Method)
{
return resolver.GetUdonMethodName((MethodBase)member, false);
return ResolverContext.GetUdonMethodName((MethodBase)member, false);
}
else if (member.MemberType == MemberTypes.Property)
{
string udonNames = "";

if (((PropertyInfo)member).GetGetMethod() != null)
udonNames = resolver.GetUdonMethodName(((PropertyInfo)member).GetGetMethod(), false);
udonNames = ResolverContext.GetUdonMethodName(((PropertyInfo)member).GetGetMethod(), false);
if (((PropertyInfo)member).GetSetMethod() != null)
udonNames += "\n" + resolver.GetUdonMethodName(((PropertyInfo)member).GetSetMethod(), false);
udonNames += "\n" + ResolverContext.GetUdonMethodName(((PropertyInfo)member).GetSetMethod(), false);

return udonNames;
}
Expand Down Expand Up @@ -270,7 +270,7 @@ bool ShouldHideMember(MemberInfo memberInfo)

if (memberInfo is MethodInfo methodInfo)
{
string methodUdonName = resolver.GetUdonMethodName(methodInfo, false);
string methodUdonName = ResolverContext.GetUdonMethodName(methodInfo, false);

//if (resolver.IsValidUdonMethod(methodUdonName))
{
Expand All @@ -295,7 +295,7 @@ bool ShouldHideMember(MemberInfo memberInfo)
}
else if (memberInfo is PropertyInfo propertyInfo)
{
string propertyName = resolver.GetUdonMethodName(propertyInfo.GetGetMethod(), false);
string propertyName = ResolverContext.GetUdonMethodName(propertyInfo.GetGetMethod(), false);

//if (resolver.IsValidUdonMethod(propertyName))
shouldHide &= ShouldHideType(propertyInfo.PropertyType);
Expand Down Expand Up @@ -359,7 +359,7 @@ private void AddChildNode(TreeViewItem parentItem, MemberInfo memberInfo, ref in
{
case MemberTypes.Constructor:
case MemberTypes.Method:
itemMetadata.exposed = resolver.IsValidUdonMethod(resolver.GetUdonMethodName((MethodBase)memberInfo, false));
itemMetadata.exposed = resolver.IsValidUdonMethod(ResolverContext.GetUdonMethodName((MethodBase)memberInfo, false));
break;
case MemberTypes.Field:
string getAccessor = resolver.GetUdonFieldAccessorName((FieldInfo)memberInfo, FieldAccessorType.Get, false);
Expand All @@ -370,12 +370,12 @@ private void AddChildNode(TreeViewItem parentItem, MemberInfo memberInfo, ref in
itemMetadata.exposed = resolver.IsValidUdonMethod(getAccessor);
break;
case MemberTypes.Property:
string getProperty = resolver.GetUdonMethodName(((PropertyInfo)memberInfo).GetGetMethod(), false);
string getProperty = ResolverContext.GetUdonMethodName(((PropertyInfo)memberInfo).GetGetMethod(), false);
exposedUdonExterns.Remove(getProperty);

if (((PropertyInfo)memberInfo).GetSetMethod() != null)
{
string setProperty = resolver.GetUdonMethodName(((PropertyInfo)memberInfo).GetSetMethod(), false);
string setProperty = ResolverContext.GetUdonMethodName(((PropertyInfo)memberInfo).GetSetMethod(), false);
exposedUdonExterns.Remove(setProperty);
}

Expand Down Expand Up @@ -514,7 +514,7 @@ private void BuildExposedTypeList()
if (type.IsByRef)
continue;

string typeName = resolver.GetUdonTypeName(type);
string typeName = ResolverContext.GetUdonTypeName(type);
if (resolver.ValidateUdonTypeName(typeName, UdonReferenceType.Type) ||
resolver.ValidateUdonTypeName(typeName, UdonReferenceType.Variable) ||
UdonEditorManager.Instance.GetTypeFromTypeString(typeName) != null)
Expand All @@ -525,11 +525,11 @@ private void BuildExposedTypeList()
exposedTypeSet.Add(type.MakeArrayType());
}

MethodInfo[] methods = type.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static);
MethodInfo[] methods = UdonSharpUtils.GetTypeMethods(type, BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static);

foreach (MethodInfo method in methods)
{
if (resolver.IsValidUdonMethod(resolver.GetUdonMethodName(method, false)))
if (resolver.IsValidUdonMethod(ResolverContext.GetUdonMethodName(method, false)))
{
exposedTypeSet.Add(method.DeclaringType);

Expand Down Expand Up @@ -559,13 +559,13 @@ private void BuildExposedTypeList()
}
}

foreach (PropertyInfo property in type.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static))
foreach (PropertyInfo property in UdonSharpUtils.GetTypeProperties(type, BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static))
{
MethodInfo propertyGetter = property.GetGetMethod();
if (propertyGetter == null)
continue;

if (resolver.IsValidUdonMethod(resolver.GetUdonMethodName(propertyGetter, false)))
if (resolver.IsValidUdonMethod(ResolverContext.GetUdonMethodName(propertyGetter, false)))
{
System.Type returnType = propertyGetter.ReturnType;

Expand Down Expand Up @@ -679,35 +679,35 @@ protected override TreeViewItem BuildRoot()
namespaceParent.AddChild(typeParent);
itemMetadatas.Add(typeParent, new TypeItemMetadata() { isType = true });

exposedUdonExterns.Remove("Variable_" + resolver.GetUdonTypeName(type));
exposedUdonExterns.Remove("Const_" + resolver.GetUdonTypeName(type));
exposedUdonExterns.Remove("Type_" + resolver.GetUdonTypeName(type));
exposedUdonExterns.Remove("Type_" + resolver.GetUdonTypeName(type.MakeByRefType()));
exposedUdonExterns.Remove("Variable_" + ResolverContext.GetUdonTypeName(type));
exposedUdonExterns.Remove("Const_" + ResolverContext.GetUdonTypeName(type));
exposedUdonExterns.Remove("Type_" + ResolverContext.GetUdonTypeName(type));
exposedUdonExterns.Remove("Type_" + ResolverContext.GetUdonTypeName(type.MakeByRefType()));

//if (!type.IsEnum)
//{
// // Variable definition
// TreeViewItem variableDef = new TreeViewItem(currentID++, typeParent.depth + 1, "<variable> " + type.Name);
// typeParent.AddChild(variableDef);
// itemMetadatas.Add(variableDef, new TypeItemMetadata() { exposed = resolver.ValidateUdonTypeName(resolver.GetUdonTypeName(type), UdonReferenceType.Variable) });
// itemMetadatas.Add(variableDef, new TypeItemMetadata() { exposed = resolver.ValidateUdonTypeName(ResolverContext.GetUdonTypeName(type), UdonReferenceType.Variable) });
//}

// Type definition
//TreeViewItem typeDef = new TreeViewItem(currentID++, typeParent.depth + 1, "<type> " + type.Name);
//typeParent.AddChild(typeDef);
//itemMetadatas.Add(typeDef, new TypeItemMetadata() { exposed = resolver.ValidateUdonTypeName(resolver.GetUdonTypeName(type), UdonReferenceType.Type) });
//itemMetadatas.Add(typeDef, new TypeItemMetadata() { exposed = resolver.ValidateUdonTypeName(ResolverContext.GetUdonTypeName(type), UdonReferenceType.Type) });

// Internal type
TreeViewItem internalTypeDef = new TreeViewItem(currentID++, typeParent.depth + 1, "<Type> " + type.Name);
typeParent.AddChild(internalTypeDef);
itemMetadatas.Add(internalTypeDef, new TypeItemMetadata() { exposed = UdonEditorManager.Instance.GetTypeFromTypeString(resolver.GetUdonTypeName(type)) != null });
itemMetadatas.Add(internalTypeDef, new TypeItemMetadata() { exposed = UdonEditorManager.Instance.GetTypeFromTypeString(ResolverContext.GetUdonTypeName(type)) != null });

// Const definition
//if (!type.IsArray && !type.IsEnum)
//{
// TreeViewItem constDef = new TreeViewItem(currentID++, typeParent.depth + 1, "<const> " + type.Name);
// typeParent.AddChild(constDef);
// itemMetadatas.Add(constDef, new TypeItemMetadata() { exposed = resolver.ValidateUdonTypeName(resolver.GetUdonTypeName(type), UdonReferenceType.Const) });
// itemMetadatas.Add(constDef, new TypeItemMetadata() { exposed = resolver.ValidateUdonTypeName(ResolverContext.GetUdonTypeName(type), UdonReferenceType.Const) });
//}

BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static;
Expand All @@ -724,14 +724,14 @@ protected override TreeViewItem BuildRoot()
AddChildNode(typeParent, field, ref currentID);
}

foreach (PropertyInfo property in type.GetProperties(bindingFlags))
foreach (PropertyInfo property in UdonSharpUtils.GetTypeProperties(type, bindingFlags))
{
AddChildNode(typeParent, property, ref currentID);
}

if (!type.IsEnum)
{
foreach (MethodInfo method in type.GetMethods(bindingFlags).Where(e => (!type.IsArray || e.Name != "Address")))
foreach (MethodInfo method in UdonSharpUtils.GetTypeMethods(type, bindingFlags).Where(e => (!type.IsArray || e.Name != "Address")))
{
if (method.IsSpecialName && !method.Name.StartsWith("op_"))
continue;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ public static Formatter<T> GetFormatter<T>() where T : UdonSharpBehaviour
// Read
{
System.Type readDelegateType = typeof(ReadDataMethodDelegate<>).MakeGenericType(typeof(T));
MethodInfo readDataMethod = formatterType.GetMethods(Flags.InstancePublic).Where(e => e.Name == "Read" && e.GetParameters().Length == 2).First();
MethodInfo readDataMethod = UdonSharpUtils.GetTypeMethods(formatterType, Flags.InstancePublic).First(e => e.Name == "Read" && e.GetParameters().Length == 2);
DynamicMethod readMethod = new DynamicMethod($"Dynamic_{typeof(T).GetCompilableNiceFullName()}_Read", null, new[] { typeof(IValueStorage[]), typeof(T).MakeByRefType(), typeof(bool) }, true);

foreach (ParameterInfo param in readDataMethod.GetParameters())
Expand All @@ -199,7 +199,7 @@ public static Formatter<T> GetFormatter<T>() where T : UdonSharpBehaviour
// Write
{
System.Type writeDelegateType = typeof(WriteDataMethodDelegate<>).MakeGenericType(typeof(T));
MethodInfo writeDataMethod = formatterType.GetMethods(Flags.InstancePublic).Where(e => e.Name == "Write" && e.GetParameters().Length == 2).First();
MethodInfo writeDataMethod = UdonSharpUtils.GetTypeMethods(formatterType, Flags.InstancePublic).First(e => e.Name == "Write" && e.GetParameters().Length == 2);
DynamicMethod writeMethod = new DynamicMethod($"Dynamic_{typeof(T).GetCompilableNiceFullName()}_Write", null, new[] { typeof(IValueStorage[]), typeof(T).MakeByRefType(), typeof(bool) }, true);

foreach (ParameterInfo param in writeDataMethod.GetParameters())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ private System.Type GetElementType(string elementKey)
programTypeLookup = new Dictionary<string, Type>();
foreach (FieldDefinition def in programAsset.fieldDefinitions.Values)
{
if (def.fieldSymbol.declarationType.HasFlag(SymbolDeclTypeFlags.Public) || def.fieldSymbol.declarationType.HasFlag(SymbolDeclTypeFlags.Private))
if (def.fieldSymbol.declarationType.HasFlagFaster(SymbolDeclTypeFlags.Public) || def.fieldSymbol.declarationType.HasFlagFaster(SymbolDeclTypeFlags.Private))
programTypeLookup.Add(def.fieldSymbol.symbolOriginalName, def.fieldSymbol.symbolCsType);
}
variableTypeLookup.Add(programAsset, programTypeLookup);
Expand Down
Loading

0 comments on commit 5f757be

Please sign in to comment.