-
Notifications
You must be signed in to change notification settings - Fork 148
Fix duplicate types in generated assemblies on Unity 6.4+ #266
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -47,15 +47,20 @@ | |
| if (unityType.BaseType != null && unityType.BaseType.FullName == "System.MulticastDelegate") | ||
| return; | ||
| var newModule = processedAssembly.NewAssembly.ManifestModule!; | ||
| var processedType = enclosingNewType == null | ||
| ? processedAssembly.TryGetTypeByName(unityType.FullName)?.NewType | ||
| : enclosingNewType.NestedTypes.SingleOrDefault(it => it.Name == unityType.Name); | ||
| var processedType = processedAssembly.TryGetTypeByName(unityType.FullName)?.NewType; | ||
| var convertedTypeName = GetConvertedUnityTypeName(processedAssembly.GlobalContext, unityType); | ||
|
|
||
| // If the parent type does not exist in the rewritten assembly, this nested type cannot be emitted safely. | ||
| // Promoting it to a top-level type creates orphan compiler-generated types such as __O/__c. | ||
| if (unityType.DeclaringType != null && enclosingNewType == null && processedType == null) | ||
|
acan1980728690 marked this conversation as resolved.
Outdated
|
||
| return; | ||
|
|
||
| if (unityType.IsEnum) | ||
| { | ||
| if (processedType != null) return; | ||
|
|
||
| typesUnstripped++; | ||
| var clonedType = CloneEnum(unityType, imports); | ||
| var clonedType = CloneEnum(unityType, convertedTypeName, imports); | ||
| if (enclosingNewType == null) | ||
| { | ||
| newModule.TopLevelTypes.Add(clonedType); | ||
|
|
@@ -74,7 +79,8 @@ | |
| !unityType.HasGenericParameters()) // restore all types even if it would be not entirely correct | ||
| { | ||
| typesUnstripped++; | ||
| var clonedType = new TypeDefinition(unityType.Namespace, unityType.Name, ForcePublic(unityType.Attributes), unityType.BaseType == null ? null : newModule.DefaultImporter.ImportType(unityType.BaseType)); | ||
| var clonedType = new TypeDefinition(unityType.Namespace, convertedTypeName, ForcePublic(unityType.Attributes), | ||
| unityType.BaseType == null ? null : newModule.DefaultImporter.ImportType(unityType.BaseType)); | ||
| if (enclosingNewType == null) | ||
| { | ||
| newModule.TopLevelTypes.Add(clonedType); | ||
|
|
@@ -100,9 +106,9 @@ | |
| ProcessType(processedAssembly, nestedUnityType, processedType, imports, ref typesUnstripped); | ||
| } | ||
|
|
||
| private static TypeDefinition CloneEnum(TypeDefinition sourceEnum, RuntimeAssemblyReferences imports) | ||
| private static TypeDefinition CloneEnum(TypeDefinition sourceEnum, string convertedTypeName, RuntimeAssemblyReferences imports) | ||
|
acan1980728690 marked this conversation as resolved.
Outdated
|
||
| { | ||
| var newType = new TypeDefinition(sourceEnum.Namespace, sourceEnum.Name, ForcePublic(sourceEnum.Attributes), | ||
| var newType = new TypeDefinition(sourceEnum.Namespace, convertedTypeName, ForcePublic(sourceEnum.Attributes), | ||
| imports.Module.Enum().ToTypeDefOrRef()); | ||
| foreach (var sourceEnumField in sourceEnum.Fields) | ||
| { | ||
|
|
@@ -130,14 +136,25 @@ | |
| if (!fieldDefinition.Signature!.FieldType.IsValueType()) | ||
| return true; | ||
|
|
||
| if (fieldDefinition.Signature.FieldType.Namespace?.StartsWith("System") ?? false && | ||
| HasNonBlittableFields(fieldDefinition.Signature.FieldType.Resolve())) | ||
| return true; | ||
| if (fieldDefinition.Signature.FieldType.Namespace?.StartsWith("System") ?? false) | ||
| { | ||
| var resolved = fieldDefinition.Signature.FieldType.Resolve(); | ||
| if (resolved != null && HasNonBlittableFields(resolved)) | ||
| return true; | ||
| } | ||
|
Comment on lines
+140
to
+145
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is cursed, but it's not your fault. I see no reason for:
I'm not asking you to change anything, except maybe returning true for null |
||
| } | ||
|
|
||
| return false; | ||
| } | ||
|
|
||
| private static string GetConvertedUnityTypeName(RewriteGlobalContext context, TypeDefinition unityType) | ||
|
acan1980728690 marked this conversation as resolved.
Outdated
|
||
| { | ||
| if (context.Options.PassthroughNames) | ||
| return unityType.Name; | ||
|
Check warning on line 153 in Il2CppInterop.Generator/Passes/Pass79UnstripTypes.cs
|
||
|
acan1980728690 marked this conversation as resolved.
Outdated
|
||
|
|
||
| return unityType.Name.MakeValidInSource(); | ||
| } | ||
|
|
||
| private static TypeAttributes ForcePublic(TypeAttributes typeAttributes) | ||
| { | ||
| var visibility = typeAttributes & TypeAttributes.VisibilityMask; | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That is so cursed that we were doing this before.