Skip to content
Closed
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
10 changes: 10 additions & 0 deletions src/Xamarin.Android.Tools.Bytecode/ClassPath.cs
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,16 @@ JavaDocletType GetDocletType (string path)
kind = JavaDocletType.Java7;
else if (rawHTML.Contains ("Generated by javadoc (1.8"))
kind = JavaDocletType.Java8;

// Check to see if it's an api.xml formatted doc
string rawXML = null;
using (var reader = File.OpenText (path)) {
int len = reader.ReadBlock (buf, 0, buf.Length);
rawXML = new string (buf, 0, len);
}
if (rawXML.Contains ("<api>") && rawXML.Contains ("<package"))
kind = JavaDocletType._ApiXml;

return kind;
}

Expand Down
21 changes: 12 additions & 9 deletions tools/generator/Method.cs
Original file line number Diff line number Diff line change
Expand Up @@ -687,25 +687,28 @@ void GenerateStringOverloadBody (StreamWriter sw, string indent, CodeGenerationO
call.Append (pname);
}
sw.WriteLine ("{0}{1}{2}{3} ({4});", indent, RetVal.IsVoid ? String.Empty : opt.GetOutputName (RetVal.FullName) + " __result = ", haveSelf ? "self." : "", AdjustedName, call.ToString ());
foreach (Parameter p in Parameters) {
if (p.Type == "Java.Lang.ICharSequence")
sw.WriteLine ("{0}if ({1} != null) {1}.Dispose ();", indent, p.GetName ("jls_"));
else if (p.Type == "Java.Lang.ICharSequence[]")
sw.WriteLine ("{0}if ({1} != null) foreach (global::Java.Lang.String s in {1}) if (s != null) s.Dispose ();", indent, p.GetName ("jlca_"));
}
switch (RetVal.FullName) {
case "void":
break;
case "Java.Lang.ICharSequence[]":
sw.WriteLine ("{0}return CharSequence.ArrayToStringArray (__result);", indent);
sw.WriteLine ("{0}var __rsval = CharSequence.ArrayToStringArray (__result);", indent);
break;
case "Java.Lang.ICharSequence":
sw.WriteLine ("{0}return __result == null ? null : __result.ToString ();", indent);
sw.WriteLine ("{0}var __rsval = __result?.ToString ();", indent);
break;
default:
sw.WriteLine ("{0}return __result;", indent);
sw.WriteLine ("{0}var __rsval = __result;", indent);
break;
}
foreach (Parameter p in Parameters) {
if (p.Type == "Java.Lang.ICharSequence")
sw.WriteLine ("{0}{1}?.Dispose ();", indent, p.GetName ("jls_"));
else if (p.Type == "Java.Lang.ICharSequence[]")
sw.WriteLine ("{0}if ({1} != null) foreach (global::Java.Lang.String s in {1}) s?.Dispose ();", indent, p.GetName ("jlca_"));
}
if (!RetVal.IsVoid) {
sw.WriteLine ($"{indent}return __rsval;");
}
}

void GenerateStringOverload (StreamWriter sw, string indent, CodeGenerationOptions opt)
Expand Down
33 changes: 33 additions & 0 deletions tools/generator/Tests/SupportFiles/Android_Runtime_CharSequence.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
using System;
using System.Collections.Generic;

namespace Android.Runtime {

public static class CharSequence
{
public static Java.Lang.ICharSequence [] ArrayFromStringArray (string [] val)
{
throw new NotImplementedException ();
}

public static string [] ArrayToStringArray (Java.Lang.ICharSequence [] val)
{
throw new NotImplementedException ();
}

public static IntPtr ToLocalJniHandle (string value)
{
throw new NotImplementedException ();
}

public static IntPtr ToLocalJniHandle (Java.Lang.ICharSequence value)
{
throw new NotImplementedException ();
}

public static IntPtr ToLocalJniHandle (IEnumerable<char> value)
{
throw new NotImplementedException ();
}
}
}
13 changes: 13 additions & 0 deletions tools/generator/Tests/SupportFiles/Java_Lang_ICharSequence.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using System;
using Android.Runtime;

namespace Java.Lang {

public partial interface ICharSequence : IJavaObject
{
char CharAt (int index);
int Length ();
Java.Lang.ICharSequence SubSequenceFormatted (int start, int end);
string ToString ();
}
}
43 changes: 43 additions & 0 deletions tools/generator/Tests/SupportFiles/Java_Lang_String.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
using System;
using System.Collections;
using System.Collections.Generic;

