fuzion/java.fz
# This file is part of the Fuzion language implementation.
#
# The Fuzion language implementation is free software: you can redistribute it
# and/or modify it under the terms of the GNU General Public License as published
# by the Free Software Foundation, version 3 of the License.
#
# The Fuzion language implementation is distributed in the hope that it will be
# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
# License for more details.
#
# You should have received a copy of the GNU General Public License along with The
# Fuzion language implementation. If not, see <https://www.gnu.org/licenses/>.
# -----------------------------------------------------------------------
#
# Tokiwa Software GmbH, Germany
#
# Source code of Fuzion standard library feature fuzion.java
#
# Author: Fridtjof Siebert (siebert@tokiwa.software)
#
# -----------------------------------------------------------------------
# fuzion.java -- unit type grouping low-level helpers for Java interface
#
public fuzion.java is
# read a static field of given name in class with given name. Wrap result into
# an instance of T.
#
public get_static_field(T type, clazz String, field String) =>
c := string_to_java_object clazz
f := string_to_java_object field
get_static_field0 T c f
# read a field of given name from given object instance thiz. Wrap result into
# an instance of T.
#
public get_field(T type, thiz Java_Object, field String) =>
f := string_to_java_object field
get_field0 T thiz f
# intrinsic to read static field
#
private get_static_field0(T type, clazz Java_Object, field Java_Object) T => intrinsic_constructor
# intrinsic to read instance field
#
private get_field0(T type, thiz Java_Object, field Java_Object) T => intrinsic_constructor
# A Java reference
#
public Java_Object(private Java_Ref fuzion.sys.Pointer) ref
is
public is_null bool =>
is_null0 Java_Ref
private is_null0(jr fuzion.sys.Pointer) bool => intrinsic_constructor
# dummy feature to make sure Java_Object.type exists. This is required since
# Java-related intrinsics may return an array of Java_Object and require Java_Object.type.
#
_ignore_ => Java_Object.type
# A Java array
#
public Array(public T type,
private redef Java_Ref fuzion.sys.Pointer) ref : Sequence T, Java_Object Java_Ref
is
public length => array_length T Array.this
public redef finite => true
public redef index [ ] (i i32) => array_get T Array.this i
public redef as_list => as_list 0
# create list starting at index from
#
public as_list (from i32) list T =>
if length ≤ from
nil
else
array_cons from
# create a cons cell for a list of this array starting at the given
# index
#
private array_cons (i i32) : Cons T (list T)
pre
debug: 0 ≤ i < length
is
head => Array.this[i]
tail => as_list i+1
# Java's 'java.lang.String' type
#
public Java_String(private redef Java_Ref fuzion.sys.Pointer) ref : String, Java_Object Java_Ref
is
public utf8 => (java_string_to_string Java_String.this).utf8
# Call a virtual Java method class_name.name with given signature signature
# on instance thiz with given arguments
#
public call_virtual(T type,
class_name String,
name String,
signature String,
thiz Java_Object,
args array Java_Object) T
pre
safety: !thiz.is_null
=>
c := string_to_java_object class_name
n := string_to_java_object name
s := string_to_java_object signature
t := thiz.Java_Ref
a := (args.map_to_array (x -> x.Java_Ref)).internal_array
call_v0 T c n s t a
# Call a static Java method with given name and signature with given
# arguments
#
public call_static(T type,
class_name String,
name String,
signature String,
args array Java_Object) T
=>
c := string_to_java_object class_name
n := string_to_java_object name
s := string_to_java_object signature
a := (args.map_to_array (x -> x.Java_Ref)).internal_array
call_s0 T c n s a
# Call a Java constructor with given signature for class with given name
# with given arguments
#
public call_constructor(T type,
class_name String,
signature String,
args array Java_Object) T
=>
c := string_to_java_object class_name
s := string_to_java_object signature
a := (args.map_to_array (x -> x.Java_Ref)).internal_array
call_c0 T c s a
# intrinsic to call given Java instance method
#
private call_v0(T type,
class_name Java_Object,
name Java_Object,
signature Java_Object,
thiz fuzion.sys.Pointer,
args fuzion.sys.internal_array fuzion.sys.Pointer) T => intrinsic_constructor
# intrinsic to call given Java static method
#
private call_s0(T type,
class_name Java_Object,
name Java_Object,
signature Java_Object,
args fuzion.sys.internal_array fuzion.sys.Pointer) T => intrinsic_constructor
# intrinsic to call given Java constructor
#
private call_c0(T type,
class_name Java_Object,
signature Java_Object,
args fuzion.sys.internal_array fuzion.sys.Pointer) T => intrinsic_constructor
# intrinsic to get the length of a Java array of arbitrary type
#
private array_length(T type, a Array T) i32 => intrinsic
# intrinsic to get an element of a Java array of arbitrary type
#
private array_get(T type, a Array T, ix i32) T => intrinsic_constructor
# convert a Sequence to a Java Array object
#
public array_to_java_object(T type, a Sequence T) Array T =>
array_to_java_object0 T a.as_array.internal_array
# intrinsic to convert an array to a Java Array object
#
private array_to_java_object0(T type, a fuzion.sys.internal_array T) Array T => intrinsic_constructor
# convert a string to a Java String object
#
public string_to_java_object(s String) Java_Object =>
string_to_java_object0 s.utf8.as_array.internal_array
# intrinsic to convert a string to a Java String object
#
private string_to_java_object0(s fuzion.sys.internal_array u8) Java_Object => intrinsic_constructor
# convert a Java String to a string
#
private java_string_to_string(# T is the actual String type, i.e., Java.java.lang._jString:
#
T type : Java_String,
# the java String wrapped in Java.java.lang._jString
js T
) String => intrinsic
# intrinsic to convert an i8 to a Java Byte object
#
public i8_to_java_object(v i8) Java_Object => intrinsic_constructor
# intrinsic to convert an u16 to a Java Character object
#
public u16_to_java_object(v u16) Java_Object => intrinsic_constructor
# intrinsic to convert an i16 to a Java Short object
#
public i16_to_java_object(v i16) Java_Object => intrinsic_constructor
# intrinsic to convert an i32 to a Java Integer object
#
public i32_to_java_object(v i32) Java_Object => intrinsic_constructor
# intrinsic to convert an i64 to a Java Long object
#
public i64_to_java_object(v i64) Java_Object => intrinsic_constructor
# intrinsic to convert an f32 to a Java Float object
#
public f32_to_java_object(v f32) Java_Object => intrinsic_constructor
# intrinsic to convert a f64 to a Java Double object
#
public f64_to_java_object(v f64) Java_Object => intrinsic_constructor
# intrinsic to convert a bool to a Java Boolean object
#
public bool_to_java_object(b bool) Java_Object => intrinsic_constructor