Skip to content

Commit 02aa54e

Browse files
authored
[Java.Interop.Tools.JavaCallableWrappers] marshal method decl types (#987)
Context: dotnet/android#7004 Context: fb94d59 fb94d59 added code to collect all `override` method descriptors in a list, so that the future marshal methods code generator can generate correct code for them. However, not all gathered descriptors contain the name of the managed type which declares the overridden methods, which is data that the native marshal method generator needs. Update when `JavaCallableWrapperGenerator.OverriddenMethodDescriptors` is populated so that the marshal method's declaring type is used.
1 parent e7bacc3 commit 02aa54e

File tree

2 files changed

+22
-18
lines changed

2 files changed

+22
-18
lines changed

src/Java.Interop.Tools.Cecil/Java.Interop.Tools.Cecil/TypeDefinitionRocks.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ public static string GetPartialAssemblyQualifiedName (this TypeReference type, I
143143
return string.Format ("{0}, {1}",
144144
// Cecil likes to use '/' as the nested type separator, while
145145
// Reflection uses '+' as the nested type separator. Use Reflection.
146-
type.FullName.Replace ('/', '+'),
146+
CecilTypeNameToReflectionTypeName (type.FullName),
147147
type.GetPartialAssemblyName (resolver));
148148
}
149149

@@ -160,7 +160,7 @@ public static string GetAssemblyQualifiedName (this TypeReference type, IMetadat
160160
return string.Format ("{0}, {1}",
161161
// Cecil likes to use '/' as the nested type separator, while
162162
// Reflection uses '+' as the nested type separator. Use Reflection.
163-
type.FullName.Replace ('/', '+'),
163+
CecilTypeNameToReflectionTypeName (type.FullName),
164164
(def ?? type).Module.Assembly.Name.FullName);
165165
}
166166

@@ -188,5 +188,7 @@ public static string GetAssemblyQualifiedName (this TypeReference type, IMetadat
188188

189189
return null;
190190
}
191+
192+
public static string? CecilTypeNameToReflectionTypeName (string? typeName) => typeName?.Replace ('/', '+');
191193
}
192194
}

src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGenerator.cs

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,11 @@ public class OverriddenMethodDescriptor
3434
public string JniSignature { get; }
3535
public string Connector { get; }
3636
public string ManagedTypeName { get; }
37+
public string OriginalDescString { get; }
3738

38-
public OverriddenMethodDescriptor (string javaPackageName, string methodDescription)
39+
public OverriddenMethodDescriptor (string javaPackageName, string methodDescription, string fallbackManagedTypeName)
3940
{
41+
OriginalDescString = methodDescription;
4042
JavaPackageName = javaPackageName;
4143
string[] parts = methodDescription.Split (methodDescSplitChars, 4);
4244

@@ -49,9 +51,13 @@ public OverriddenMethodDescriptor (string javaPackageName, string methodDescript
4951
if (parts.Length > 2) {
5052
Connector = parts[2];
5153
if (parts.Length > 3) {
52-
ManagedTypeName = parts[3];
54+
ManagedTypeName = TypeDefinitionRocks.CecilTypeNameToReflectionTypeName (parts[3]);
5355
}
5456
}
57+
58+
if (String.IsNullOrEmpty (ManagedTypeName)) {
59+
ManagedTypeName = fallbackManagedTypeName;
60+
}
5561
}
5662
}
5763

@@ -529,7 +535,6 @@ string GetManagedParameters (MethodDefinition ctor, string outerType)
529535

530536
public void Generate (TextWriter writer)
531537
{
532-
overriddenMethodDescriptors = new List<OverriddenMethodDescriptor> ();
533538
if (!string.IsNullOrEmpty (package)) {
534539
writer.WriteLine ("package " + package + ";");
535540
writer.WriteLine ();
@@ -563,17 +568,6 @@ public void Generate (TextWriter writer)
563568
}
564569

565570
GenerateFooter (writer);
566-
567-
string javaTypeName = $"{package}.{name}";
568-
AddOverridenMethods (methods);
569-
AddOverridenMethods (ctors);
570-
571-
void AddOverridenMethods (List<Signature> list)
572-
{
573-
foreach (Signature sig in list) {
574-
overriddenMethodDescriptors.Add (new OverriddenMethodDescriptor (javaTypeName, sig.Method));
575-
}
576-
}
577571
}
578572

579573
public void Generate (string outputPath)
@@ -716,9 +710,17 @@ void GenerateBody (TextWriter sw)
716710

717711
void GenerateRegisterType (TextWriter sw, JavaCallableWrapperGenerator self, string field)
718712
{
713+
if (overriddenMethodDescriptors == null) {
714+
overriddenMethodDescriptors = new List<OverriddenMethodDescriptor> ();
715+
}
716+
719717
sw.WriteLine ("\t\t{0} = ", field);
720-
foreach (Signature method in self.methods)
718+
string managedTypeName = self.type.GetPartialAssemblyQualifiedName (cache);
719+
string javaTypeName = $"{package}.{name}";
720+
foreach (Signature method in self.methods) {
721721
sw.WriteLine ("\t\t\t\"{0}\\n\" +", method.Method);
722+
overriddenMethodDescriptors.Add (new OverriddenMethodDescriptor (javaTypeName, method.Method, managedTypeName));
723+
}
722724
sw.WriteLine ("\t\t\t\"\";");
723725
if (CannotRegisterInStaticConstructor (self.type))
724726
return;
@@ -732,7 +734,7 @@ void GenerateRegisterType (TextWriter sw, JavaCallableWrapperGenerator self, str
732734
break;
733735
}
734736
sw.Write ("\t\t");
735-
sw.WriteLine (format, self.type.GetPartialAssemblyQualifiedName (cache), self.name, field);
737+
sw.WriteLine (format, managedTypeName, self.name, field);
736738
}
737739

738740
void GenerateFooter (TextWriter sw)

0 commit comments

Comments
 (0)