Skip to content

Commit 429dc2a

Browse files
jonathanpeppersjonpryor
authored andcommitted
[jcw-gen] use Assembly Name instead of FullName for typemaps (#227)
Context: https://bugzilla.xamarin.com/show_bug.cgi?id=61073 The Java-to-Managed typemaps list types such as: android/app/Activity Android.App.Activity, Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=84e04ff9cfb79065 Let’s assume you have an Android project with the following assembly-level attribute: [assembly:AssemblyVersion("1.0.0.*")] Then on *every* build, the typemap is invalidated because your version number has been incremented. The fix here is to use the assembly’s short name via `GetName ().Name` or Mono.Cecil’s equivalent `AssemblyDefinition.Name.Name`. So the above typemap would only be `Android.App.Activity, Mono.Android`. These changes needed to happen in both `JavaNativeTypeManager` and `TypeNameMapGenerator`. The final fix is to find *every* instance of `TypeDefinitionRocks.GetAssemblyQualifiedName` and use `TypeDefinitionRocks.GetPartialAssemblyQualifiedName` in its place. The latter also had the issue of needing to replace the `/` character with `+`, so both methods return valid nested type names.
1 parent 57d5d51 commit 429dc2a

File tree

6 files changed

+59
-49
lines changed

6 files changed

+59
-49
lines changed

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

+5-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,11 @@ public static bool ImplementsInterface (this TypeDefinition type, string interfa
6464
public static string GetPartialAssemblyQualifiedName (this TypeReference type)
6565
{
6666
TypeDefinition def = type.Resolve ();
67-
return string.Format ("{0}, {1}", type.FullName, (def ?? type).Module.Assembly.Name.Name);
67+
return string.Format ("{0}, {1}",
68+
// Cecil likes to use '/' as the nested type separator, while
69+
// Reflection uses '+' as the nested type separator. Use Reflection.
70+
type.FullName.Replace ('/', '+'),
71+
(def ?? type).Module.Assembly.Name.Name);
6872
}
6973

7074
public static string GetAssemblyQualifiedName (this TypeReference type)

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

+6-6
Original file line numberDiff line numberDiff line change
@@ -385,9 +385,9 @@ string GetManagedParameters (MethodDefinition ctor, string outerType)
385385
if (sb.Length > 0)
386386
sb.Append (':');
387387
if (outerType != null && sb.Length == 0)
388-
sb.Append (type.DeclaringType.GetAssemblyQualifiedName ());
388+
sb.Append (type.DeclaringType.GetPartialAssemblyQualifiedName ());
389389
else
390-
sb.Append (pdef.ParameterType.GetAssemblyQualifiedName ());
390+
sb.Append (pdef.ParameterType.GetPartialAssemblyQualifiedName ());
391391
}
392392
return sb.ToString ();
393393
}
@@ -567,12 +567,12 @@ void GenerateBody (TextWriter sw)
567567

568568
if (GenerateOnCreateOverrides && JavaNativeTypeManager.IsApplication (type) && !methods.Any (m => m.Name == "onCreate"))
569569
WriteApplicationOnCreate (sw, w => {
570-
w.WriteLine ("\t\tmono.android.Runtime.register (\"{0}\", {1}.class, __md_methods);", type.GetAssemblyQualifiedName (), name);
570+
w.WriteLine ("\t\tmono.android.Runtime.register (\"{0}\", {1}.class, __md_methods);", type.GetPartialAssemblyQualifiedName (), name);
571571
w.WriteLine ("\t\tsuper.onCreate ();");
572572
});
573573
if (GenerateOnCreateOverrides && JavaNativeTypeManager.IsInstrumentation (type) && !methods.Any (m => m.Name == "onCreate"))
574574
WriteInstrumentationOnCreate (sw, w => {
575-
w.WriteLine ("\t\tmono.android.Runtime.register (\"{0}\", {1}.class, __md_methods);", type.GetAssemblyQualifiedName (), name);
575+
w.WriteLine ("\t\tmono.android.Runtime.register (\"{0}\", {1}.class, __md_methods);", type.GetPartialAssemblyQualifiedName (), name);
576576
w.WriteLine ("\t\tsuper.onCreate (arguments);");
577577
});
578578

