Skip to content

[generator] fix generic parameter code generation for interface. #100

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Nov 9, 2016
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
4 changes: 4 additions & 0 deletions tools/generator/CollectionSymbol.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,10 @@ public string ElementType {
get { return null; }
}

public bool MayHaveManagedGenericArguments {
get { return true; }
}

public string GetObjectHandleProperty (string variable)
{
return $"((global::Java.Lang.Object) {variable}).Handle";
Expand Down
3 changes: 2 additions & 1 deletion tools/generator/GenericSymbol.cs
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,8 @@ public string FromNative (CodeGenerationOptions opt, string varname, bool owned)

public string GetGenericType (Dictionary<string, string> mappings)
{
return gen.FullName + (mappings == null ? tps : MapTypeParams (mappings));
var rgm = gen as IRequireGenericMarshal;
return gen.FullName + (rgm != null && !rgm.MayHaveManagedGenericArguments ? null : mappings == null ? tps : MapTypeParams (mappings));
}

public string ToNative (CodeGenerationOptions opt, string varname)
Expand Down
1 change: 1 addition & 0 deletions tools/generator/IRequireGenericMarshal.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ namespace MonoDroid.Generation
{
public interface IRequireGenericMarshal
{
bool MayHaveManagedGenericArguments { get; }
string GetGenericJavaObjectTypeOverride ();
string ToInteroperableJavaObject (string varname);
}
Expand Down
9 changes: 9 additions & 0 deletions tools/generator/InterfaceGen.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,14 @@ public ManagedInterfaceGen (TypeDefinition t)
AddMethod (new ManagedMethod (this, m));
}
}

public override string ArgsType {
get { throw new NotImplementedException (); }
}

public override bool MayHaveManagedGenericArguments {
get { return !this.IsAcw; }
}
}
#endif

Expand Down Expand Up @@ -109,6 +114,10 @@ public bool IsListener {
get { return Name.EndsWith ("Listener") && Properties.Count == 0 && Interfaces.Count == 0; }
}

public virtual bool MayHaveManagedGenericArguments {
get { return false; }
}

public override string NativeType {
get { return "IntPtr"; }
}
Expand Down
20 changes: 20 additions & 0 deletions tools/generator/Tests/GenericArguments.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
using System;
using NUnit.Framework;

namespace generatortests
{
[TestFixture]
public class GenericArguments : BaseGeneratorTest
{
[Test]
public void GeneratedOK ()
{
RunAllTargets (
outputRelativePath: "GenericArguments",
apiDescriptionFile: "expected/GenericArguments/GenericArguments.xml",
expectedRelativePath: "GenericArguments",
additionalSupportPaths: null);
}
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
using System;
using System.Collections.Generic;
using Android.Runtime;
using Java.Interop;

namespace Com.Google.Android.Exoplayer.Drm {

// Metadata.xml XPath class reference: path="/api/package[@name='com.google.android.exoplayer.drm']/class[@name='FrameworkMediaDrm']"
[global::Android.Runtime.Register ("com/google/android/exoplayer/drm/FrameworkMediaDrm", DoNotGenerateAcw=true)]
public sealed partial class FrameworkMediaDrm : global::Java.Lang.Object, global::Com.Google.Android.Exoplayer.Drm.IExoMediaDrm {

internal static readonly JniPeerMembers _members = new JniPeerMembers ("com/google/android/exoplayer/drm/FrameworkMediaDrm", typeof (FrameworkMediaDrm));
internal static IntPtr class_ref {
get {
return _members.JniPeerType.PeerReference.Handle;
}
}

public override global::Java.Interop.JniPeerMembers JniPeerMembers {
get { return _members; }
}

protected override IntPtr ThresholdClass {
get { return _members.JniPeerType.PeerReference.Handle; }
}

protected override global::System.Type ThresholdType {
get { return _members.ManagedPeerType; }
}

internal FrameworkMediaDrm (IntPtr javaReference, JniHandleOwnership transfer) : base (javaReference, transfer) {}

// Metadata.xml XPath constructor reference: path="/api/package[@name='com.google.android.exoplayer.drm']/class[@name='FrameworkMediaDrm']/constructor[@name='FrameworkMediaDrm' and count(parameter)=0]"
[Register (".ctor", "()V", "")]
public unsafe FrameworkMediaDrm ()
: base (IntPtr.Zero, JniHandleOwnership.DoNotTransfer)
{
const string __id = "()V";

if (((global::Java.Lang.Object) this).Handle != IntPtr.Zero)
return;

try {
var __r = _members.InstanceMethods.StartCreateInstance (__id, ((object) this).GetType (), null);
SetHandle (__r.Handle, JniHandleOwnership.TransferLocalRef);
_members.InstanceMethods.FinishCreateInstance (__id, this, null);
} finally {
}
}

// Metadata.xml XPath method reference: path="/api/package[@name='com.google.android.exoplayer.drm']/class[@name='FrameworkMediaDrm']/method[@name='setOnEventListener' and count(parameter)=1 and parameter[1][@type='com.google.android.exoplayer.drm.ExoMediaDrm.OnEventListener&lt;com.google.android.exoplayer.drm.FrameworkMediaCrypto&gt;']]"
[Register ("setOnEventListener", "(Lcom/google/android/exoplayer/drm/ExoMediaDrm$OnEventListener;)V", "")]
public unsafe void SetOnEventListener (global::Com.Google.Android.Exoplayer.Drm.IExoMediaDrmOnEventListener p0)
{
const string __id = "setOnEventListener.(Lcom/google/android/exoplayer/drm/ExoMediaDrm$OnEventListener;)V";
try {
JniArgumentValue* __args = stackalloc JniArgumentValue [1];
__args [0] = new JniArgumentValue ((p0 == null) ? IntPtr.Zero : ((global::Java.Lang.Object) p0).Handle);
_members.InstanceMethods.InvokeAbstractVoidMethod (__id, this, __args);
} finally {
}
}

// This method is explicitly implemented as a member of an instantiated Com.Google.Android.Exoplayer.Drm.IExoMediaDrm
void global::Com.Google.Android.Exoplayer.Drm.IExoMediaDrm.SetOnEventListener (global::Com.Google.Android.Exoplayer.Drm.IExoMediaDrmOnEventListener p0)
{
SetOnEventListener (global::Java.Interop.JavaObjectExtensions.JavaCast<global::Com.Google.Android.Exoplayer.Drm.IExoMediaDrmOnEventListener>(p0));
}

}
}
Loading