Skip to content

[Java.Base, generator] Bind all of package java.lang #966

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
Mar 29, 2022
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
3 changes: 2 additions & 1 deletion src/Java.Base/Java.Base.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
<TargetFrameworks>net6.0</TargetFrameworks>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<Nullable>enable</Nullable>
<NoWarn>$(NoWarn);8764</NoWarn>
<!-- TODO: CS0108 is due to e.g. interfaces re-abstracting default interface methods -->
<NoWarn>$(NoWarn);8764;CS0108</NoWarn>
<Version>$(JICoreLibVersion)</Version>
</PropertyGroup>

Expand Down
2 changes: 1 addition & 1 deletion src/Java.Base/Java.Base.targets
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
<MakeDir Directories="$(IntermediateOutputPath)mcw" />
<PropertyGroup>
<Generator>"$(GeneratorPath)"</Generator>
<_GenFlags>--public</_GenFlags>
<_GenFlags>--public --global</_GenFlags>
<_Out>-o "$(IntermediateOutputPath)mcw"</_Out>
<_Codegen>--codegen-target=JavaInterop1</_Codegen>
<_Fixup>--fixup=Transforms/Metadata.xml</_Fixup>
Expand Down
20 changes: 20 additions & 0 deletions src/Java.Base/Java.Lang/ICharSequence.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
namespace Java.Lang {

public static partial class ICharSequenceExtensions {

public static ICharSequence[]? ToCharSequenceArray (this string?[]? values)
{
if (values == null) {
return null;
}
var array = new ICharSequence [values.Length];
for (int i = 0; i < values.Length; ++i) {
if (values [i] == null) {
continue;
}
array [i] = new Java.Lang.String (values [i]);
}
return array;
}
}
}
9 changes: 9 additions & 0 deletions src/Java.Base/Java.Lang/String.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using System;
using System.Collections;
using System.Collections.Generic;
using Java.Interop;

namespace Java.Lang {
public partial class String : IEnumerable, IEnumerable<char> {
}
}
8 changes: 8 additions & 0 deletions src/Java.Base/Java.Lang/StringBuffer.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
using System;
using System.Collections;
using System.Collections.Generic;

namespace Java.Lang {
partial class StringBuffer : IEnumerable, IEnumerable<char> {
}
}
8 changes: 8 additions & 0 deletions src/Java.Base/Java.Lang/StringBuilder.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
using System;
using System.Collections;
using System.Collections.Generic;

namespace Java.Lang {
partial class StringBuilder : IEnumerable, IEnumerable<char> {
}
}
28 changes: 17 additions & 11 deletions src/Java.Base/Transforms/Metadata.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,22 @@
<!-- For now, just bind java.lang.* -->
<remove-node path="//api/package[not(starts-with(@name, 'java.lang'))]" />

<!-- For now, just bind Class, Object, Throwable -->
<remove-node path="//api/package/interface" />
<remove-node path="//api/package/class[not(@name = 'Object'
or @name = 'BootstrapMethodError'
or @name = 'Class'
or @name = 'Math'
or @name = 'Number'
or @name = 'Throwable'
)]"
/>
<!-- Type / Namespace conflicts -->
<ns-replace source="java.lang.module" replacement="Java.Lang.Modules" />

<attr path="/api/package[@name='java.lang']/class[@name='Object']/method[@name='finalize']" name="managedName">JavaFinalize</attr>
<!-- Bind `Object.finalize()` as `Object.JavaFinalize()` -->
<attr path="/api/package[@name='java.lang']//method[@name='finalize' and count(parameter)=0]" name="managedName">JavaFinalize</attr>
<!-- warning CS0672: Member 'Enum.JavaFinalize()' overrides obsolete member 'Object.JavaFinalize()'. Add the Obsolete attribute to 'Enum.JavaFinalize()'. -->
<attr path="/api/package[@name='java.lang']/class[@name='Enum']/method[@name='finalize' and count(parameter)=0]" name="deprecated">deprecated</attr>

<!-- AbstractStringBuilder is package-private; fixity fix -->
<remove-node path="//api/package[@name='java.lang']/class[@name='AbstractStringBuilder']" />