@@ -600,7 +600,7 @@ static void GenerateRegisterType (TextWriter sw, JavaCallableWrapperGenerator se
600600
sw.WriteLine ("\t\t\t\"\";");
601601
if (!CannotRegisterInStaticConstructor (self.type))
602602
sw.WriteLine ("\t\tmono.android.Runtime.register (\"{0}\", {1}.class, {2});",
603-
self.type.GetAssemblyQualifiedName (), self.name, field);
603+
self.type.GetPartialAssemblyQualifiedName (), self.name, field);
604604
}
605605

606606
void GenerateFooter (TextWriter sw)
@@ -767,7 +767,7 @@ void GenerateConstructor (Signature ctor, TextWriter sw)
767767
#endif
768768
if (!CannotRegisterInStaticConstructor (type)) {
769769
sw.WriteLine ("\t\tif (getClass () == {0}.class)", name);
770-
sw.WriteLine ("\t\t\tmono.android.TypeManager.Activate (\"{0}\", \"{1}\", this, new java.lang.Object[] {{ {2} }});", type.GetAssemblyQualifiedName (), ctor.ManagedParameters, ctor.ActivateCall);
770+
sw.WriteLine ("\t\t\tmono.android.TypeManager.Activate (\"{0}\", \"{1}\", this, new java.lang.Object[] {{ {2} }});", type.GetPartialAssemblyQualifiedName (), ctor.ManagedParameters, ctor.ActivateCall);
771771
}
772772
sw.WriteLine ("\t}");
773773
}

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ public void WriteJavaToManaged (Stream output)
141141
var typeMap = GetTypeMapping (
142142
t => t.IsInterface || t.HasGenericParameters,
143143
JavaNativeTypeManager.ToJniName,
144-
t => t.GetAssemblyQualifiedName ());
144+
t => t.GetPartialAssemblyQualifiedName ());
145145

146146
WriteBinaryMapping (output, typeMap);
147147
}
@@ -234,7 +234,7 @@ public void WriteManagedToJava (Stream output)
234234

235235
var typeMap = GetTypeMapping (
236236
t => false,
237-
t => t.GetAssemblyQualifiedName (),
237+
t => t.GetPartialAssemblyQualifiedName (),
238238
JavaNativeTypeManager.ToJniName);
239239

240240
WriteBinaryMapping (output, typeMap);

src/Java.Interop.Tools.JavaCallableWrappers/Test/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGeneratorTests.cs

