Skip to content

Commit e988ee5

Browse files
committed
[J.I, generator] Fix GetPeerMembers for interfaces.
1 parent 29f9707 commit e988ee5

File tree

5 files changed

+17
-13
lines changed

5 files changed

+17
-13
lines changed

src/Java.Interop/Java.Interop/JniPeerMembers.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@ namespace Java.Interop {
77

88
public partial class JniPeerMembers {
99

10-
public JniPeerMembers (string jniPeerTypeName, Type managedPeerType)
11-
: this (jniPeerTypeName, managedPeerType, checkManagedPeerType: true)
10+
private bool is_interface;
11+
12+
public JniPeerMembers (string jniPeerTypeName, Type managedPeerType, bool isInterface = false)
13+
: this (jniPeerTypeName, managedPeerType, checkManagedPeerType: true, isInterface: isInterface)
1214
{
1315
if (managedPeerType == null)
1416
throw new ArgumentNullException ("managedPeerType");
@@ -27,7 +29,7 @@ public JniPeerMembers (string jniPeerTypeName, Type managedPeerType)
2729
ManagedPeerType = managedPeerType;
2830
}
2931

30-
JniPeerMembers (string jniPeerTypeName, Type managedPeerType, bool checkManagedPeerType)
32+
JniPeerMembers (string jniPeerTypeName, Type managedPeerType, bool checkManagedPeerType, bool isInterface = false)
3133
{
3234
if (jniPeerTypeName == null)
3335
throw new ArgumentNullException (nameof (jniPeerTypeName));
@@ -51,6 +53,8 @@ public JniPeerMembers (string jniPeerTypeName, Type managedPeerType)
5153
JniPeerTypeName = jniPeerTypeName;
5254
ManagedPeerType = managedPeerType;
5355

56+
is_interface = isInterface;
57+
5458
instanceMethods = new JniInstanceMethods (this);
5559
instanceFields = new JniInstanceFields (this);
5660
staticMethods = new JniStaticMethods (this);
@@ -140,7 +144,7 @@ protected virtual bool UsesVirtualDispatch (IJavaPeerable value, Type declaringT
140144

141145
protected virtual JniPeerMembers GetPeerMembers (IJavaPeerable value)
142146
{
143-
return value.JniPeerMembers;
147+
return is_interface ? this : value.JniPeerMembers;
144148
}
145149

146150
internal static void AssertSelf (IJavaPeerable self)

tools/generator/Java.Interop.Tools.Generator.CodeGeneration/JavaInteropCodeGenerator.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ static string GetInvokeType (string type)
2929

3030
internal override void WriteClassHandle (ClassGen type, string indent, bool requireNew)
3131
{
32-
WritePeerMembers (indent + '\t', true, requireNew, type.RawJniName, type.Name);
32+
WritePeerMembers (indent + '\t', true, requireNew, type.RawJniName, type.Name, false);
3333

3434
writer.WriteLine ("{0}\tinternal static {1}IntPtr class_ref {{", indent, requireNew ? "new " : string.Empty);
3535
writer.WriteLine ("{0}\t\tget {{", indent);
@@ -55,12 +55,12 @@ internal override void WriteClassHandle (ClassGen type, string indent, bool requ
5555

5656
internal override void WriteClassHandle (InterfaceGen type, string indent, string declaringType)
5757
{
58-
WritePeerMembers (indent, false, true, type.RawJniName, declaringType);
58+
WritePeerMembers (indent, false, true, type.RawJniName, declaringType, type.Name == declaringType);
5959
}
6060

6161
internal override void WriteClassInvokerHandle (ClassGen type, string indent, string declaringType)
6262
{
63-
WritePeerMembers (indent, true, true, type.RawJniName, declaringType);
63+
WritePeerMembers (indent, true, true, type.RawJniName, declaringType, false);
6464

6565
writer.WriteLine ();
6666
writer.WriteLine ("{0}public override global::Java.Interop.JniPeerMembers JniPeerMembers {{", indent);
@@ -75,7 +75,7 @@ internal override void WriteClassInvokerHandle (ClassGen type, string indent, st
7575

7676
internal override void WriteInterfaceInvokerHandle (InterfaceGen type, string indent, string declaringType)
7777
{
78-
WritePeerMembers (indent, true, true, type.RawJniName, declaringType);
78+
WritePeerMembers (indent, true, true, type.RawJniName, declaringType, false);
7979

8080
writer.WriteLine ();
8181
writer.WriteLine ("{0}static IntPtr java_class_ref {{", indent);
@@ -262,10 +262,10 @@ internal override void WriteFieldSetBody (Field field, string indent, GenBase ty
262262
writer.WriteLine ("{0}}}", indent);
263263
}
264264

265-
void WritePeerMembers (string indent, bool isInternal, bool isNew, string rawJniType, string declaringType)
265+
void WritePeerMembers (string indent, bool isInternal, bool isNew, string rawJniType, string declaringType, bool isInterface)
266266
{
267267
var signature = $"{(isInternal ? "internal " : "")}static {(isNew ? "new " : "")}readonly JniPeerMembers _members = ";
268-
var type = $"new {GetPeerMembersType ()} (\"{rawJniType}\", typeof ({declaringType}));";
268+
var type = $"new {GetPeerMembersType ()} (\"{rawJniType}\", typeof ({declaringType}){(isInterface && !(this is XAJavaInteropCodeGenerator) ? ", true" : string.Empty)});";
269269

270270
writer.WriteLine ($"{indent}{signature}{type}");
271271
}

tools/generator/Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteInterfaceDefaultMethod.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Metadata.xml XPath interface reference: path="/api/package[@name='java.code']/interface[@name='IMyInterface']"
22
[Register ("java/code/IMyInterface", "", "java.code.IMyInterfaceInvoker")]
33
public partial interface IMyInterface : IJavaObject, IJavaPeerable {
4-
static new readonly JniPeerMembers _members = new JniPeerMembers ("java/code/IMyInterface", typeof (IMyInterface));
4+
static new readonly JniPeerMembers _members = new JniPeerMembers ("java/code/IMyInterface", typeof (IMyInterface), true);
55

66
static Delegate cb_DoSomething;
77
#pragma warning disable 0169

tools/generator/Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteInterfaceDefaultProperty.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Metadata.xml XPath interface reference: path="/api/package[@name='java.code']/interface[@name='IMyInterface']"
22
[Register ("java/code/IMyInterface", "", "java.code.IMyInterfaceInvoker")]
33
public partial interface IMyInterface : IJavaObject, IJavaPeerable {
4-
static new readonly JniPeerMembers _members = new JniPeerMembers ("java/code/IMyInterface", typeof (IMyInterface));
4+
static new readonly JniPeerMembers _members = new JniPeerMembers ("java/code/IMyInterface", typeof (IMyInterface), true);
55

66
static Delegate cb_get_Value;
77
#pragma warning disable 0169

tools/generator/Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteInterfaceDefaultPropertyGetterOnly.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Metadata.xml XPath interface reference: path="/api/package[@name='java.code']/interface[@name='IMyInterface']"
22
[Register ("java/code/IMyInterface", "", "java.code.IMyInterfaceInvoker")]
33
public partial interface IMyInterface : IJavaObject, IJavaPeerable {
4-
static new readonly JniPeerMembers _members = new JniPeerMembers ("java/code/IMyInterface", typeof (IMyInterface));
4+
static new readonly JniPeerMembers _members = new JniPeerMembers ("java/code/IMyInterface", typeof (IMyInterface), true);
55

66
static Delegate cb_get_Value;
77
#pragma warning disable 0169

0 commit comments

Comments
 (0)