Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions gendarme-ignore.txt
Original file line number Diff line number Diff line change
Expand Up @@ -351,6 +351,7 @@ T: Java.Interop.JniInt32ArrayElements
T: Java.Interop.JniInt64ArrayElements
T: Java.Interop.JniLocationException
T: Java.Interop.JniMethodInfo
T: Java.Interop.JniPeerMembers
T: Java.Interop.JniSByteArrayElements
T: Java.Interop.JniSingleArrayElements
T: Java.Interop.JniType
Expand Down
15 changes: 12 additions & 3 deletions src/Java.Interop/Java.Interop/JniPeerMembers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,15 @@ namespace Java.Interop {

public partial class JniPeerMembers {

private bool isInterface;

public JniPeerMembers (string jniPeerTypeName, Type managedPeerType, bool isInterface)
: this (jniPeerTypeName, managedPeerType, checkManagedPeerType: true, isInterface: isInterface)
{
}

public JniPeerMembers (string jniPeerTypeName, Type managedPeerType)
: this (jniPeerTypeName, managedPeerType, checkManagedPeerType: true)
: this (jniPeerTypeName, managedPeerType, checkManagedPeerType: true, isInterface: false)
{
if (managedPeerType == null)
throw new ArgumentNullException ("managedPeerType");
Expand All @@ -27,7 +34,7 @@ public JniPeerMembers (string jniPeerTypeName, Type managedPeerType)
ManagedPeerType = managedPeerType;
}

JniPeerMembers (string jniPeerTypeName, Type managedPeerType, bool checkManagedPeerType)
JniPeerMembers (string jniPeerTypeName, Type managedPeerType, bool checkManagedPeerType, bool isInterface = false)
{
if (jniPeerTypeName == null)
throw new ArgumentNullException (nameof (jniPeerTypeName));
Expand All @@ -51,6 +58,8 @@ public JniPeerMembers (string jniPeerTypeName, Type managedPeerType)
JniPeerTypeName = jniPeerTypeName;
ManagedPeerType = managedPeerType;

this.isInterface = isInterface;

instanceMethods = new JniInstanceMethods (this);
instanceFields = new JniInstanceFields (this);
staticMethods = new JniStaticMethods (this);
Expand Down Expand Up @@ -140,7 +149,7 @@ protected virtual bool UsesVirtualDispatch (IJavaPeerable value, Type declaringT

protected virtual JniPeerMembers GetPeerMembers (IJavaPeerable value)
{
return value.JniPeerMembers;
return isInterface ? this : value.JniPeerMembers;
}

internal static void AssertSelf (IJavaPeerable self)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ static string GetInvokeType (string type)

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

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

internal override void WriteClassHandle (InterfaceGen type, string indent, string declaringType)
{
WritePeerMembers (indent, false, true, type.RawJniName, declaringType);
WritePeerMembers (indent, false, true, type.RawJniName, declaringType, type.Name == declaringType);
}

internal override void WriteClassInvokerHandle (ClassGen type, string indent, string declaringType)
{
WritePeerMembers (indent, true, true, type.RawJniName, declaringType);
WritePeerMembers (indent, true, true, type.RawJniName, declaringType, false);

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

internal override void WriteInterfaceInvokerHandle (InterfaceGen type, string indent, string declaringType)
{
WritePeerMembers (indent, true, true, type.RawJniName, declaringType);
WritePeerMembers (indent, true, true, type.RawJniName, declaringType, false);

writer.WriteLine ();
writer.WriteLine ("{0}static IntPtr java_class_ref {{", indent);
Expand Down Expand Up @@ -262,10 +262,10 @@ internal override void WriteFieldSetBody (Field field, string indent, GenBase ty
writer.WriteLine ("{0}}}", indent);
}

void WritePeerMembers (string indent, bool isInternal, bool isNew, string rawJniType, string declaringType)
void WritePeerMembers (string indent, bool isInternal, bool isNew, string rawJniType, string declaringType, bool isInterface)
{
var signature = $"{(isInternal ? "internal " : "")}static {(isNew ? "new " : "")}readonly JniPeerMembers _members = ";
var type = $"new {GetPeerMembersType ()} (\"{rawJniType}\", typeof ({declaringType}));";
var type = $"new {GetPeerMembersType ()} (\"{rawJniType}\", typeof ({declaringType}){(isInterface ? ", isInterface: true" : string.Empty)});";

writer.WriteLine ($"{indent}{signature}{type}");
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// Metadata.xml XPath interface reference: path="/api/package[@name='java.code']/interface[@name='IMyInterface']"
[Register ("java/code/IMyInterface", "", "java.code.IMyInterfaceInvoker")]
public partial interface IMyInterface : IJavaObject, IJavaPeerable {
static new readonly JniPeerMembers _members = new JniPeerMembers ("java/code/IMyInterface", typeof (IMyInterface));
static new readonly JniPeerMembers _members = new JniPeerMembers ("java/code/IMyInterface", typeof (IMyInterface), isInterface: true);

static Delegate cb_DoSomething;
#pragma warning disable 0169
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// Metadata.xml XPath interface reference: path="/api/package[@name='java.code']/interface[@name='IMyInterface']"
[Register ("java/code/IMyInterface", "", "java.code.IMyInterfaceInvoker")]
public partial interface IMyInterface : IJavaObject, IJavaPeerable {
static new readonly JniPeerMembers _members = new JniPeerMembers ("java/code/IMyInterface", typeof (IMyInterface));
static new readonly JniPeerMembers _members = new JniPeerMembers ("java/code/IMyInterface", typeof (IMyInterface), isInterface: true);

static Delegate cb_get_Value;
#pragma warning disable 0169
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// Metadata.xml XPath interface reference: path="/api/package[@name='java.code']/interface[@name='IMyInterface']"
[Register ("java/code/IMyInterface", "", "java.code.IMyInterfaceInvoker")]
public partial interface IMyInterface : IJavaObject, IJavaPeerable {
static new readonly JniPeerMembers _members = new JniPeerMembers ("java/code/IMyInterface", typeof (IMyInterface));
static new readonly JniPeerMembers _members = new JniPeerMembers ("java/code/IMyInterface", typeof (IMyInterface), isInterface: true);

static Delegate cb_get_Value;
#pragma warning disable 0169
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// Metadata.xml XPath interface reference: path="/api/package[@name='java.code']/interface[@name='IMyInterface']"
[Register ("java/code/IMyInterface", "", "java.code.IMyInterfaceInvoker")]
public partial interface IMyInterface : IJavaObject, IJavaPeerable {
static new readonly JniPeerMembers _members = new XAPeerMembers ("java/code/IMyInterface", typeof (IMyInterface));
static new readonly JniPeerMembers _members = new XAPeerMembers ("java/code/IMyInterface", typeof (IMyInterface), isInterface: true);

static Delegate cb_DoSomething;
#pragma warning disable 0169
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// Metadata.xml XPath interface reference: path="/api/package[@name='java.code']/interface[@name='IMyInterface']"
[Register ("java/code/IMyInterface", "", "java.code.IMyInterfaceInvoker")]
public partial interface IMyInterface : IJavaObject, IJavaPeerable {
static new readonly JniPeerMembers _members = new XAPeerMembers ("java/code/IMyInterface", typeof (IMyInterface));
static new readonly JniPeerMembers _members = new XAPeerMembers ("java/code/IMyInterface", typeof (IMyInterface), isInterface: true);

static Delegate cb_get_Value;
#pragma warning disable 0169
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// Metadata.xml XPath interface reference: path="/api/package[@name='java.code']/interface[@name='IMyInterface']"
[Register ("java/code/IMyInterface", "", "java.code.IMyInterfaceInvoker")]
public partial interface IMyInterface : IJavaObject, IJavaPeerable {
static new readonly JniPeerMembers _members = new XAPeerMembers ("java/code/IMyInterface", typeof (IMyInterface));
static new readonly JniPeerMembers _members = new XAPeerMembers ("java/code/IMyInterface", typeof (IMyInterface), isInterface: true);

static Delegate cb_get_Value;
#pragma warning disable 0169
Expand Down