namespace Java.Lang {

public sealed partial class String : global::Java.Lang.Object, Java.Lang.ICharSequence
{
public String (string value)
{
}

public char CharAt (int index)
{
throw new NotImplementedException ();
}

public int Length ()
{
throw new NotImplementedException ();
}

public Java.Lang.ICharSequence SubSequenceFormatted (int start, int end)
{
throw new NotImplementedException ();
}

public override string ToString ()
{
throw new NotImplementedException ();
}

public IEnumerator<char> GetEnumerator ()
{
throw new NotImplementedException ();
}

IEnumerator IEnumerable.GetEnumerator ()
{
throw new NotImplementedException ();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,33 @@ public partial interface ITestInterface : IJavaObject {
[Register ("getSpanFlags", "(Ljava/lang/Object;)I", "GetGetSpanFlags_Ljava_lang_Object_Handler:Test.ME.ITestInterfaceInvoker, Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")]
int GetSpanFlags (global::Java.Lang.Object tag);

// Metadata.xml XPath method reference: path="/api/package[@name='test.me']/interface[@name='TestInterface']/method[@name='append' and count(parameter)=1 and parameter[1][@type='java.lang.CharSequence']]"
[Register ("append", "(Ljava/lang/CharSequence;)V", "GetAppend_Ljava_lang_CharSequence_Handler:Test.ME.ITestInterfaceInvoker, Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")]
void Append (global::Java.Lang.ICharSequence value);

// Metadata.xml XPath method reference: path="/api/package[@name='test.me']/interface[@name='TestInterface']/method[@name='identity' and count(parameter)=1 and parameter[1][@type='java.lang.CharSequence']]"
[Register ("identity", "(Ljava/lang/CharSequence;)Ljava/lang/CharSequence;", "GetIdentity_Ljava_lang_CharSequence_Handler:Test.ME.ITestInterfaceInvoker, Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")]
global::Java.Lang.ICharSequence IdentityFormatted (global::Java.Lang.ICharSequence value);

}

public static partial class ITestInterfaceExtensions {

public static void Append (this Test.ME.ITestInterface self, string value)
{
global::Java.Lang.String jls_value = value == null ? null : new global::Java.Lang.String (value);
self.Append (jls_value);
jls_value?.Dispose ();
}

public static string Identity (this Test.ME.ITestInterface self, string value)
{
global::Java.Lang.String jls_value = value == null ? null : new global::Java.Lang.String (value);
global::Java.Lang.ICharSequence __result = self.IdentityFormatted (jls_value);
var __rsval = __result?.ToString ();
jls_value?.Dispose ();
return __rsval;
}
}

[global::Android.Runtime.Register ("test/me/TestInterface", DoNotGenerateAcw=true)]
Expand Down Expand Up @@ -130,6 +157,66 @@ public unsafe int GetSpanFlags (global::Java.Lang.Object tag)
return __ret;
}

static Delegate cb_append_Ljava_lang_CharSequence_;
#pragma warning disable 0169
static Delegate GetAppend_Ljava_lang_CharSequence_Handler ()
{
if (cb_append_Ljava_lang_CharSequence_ == null)
cb_append_Ljava_lang_CharSequence_ = JNINativeWrapper.CreateDelegate ((Action<IntPtr, IntPtr, IntPtr>) n_Append_Ljava_lang_CharSequence_);
return cb_append_Ljava_lang_CharSequence_;
}

static void n_Append_Ljava_lang_CharSequence_ (IntPtr jnienv, IntPtr native__this, IntPtr native_value)
{
global::Test.ME.ITestInterface __this = global::Java.Lang.Object.GetObject<global::Test.ME.ITestInterface> (jnienv, native__this, JniHandleOwnership.DoNotTransfer);
global::Java.Lang.ICharSequence value = global::Java.Lang.Object.GetObject<global::Java.Lang.ICharSequence> (native_value, JniHandleOwnership.DoNotTransfer);
__this.Append (value);
}
#pragma warning restore 0169

IntPtr id_append_Ljava_lang_CharSequence_;
public unsafe void Append (global::Java.Lang.ICharSequence value)
{
if (id_append_Ljava_lang_CharSequence_ == IntPtr.Zero)
id_append_Ljava_lang_CharSequence_ = JNIEnv.GetMethodID (class_ref, "append", "(Ljava/lang/CharSequence;)V");
IntPtr native_value = CharSequence.ToLocalJniHandle (value);
JValue* __args = stackalloc JValue [1];
__args [0] = new JValue (native_value);
JNIEnv.CallVoidMethod (((global::Java.Lang.Object) this).Handle, id_append_Ljava_lang_CharSequence_, __args);
JNIEnv.DeleteLocalRef (native_value);
}

static Delegate cb_identity_Ljava_lang_CharSequence_;
#pragma warning disable 0169
static Delegate GetIdentity_Ljava_lang_CharSequence_Handler ()
{
if (cb_identity_Ljava_lang_CharSequence_ == null)
cb_identity_Ljava_lang_CharSequence_ = JNINativeWrapper.CreateDelegate ((Func<IntPtr, IntPtr, IntPtr, IntPtr>) n_Identity_Ljava_lang_CharSequence_);
return cb_identity_Ljava_lang_CharSequence_;
}

static IntPtr n_Identity_Ljava_lang_CharSequence_ (IntPtr jnienv, IntPtr native__this, IntPtr native_value)
{
global::Test.ME.ITestInterface __this = global::Java.Lang.Object.GetObject<global::Test.ME.ITestInterface> (jnienv, native__this, JniHandleOwnership.DoNotTransfer);
global::Java.Lang.ICharSequence value = global::Java.Lang.Object.GetObject<global::Java.Lang.ICharSequence> (native_value, JniHandleOwnership.DoNotTransfer);
IntPtr __ret = CharSequence.ToLocalJniHandle (__this.IdentityFormatted (value));
return __ret;
}
#pragma warning restore 0169

IntPtr id_identity_Ljava_lang_CharSequence_;
public unsafe global::Java.Lang.ICharSequence IdentityFormatted (global::Java.Lang.ICharSequence value)
{
if (id_identity_Ljava_lang_CharSequence_ == IntPtr.Zero)
id_identity_Ljava_lang_CharSequence_ = JNIEnv.GetMethodID (class_ref, "identity", "(Ljava/lang/CharSequence;)Ljava/lang/CharSequence;");
IntPtr native_value = CharSequence.ToLocalJniHandle (value);
JValue* __args = stackalloc JValue [1];
__args [0] = new JValue (native_value);
global::Java.Lang.ICharSequence __ret = global::Java.Lang.Object.GetObject<Java.Lang.ICharSequence> (JNIEnv.CallObjectMethod (((global::Java.Lang.Object) this).Handle, id_identity_Ljava_lang_CharSequence_, __args), JniHandleOwnership.TransferLocalRef);
JNIEnv.DeleteLocalRef (native_value);
return __ret;
}

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,65 @@ static int n_GetSpanFlags_Ljava_lang_Object_ (IntPtr jnienv, IntPtr native__this
[Register ("getSpanFlags", "(Ljava/lang/Object;)I", "GetGetSpanFlags_Ljava_lang_Object_Handler")]
public abstract int GetSpanFlags (global::Java.Lang.Object tag);

static Delegate cb_append_Ljava_lang_CharSequence_;
#pragma warning disable 0169
static Delegate GetAppend_Ljava_lang_CharSequence_Handler ()
{
if (cb_append_Ljava_lang_CharSequence_ == null)
cb_append_Ljava_lang_CharSequence_ = JNINativeWrapper.CreateDelegate ((Action<IntPtr, IntPtr, IntPtr>) n_Append_Ljava_lang_CharSequence_);
return cb_append_Ljava_lang_CharSequence_;
}

static void n_Append_Ljava_lang_CharSequence_ (IntPtr jnienv, IntPtr native__this, IntPtr native_value)
{
global::Test.ME.TestInterfaceImplementation __this = global::Java.Lang.Object.GetObject<global::Test.ME.TestInterfaceImplementation> (jnienv, native__this, JniHandleOwnership.DoNotTransfer);
global::Java.Lang.ICharSequence value = global::Java.Lang.Object.GetObject<global::Java.Lang.ICharSequence> (native_value, JniHandleOwnership.DoNotTransfer);
__this.Append (value);
}
#pragma warning restore 0169

// Metadata.xml XPath method reference: path="/api/package[@name='test.me']/interface[@name='TestInterface']/method[@name='append' and count(parameter)=1 and parameter[1][@type='java.lang.CharSequence']]"
[Register ("append", "(Ljava/lang/CharSequence;)V", "GetAppend_Ljava_lang_CharSequence_Handler")]
public abstract void Append (global::Java.Lang.ICharSequence value);

public void Append (string value)
{
global::Java.Lang.String jls_value = value == null ? null : new global::Java.Lang.String (value);
Append (jls_value);
jls_value?.Dispose ();
}

static Delegate cb_identity_Ljava_lang_CharSequence_;
#pragma warning disable 0169
static Delegate GetIdentity_Ljava_lang_CharSequence_Handler ()
{
if (cb_identity_Ljava_lang_CharSequence_ == null)
cb_identity_Ljava_lang_CharSequence_ = JNINativeWrapper.CreateDelegate ((Func<IntPtr, IntPtr, IntPtr, IntPtr>) n_Identity_Ljava_lang_CharSequence_);
return cb_identity_Ljava_lang_CharSequence_;
}

static IntPtr n_Identity_Ljava_lang_CharSequence_ (IntPtr jnienv, IntPtr native__this, IntPtr native_value)
{
global::Test.ME.TestInterfaceImplementation __this = global::Java.Lang.Object.GetObject<global::Test.ME.TestInterfaceImplementation> (jnienv, native__this, JniHandleOwnership.DoNotTransfer);
global::Java.Lang.ICharSequence value = global::Java.Lang.Object.GetObject<global::Java.Lang.ICharSequence> (native_value, JniHandleOwnership.DoNotTransfer);
IntPtr __ret = CharSequence.ToLocalJniHandle (__this.IdentityFormatted (value));
return __ret;
}
#pragma warning restore 0169

// Metadata.xml XPath method reference: path="/api/package[@name='test.me']/interface[@name='TestInterface']/method[@name='identity' and count(parameter)=1 and parameter[1][@type='java.lang.CharSequence']]"
[Register ("identity", "(Ljava/lang/CharSequence;)Ljava/lang/CharSequence;", "GetIdentity_Ljava_lang_CharSequence_Handler")]
public abstract global::Java.Lang.ICharSequence IdentityFormatted (global::Java.Lang.ICharSequence value);

public string Identity (string value)
{
global::Java.Lang.String jls_value = value == null ? null : new global::Java.Lang.String (value);
global::Java.Lang.ICharSequence __result = IdentityFormatted (jls_value);
var __rsval = __result?.ToString ();
jls_value?.Dispose ();
return __rsval;
}

}

[global::Android.Runtime.Register ("test/me/TestInterfaceImplementation", DoNotGenerateAcw=true)]
Expand Down Expand Up @@ -123,6 +182,46 @@ public override unsafe int GetSpanFlags (global::Java.Lang.Object tag)
}
}

