Skip to content

Commit a1d1b81

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

File tree

8 files changed

+24
-15
lines changed

8 files changed

+24
-15
lines changed

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

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

88
public partial class JniPeerMembers {
99

10+
private bool isInterface;
11+
12+
public JniPeerMembers (string jniPeerTypeName, Type managedPeerType, bool isInterface)
13+
: this (jniPeerTypeName, managedPeerType, checkManagedPeerType: true, isInterface: isInterface)
14+
{
15+
}
16+
1017
public JniPeerMembers (string jniPeerTypeName, Type managedPeerType)
11-
: this (jniPeerTypeName, managedPeerType, checkManagedPeerType: true)
18+
: this (jniPeerTypeName, managedPeerType, checkManagedPeerType: true, isInterface: false)
1219
{
1320
if (managedPeerType == null)
1421
throw new ArgumentNullException ("managedPeerType");
@@ -27,7 +34,7 @@ public JniPeerMembers (string jniPeerTypeName, Type managedPeerType)
2734
ManagedPeerType = managedPeerType;
2835
}
2936

30-
JniPeerMembers (string jniPeerTypeName, Type managedPeerType, bool checkManagedPeerType)
37+
JniPeerMembers (string jniPeerTypeName, Type managedPeerType, bool checkManagedPeerType, bool isInterface = false)
3138
{
3239
if (jniPeerTypeName == null)
3340
throw new ArgumentNullException (nameof (jniPeerTypeName));
@@ -51,6 +58,8 @@ public JniPeerMembers (string jniPeerTypeName, Type managedPeerType)
5158
JniPeerTypeName = jniPeerTypeName;
5259
ManagedPeerType = managedPeerType;
5360

61+
this.isInterface = isInterface;
62+
5463
instanceMethods = new JniInstanceMethods (this);
5564
instanceFields = new JniInstanceFields (this);
5665
staticMethods = new JniStaticMethods (this);
@@ -140,7 +149,7 @@ protected virtual bool UsesVirtualDispatch (IJavaPeerable value, Type declaringT
140149

141150
protected virtual JniPeerMembers GetPeerMembers (IJavaPeerable value)
142151
{
143-
return value.JniPeerMembers;
152+
return isInterface ? this : value.JniPeerMembers;
144153
}
145154

146155
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 ? ", isInterface: 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), isInterface: 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), isInterface: 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), isInterface: true);
55

66
static Delegate cb_get_Value;
77
#pragma warning disable 0169

tools/generator/Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1/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 XAPeerMembers ("java/code/IMyInterface", typeof (IMyInterface));
4+
static new readonly JniPeerMembers _members = new XAPeerMembers ("java/code/IMyInterface", typeof (IMyInterface), isInterface: true);
55

66
static Delegate cb_DoSomething;
77
#pragma warning disable 0169

tools/generator/Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1/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 XAPeerMembers ("java/code/IMyInterface", typeof (IMyInterface));
4+
static new readonly JniPeerMembers _members = new XAPeerMembers ("java/code/IMyInterface", typeof (IMyInterface), isInterface: true);
55

66
static Delegate cb_get_Value;
77
#pragma warning disable 0169

tools/generator/Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1/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 XAPeerMembers ("java/code/IMyInterface", typeof (IMyInterface));
4+
static new readonly JniPeerMembers _members = new XAPeerMembers ("java/code/IMyInterface", typeof (IMyInterface), isInterface: true);
55

66
static Delegate cb_get_Value;
77
#pragma warning disable 0169

0 commit comments

Comments
 (0)