<attr path="/api/package[@name='java.lang']/class[@name='StringBuilder']" name="extends">java.lang.Object</attr>
<remove-node path="//api/package[@name='java.lang']/class[@name='StringBuilder']/method[@jni-return='Ljava/lang/AbstractStringBuilder;']" />
<remove-node path="//api/package[@name='java.lang']/class[@name='StringBuilder']/method[@jni-return='Ljava/lang/Appendable;']" />

<attr path="/api/package[@name='java.lang']/class[@name='StringBuffer']" name="extends">java.lang.Object</attr>
<remove-node path="//api/package[@name='java.lang']/class[@name='StringBuffer']/method[@jni-return='Ljava/lang/AbstractStringBuilder;']" />
<remove-node path="//api/package[@name='java.lang']/class[@name='StringBuffer']/method[@jni-return='Ljava/lang/Appendable;']" />
</metadata>
2 changes: 0 additions & 2 deletions tests/generator-Tests/Integration-Tests/Arrays.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@ namespace generatortests
[TestFixture]
public class Arrays : BaseGeneratorTest
{
protected override bool TryJavaInterop1 => false;

[Test]
public void GeneratedOK ()
{
Expand Down
2 changes: 1 addition & 1 deletion tests/generator-Tests/Integration-Tests/Compiler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ public static Assembly Compile (Xamarin.Android.Binder.CodeGeneratorOptions opti
var references = referencePaths.Select (p => MetadataReference.CreateFromFile (p)).ToArray ();

string testCommandLine =
$"csc \"-out:{Path.GetFileName (assemblyFileName)}\" " +
$"csc -noconfig -nostdlib \"-out:{Path.GetFileName (assemblyFileName)}\" " +
$"-unsafe -t:library " +
string.Join (" ", preprocessorSymbols.Select (p => $"\"-define:{p}\"")) + " " +
string.Join (" ", referencePaths.Select (p => $"\"-r:{p}\"")) + " " +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public partial class MyClass {
}

// Metadata.xml XPath constructor reference: path="/api/package[@name='java.code']/class[@name='MyClass']/constructor[@name='MyClass' and count(parameter)=1 and parameter[1][@type='java.lang.String']]"
unsafe MyClass (string p0) : base (ref *InvalidJniObjectReference, JniObjectReferenceOptions.None)
unsafe MyClass (string? p0) : base (ref *InvalidJniObjectReference, JniObjectReferenceOptions.None)
{
const string __id = "(Ljava/lang/String;)V";

Expand Down Expand Up @@ -65,7 +65,7 @@ public partial class MyClass {
}
}

public virtual unsafe string Key {
public virtual unsafe string? Key {
// Metadata.xml XPath method reference: path="/api/package[@name='java.code']/class[@name='MyClass']/method[@name='get_Key' and count(parameter)=0]"
get {
const string __id = "get_Key.()Ljava/lang/String;";
Expand Down Expand Up @@ -120,7 +120,7 @@ public partial class MyClass {
}

// Metadata.xml XPath method reference: path="/api/package[@name='java.code']/class[@name='MyClass']/method[@name='GetCountForKey' and count(parameter)=1 and parameter[1][@type='java.lang.String']]"
public virtual unsafe int GetCountForKey (string key)
public virtual unsafe int GetCountForKey (string? key)
{
const string __id = "GetCountForKey.(Ljava/lang/String;)I";
var native_key = global::Java.Interop.JniEnvironment.Strings.NewString (key);
Expand All @@ -135,7 +135,7 @@ public partial class MyClass {
}

// Metadata.xml XPath method reference: path="/api/package[@name='java.code']/class[@name='MyClass']/method[@name='Key' and count(parameter)=0]"
public virtual unsafe string Key ()
public virtual unsafe string? Key ()
{
const string __id = "Key.()Ljava/lang/String;";
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ internal sealed partial class AnimatorListenerImplementor : global::Java.Lang.Ob
}

#pragma warning disable 0649
public EventHandler<AnimationEndEventArgs> OnAnimationEndHandler;
public EventHandler<AnimationEndEventArgs>? OnAnimationEndHandler;
#pragma warning restore 0649

public bool OnAnimationEnd (int param1)
Expand All @@ -71,7 +71,7 @@ internal sealed partial class AnimatorListenerImplementor : global::Java.Lang.Ob
}

#pragma warning disable 0649
public EventHandler<AnimationEndEventArgs> OnAnimationEndHandler;
public EventHandler<AnimationEndEventArgs>? OnAnimationEndHandler;
#pragma warning restore 0649

public bool OnAnimationEnd (int param1, int param2)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,35 +1,8 @@
[Register ("java/code/IMyInterface", DoNotGenerateAcw=true)]
public abstract class MyInterface : Java.Lang.Object {
internal MyInterface ()
{
}

// Metadata.xml XPath method reference: path="/api/package[@name='java.code']/interface[@name='IMyInterface']/method[@name='StaticMethod' and count(parameter)=0]"
public static unsafe void StaticMethod ()
{
const string __id = "StaticMethod.()V";
try {
_members.StaticMethods.InvokeVoidMethod (__id, null);
} finally {
}
}

static readonly JniPeerMembers _members = new JniPeerMembers ("java/code/IMyInterface", typeof (MyInterface));

}

[Register ("java/code/IMyInterface", DoNotGenerateAcw=true)]
[global::System.Obsolete ("Use the 'MyInterface' type. This type will be removed in a future release.", error: true)]
public abstract class MyInterfaceConsts : MyInterface {
private MyInterfaceConsts ()
{
}

}

// Metadata.xml XPath interface reference: path="/api/package[@name='java.code']/interface[@name='IMyInterface']"
[global::Java.Interop.JniTypeSignature ("java/code/IMyInterface", GenerateJavaPeer=false)]
public partial interface IMyInterface : IJavaPeerable {
private static readonly JniPeerMembers _members = new JniPeerMembers ("java/code/IMyInterface", typeof (IMyInterface), isInterface: true);

int Count {
// Metadata.xml XPath method reference: path="/api/package[@name='java.code']/interface[@name='IMyInterface']/method[@name='get_Count' and count(parameter)=0]"
get;
Expand All @@ -38,7 +11,7 @@ public partial interface IMyInterface : IJavaPeerable {
set;
}

string Key {
string? Key {
// Metadata.xml XPath method reference: path="/api/package[@name='java.code']/interface[@name='IMyInterface']/method[@name='get_Key' and count(parameter)=0]"
get;

Expand All @@ -54,13 +27,45 @@ public partial interface IMyInterface : IJavaPeerable {
set;
}

static unsafe int StaticCount {
// Metadata.xml XPath method reference: path="/api/package[@name='java.code']/interface[@name='IMyInterface']/method[@name='get_StaticCount' and count(parameter)=0]"
get {
const string __id = "get_StaticCount.()I";
try {
var __rm = _members.StaticMethods.InvokeInt32Method (__id, null);
return __rm;
} finally {
}
}
// Metadata.xml XPath method reference: path="/api/package[@name='java.code']/interface[@name='IMyInterface']/method[@name='set_StaticCount' and count(parameter)=1 and parameter[1][@type='int']]"
set {
const string __id = "set_StaticCount.(I)V";
try {
JniArgumentValue* __args = stackalloc JniArgumentValue [1];
__args [0] = new JniArgumentValue (value);
_members.StaticMethods.InvokeVoidMethod (__id, __args);
} finally {
}
}
}

// Metadata.xml XPath method reference: path="/api/package[@name='java.code']/interface[@name='IMyInterface']/method[@name='GetCountForKey' and count(parameter)=1 and parameter[1][@type='java.lang.String']]"
int GetCountForKey (string key);
int GetCountForKey (string? key);

// Metadata.xml XPath method reference: path="/api/package[@name='java.code']/interface[@name='IMyInterface']/method[@name='Key' and count(parameter)=0]"
string Key ();
string? Key ();

// Metadata.xml XPath method reference: path="/api/package[@name='java.code']/interface[@name='IMyInterface']/method[@name='AbstractMethod' and count(parameter)=0]"
void AbstractMethod ();

// Metadata.xml XPath method reference: path="/api/package[@name='java.code']/interface[@name='IMyInterface']/method[@name='StaticMethod' and count(parameter)=0]"
public static unsafe void StaticMethod ()
{
const string __id = "StaticMethod.()V";
try {
_members.StaticMethods.InvokeVoidMethod (__id, null);
} finally {
}
}

}
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
public delegate int MyIGetCountForKeyHandler (string key);
public delegate int MyIGetCountForKeyHandler (string? key);

Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
// event args for com.xamarin.android.MyListener.onDoSomething
public partial class MyEventArgs : global::System.EventArgs {

public MyEventArgs (params Java.Lang.Object[] args)
public MyEventArgs (params Java.Lang.Object[]? args)
{
this.args = args;
}

Java.Lang.Object[] args;
public Java.Lang.Object[] Args {
Java.Lang.Object[]? args;
public Java.Lang.Object[]? Args {
get { return args; }
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,58 +1,59 @@
[global::Android.Runtime.Register ("mono/java/code/IMyInterfaceImplementor")]
internal sealed partial class IMyInterfaceImplementor : global::Java.Lang.Object, IMyInterface {

object sender;
object sender;

public IMyInterfaceImplementor (object sender)
: base (
global::Android.Runtime.JNIEnv.StartCreateInstance ("mono/java/code/IMyInterfaceImplementor", "()V"),
JniHandleOwnership.TransferLocalRef)
{
global::Android.Runtime.JNIEnv.FinishCreateInstance (this.PeerReference, "()V");
this.sender = sender;
}
public IMyInterfaceImplementor (object sender)
: base (
global::Android.Runtime.JNIEnv.StartCreateInstance ("mono/java/code/IMyInterfaceImplementor", "()V"),
JniHandleOwnership.TransferLocalRef)
{
global::Android.Runtime.JNIEnv.FinishCreateInstance (this.PeerReference, "()V");
this.sender = sender;
}

#pragma warning disable 0649
public MyIGetCountForKeyHandler GetCountForKeyHandler;
public MyIGetCountForKeyHandler? GetCountForKeyHandler;
#pragma warning restore 0649

public int GetCountForKey (string key)
{
var __h = GetCountForKeyHandler;
return __h != null ? __h (key) : default (int);
}
public int GetCountForKey (string? key)
{
var __h = GetCountForKeyHandler;
return __h != null ? __h (key) : default (int);
}
#pragma warning disable 0649
public MyIKeyHandler KeyHandler;
public MyIKeyHandler? KeyHandler;
#pragma warning restore 0649

public string Key ()
{
var __h = KeyHandler;
return __h != null ? __h () : default (string);
}
public string? Key ()
{
var __h = KeyHandler;
return __h != null ? __h () : default (string?);
}
#pragma warning disable 0649
public EventHandler StaticMethodHandler;
public EventHandler? StaticMethodHandler;
#pragma warning restore 0649

public void StaticMethod ()
{
var __h = StaticMethodHandler;
if (__h != null)
__h (sender, new EventArgs ());
}
public void StaticMethod ()
{
var __h = StaticMethodHandler;
if (__h != null)
__h (sender, new EventArgs ());
}
#pragma warning disable 0649
public EventHandler AbstractMethodHandler;
public EventHandler? AbstractMethodHandler;
#pragma warning restore 0649

public void AbstractMethod ()
{
var __h = AbstractMethodHandler;
if (__h != null)
__h (sender, new EventArgs ());
}

internal static bool __IsEmpty (IMyInterfaceImplementor value)
{
return value.GetCountForKeyHandler == null && value.KeyHandler == null && value.StaticMethodHandler == null && value.AbstractMethodHandler == null;
}
public void AbstractMethod ()
{
var __h = AbstractMethodHandler;
if (__h != null)
__h (sender, new EventArgs ());
}

internal static bool __IsEmpty (IMyInterfaceImplementor value)
{
return value.GetCountForKeyHandler == null && value.KeyHandler == null && value.StaticMethodHandler == null && value.AbstractMethodHandler == null;
}
}

Loading