// Metadata.xml XPath method reference: path="/api/package[@name='test.me']/interface[@name='TestInterface']/method[@name='append' and count(parameter)=1 and parameter[1][@type='java.lang.CharSequence']]"
[Register ("append", "(Ljava/lang/CharSequence;)V", "GetAppend_Ljava_lang_CharSequence_Handler")]
public override unsafe void Append (global::Java.Lang.ICharSequence value)
{
const string __id = "append.(Ljava/lang/CharSequence;)V";
IntPtr native_value = CharSequence.ToLocalJniHandle (value);
try {
JniArgumentValue* __args = stackalloc JniArgumentValue [1];
__args [0] = new JniArgumentValue (native_value);
_members.InstanceMethods.InvokeAbstractVoidMethod (__id, this, __args);
} finally {
JNIEnv.DeleteLocalRef (native_value);
}
}

// Metadata.xml XPath method reference: path="/api/package[@name='test.me']/interface[@name='TestInterface']/method[@name='identity' and count(parameter)=1 and parameter[1][@type='java.lang.CharSequence']]"
[Register ("identity", "(Ljava/lang/CharSequence;)Ljava/lang/CharSequence;", "GetIdentity_Ljava_lang_CharSequence_Handler")]
public override unsafe global::Java.Lang.ICharSequence IdentityFormatted (global::Java.Lang.ICharSequence value)
{
const string __id = "identity.(Ljava/lang/CharSequence;)Ljava/lang/CharSequence;";
IntPtr native_value = CharSequence.ToLocalJniHandle (value);
try {
JniArgumentValue* __args = stackalloc JniArgumentValue [1];
__args [0] = new JniArgumentValue (native_value);
var __rm = _members.InstanceMethods.InvokeAbstractObjectMethod (__id, this, __args);
return global::Java.Lang.Object.GetObject<Java.Lang.ICharSequence> (__rm.Handle, JniHandleOwnership.TransferLocalRef);
} finally {
JNIEnv.DeleteLocalRef (native_value);
}
}

public string Identity (string value)
{
global::Java.Lang.String jls_value = value == null ? null : new global::Java.Lang.String (value);
global::Java.Lang.ICharSequence __result = IdentityFormatted (jls_value);
var __rsval = __result?.ToString ();
jls_value?.Dispose ();
return __rsval;
}

}

}
Loading