+19-19
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ public void GenerateIndirectApplication (
9393
)
9494
{
9595
var actual = Generate (typeof (IndirectApplication), applicationJavaClass);
96-
var expected = @"package md5fef72cac46d04ae5bdc90af5bb6221ad;
96+
var expected = @"package md5f43cdfade412ae71b21bb70a5c2841ab;
9797
9898
9999
public class IndirectApplication
@@ -144,7 +144,7 @@ public void monodroidClearReferences ()
144144
public void GenerateExportedMembers ()
145145
{
146146
var actual = Generate (typeof (ExportsMembers));
147-
var expected = @"package md5fef72cac46d04ae5bdc90af5bb6221ad;
147+
var expected = @"package md5f43cdfade412ae71b21bb70a5c2841ab;
148148
149149
150150
public class ExportsMembers
@@ -156,28 +156,28 @@ extends java.lang.Object
156156
public static final String __md_methods;
157157
static {
158158
__md_methods =
159-
""n_GetInstance:()Lmd5fef72cac46d04ae5bdc90af5bb6221ad/ExportsMembers;:__export__\n"" +
159+
""n_GetInstance:()Lmd5f43cdfade412ae71b21bb70a5c2841ab/ExportsMembers;:__export__\n"" +
160160
""n_GetValue:()Ljava/lang/String;:__export__\n"" +
161161
""n_methodNamesNotMangled:()V:__export__\n"" +
162162
""n_CompletelyDifferentName:(Ljava/lang/String;I)Ljava/lang/String;:__export__\n"" +
163163
""n_methodThatThrows:()V:__export__\n"" +
164164
""n_methodThatThrowsEmptyArray:()V:__export__\n"" +
165165
"""";
166-
mono.android.Runtime.register (""Xamarin.Android.ToolsTests.ExportsMembers, Java.Interop.Tools.JavaCallableWrappers-Tests, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"", ExportsMembers.class, __md_methods);
166+
mono.android.Runtime.register (""Xamarin.Android.ToolsTests.ExportsMembers, Java.Interop.Tools.JavaCallableWrappers-Tests"", ExportsMembers.class, __md_methods);
167167
}
168168
169169
170-
public static md5fef72cac46d04ae5bdc90af5bb6221ad.ExportsMembers STATIC_INSTANCE = GetInstance ();
170+
public static md5f43cdfade412ae71b21bb70a5c2841ab.ExportsMembers STATIC_INSTANCE = GetInstance ();
171171
172172
173173
public java.lang.String VALUE = GetValue ();
174174
175-
public static md5fef72cac46d04ae5bdc90af5bb6221ad.ExportsMembers GetInstance ()
175+
public static md5f43cdfade412ae71b21bb70a5c2841ab.ExportsMembers GetInstance ()
176176
{
177177
return n_GetInstance ();
178178
}
179179
180-
private static native md5fef72cac46d04ae5bdc90af5bb6221ad.ExportsMembers n_GetInstance ();
180+
private static native md5f43cdfade412ae71b21bb70a5c2841ab.ExportsMembers n_GetInstance ();
181181
182182
public java.lang.String GetValue ()
183183
{
@@ -240,7 +240,7 @@ public void monodroidClearReferences ()
240240
public void GenerateInnerClass ()
241241
{
242242
var actual = Generate (typeof (ExampleOuterClass));
243-
var expected = @"package md5fef72cac46d04ae5bdc90af5bb6221ad;
243+
var expected = @"package md5f43cdfade412ae71b21bb70a5c2841ab;
244244
245245
246246
public class ExampleOuterClass
@@ -254,10 +254,10 @@ extends register.NonStaticOuterClass
254254
static {
255255
__md_methods =
256256
"""";
257-
mono.android.Runtime.register (""Xamarin.Android.ToolsTests.ExampleOuterClass, Java.Interop.Tools.JavaCallableWrappers-Tests, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"", ExampleOuterClass.class, __md_methods);
257+
mono.android.Runtime.register (""Xamarin.Android.ToolsTests.ExampleOuterClass, Java.Interop.Tools.JavaCallableWrappers-Tests"", ExampleOuterClass.class, __md_methods);
258258
__md_1_methods =
259259
"""";
260-
mono.android.Runtime.register (""Xamarin.Android.ToolsTests.ExampleOuterClass+ExampleInnerClass, Java.Interop.Tools.JavaCallableWrappers-Tests, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"", ExampleOuterClass_ExampleInnerClass.class, __md_1_methods);
260+
mono.android.Runtime.register (""Xamarin.Android.ToolsTests.ExampleOuterClass+ExampleInnerClass, Java.Interop.Tools.JavaCallableWrappers-Tests"", ExampleOuterClass_ExampleInnerClass.class, __md_1_methods);
261261
}
262262
263263
private java.util.ArrayList refList;
@@ -316,7 +316,7 @@ extends java.lang.Object
316316
static {
317317
__md_methods =
318318
"""";
319-
mono.android.Runtime.register (""Xamarin.Android.ToolsTests.RegisterName+DefaultNestedName, Java.Interop.Tools.JavaCallableWrappers-Tests, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"", Name_DefaultNestedName.class, __md_methods);
319+
mono.android.Runtime.register (""Xamarin.Android.ToolsTests.RegisterName+DefaultNestedName, Java.Interop.Tools.JavaCallableWrappers-Tests"", Name_DefaultNestedName.class, __md_methods);
320320
}
321321
322322
private java.util.ArrayList refList;
@@ -354,7 +354,7 @@ extends java.lang.Object
354354
static {
355355
__md_methods =
356356
"""";
357-
mono.android.Runtime.register (""Xamarin.Android.ToolsTests.RegisterName+OverrideNestedName, Java.Interop.Tools.JavaCallableWrappers-Tests, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"", Name$Override.class, __md_methods);
357+
mono.android.Runtime.register (""Xamarin.Android.ToolsTests.RegisterName+OverrideNestedName, Java.Interop.Tools.JavaCallableWrappers-Tests"", Name$Override.class, __md_methods);
358358
}
359359
360360
private java.util.ArrayList refList;
@@ -392,23 +392,23 @@ extends java.lang.Object
392392
static {
393393
__md_methods =
394394
"""";
395-
mono.android.Runtime.register (""Xamarin.Android.ToolsTests.ExportsConstructors, Java.Interop.Tools.JavaCallableWrappers-Tests, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"", ExportsConstructors.class, __md_methods);
395+
mono.android.Runtime.register (""Xamarin.Android.ToolsTests.ExportsConstructors, Java.Interop.Tools.JavaCallableWrappers-Tests"", ExportsConstructors.class, __md_methods);
396396
}
397397
398398
399399
public ExportsConstructors ()
400400
{
401401
super ();
402402
if (getClass () == ExportsConstructors.class)
403-
mono.android.TypeManager.Activate (""Xamarin.Android.ToolsTests.ExportsConstructors, Java.Interop.Tools.JavaCallableWrappers-Tests, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"", """", this, new java.lang.Object[] { });
403+
mono.android.TypeManager.Activate (""Xamarin.Android.ToolsTests.ExportsConstructors, Java.Interop.Tools.JavaCallableWrappers-Tests"", """", this, new java.lang.Object[] { });
404404
}
405405
406406
407407
public ExportsConstructors (int p0)
408408
{
409409
super (p0);
410410
if (getClass () == ExportsConstructors.class)
411-
mono.android.TypeManager.Activate (""Xamarin.Android.ToolsTests.ExportsConstructors, Java.Interop.Tools.JavaCallableWrappers-Tests, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"", """", this, new java.lang.Object[] { p0 });
411+
mono.android.TypeManager.Activate (""Xamarin.Android.ToolsTests.ExportsConstructors, Java.Interop.Tools.JavaCallableWrappers-Tests"", """", this, new java.lang.Object[] { p0 });
412412
}
413413
414414
private java.util.ArrayList refList;
@@ -446,31 +446,31 @@ extends java.lang.Object
446446
static {
447447
__md_methods =
448448
"""";
449-
mono.android.Runtime.register (""Xamarin.Android.ToolsTests.ExportsThrowsConstructors, Java.Interop.Tools.JavaCallableWrappers-Tests, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"", ExportsThrowsConstructors.class, __md_methods);
449+
mono.android.Runtime.register (""Xamarin.Android.ToolsTests.ExportsThrowsConstructors, Java.Interop.Tools.JavaCallableWrappers-Tests"", ExportsThrowsConstructors.class, __md_methods);
450450
}
451451
452452
453453
public ExportsThrowsConstructors () throws java.lang.Throwable
454454
{
455455
super ();
456456
if (getClass () == ExportsThrowsConstructors.class)
457-
mono.android.TypeManager.Activate (""Xamarin.Android.ToolsTests.ExportsThrowsConstructors, Java.Interop.Tools.JavaCallableWrappers-Tests, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"", """", this, new java.lang.Object[] { });
457+
mono.android.TypeManager.Activate (""Xamarin.Android.ToolsTests.ExportsThrowsConstructors, Java.Interop.Tools.JavaCallableWrappers-Tests"", """", this, new java.lang.Object[] { });
458458
}
459459
460460
461461
public ExportsThrowsConstructors (int p0) throws java.lang.Throwable
462462
{
463463
super (p0);
464464
if (getClass () == ExportsThrowsConstructors.class)
465-
mono.android.TypeManager.Activate (""Xamarin.Android.ToolsTests.ExportsThrowsConstructors, Java.Interop.Tools.JavaCallableWrappers-Tests, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"", """", this, new java.lang.Object[] { p0 });
465+
mono.android.TypeManager.Activate (""Xamarin.Android.ToolsTests.ExportsThrowsConstructors, Java.Interop.Tools.JavaCallableWrappers-Tests"", """", this, new java.lang.Object[] { p0 });
466466
}
467467
468468
469469
public ExportsThrowsConstructors (java.lang.String p0)
470470
{
471471
super (p0);
472472
if (getClass () == ExportsThrowsConstructors.class)
473-
mono.android.TypeManager.Activate (""Xamarin.Android.ToolsTests.ExportsThrowsConstructors, Java.Interop.Tools.JavaCallableWrappers-Tests, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"", """", this, new java.lang.Object[] { p0 });
473+
mono.android.TypeManager.Activate (""Xamarin.Android.ToolsTests.ExportsThrowsConstructors, Java.Interop.Tools.JavaCallableWrappers-Tests"", """", this, new java.lang.Object[] { p0 });
474474
}
475475
476476
private java.util.ArrayList refList;

0 commit comments

Comments
 (0)