lib/java: fix typo
[nit.git] / lib / java / java.nit
index d9d1f27..6358430 100644 (file)
@@ -27,8 +27,8 @@
 # most of JNI functions. You can use it to further customize the behavior
 # of your code.
 module java is
-       c_compiler_option("-I $(JAVA_HOME)/include/")
-       c_linker_option("-L $(JNI_LIB_PATH) -ljvm")
+       cflags "-I $(JAVA_HOME)/include/ -I $(JAVA_HOME)/include/linux/"
+       ldflags "-L $(JNI_LIB_PATH) -ljvm"
        new_annotation extra_java_files
 end
 
@@ -38,7 +38,7 @@ redef class Sys
        private var jvm_cache: nullable JavaVM = null
        private var jni_env_cache: nullable JniEnv = null
 
-       # Default Java Virtual Machine to use (will be instanciated using
+       # Default Java Virtual Machine to use (will be instantiated using
        # `create_default_jvm` if not already set)
        fun jvm: JavaVM
        do
@@ -59,13 +59,13 @@ redef class Sys
        # Sets the current default JNI env (use with `jvm=`)
        fun jni_env=(jni_env: JniEnv) do jni_env_cache = jni_env
 
-       # Called by `jvm` and `jni_env` to instanciate a Java Virual Machine.
+       # Called by `jvm` and `jni_env` to instantiate a Java Virtual Machine.
        # Used mostly for the FFI with Java.
        protected fun create_default_jvm
        do
                var builder = new JavaVMBuilder
 
-               # By default, look for Java classes in a jar file the same dir as the executable
+               # By default, look for Java classes in a jar file the same directory as the executable
                builder.options.add "-Djava.class.path={sys.program_name}.jar"
 
                var jvm = builder.create_jvm
@@ -79,7 +79,7 @@ redef class Sys
        fun load_jclass(name: NativeString): JClass import jni_env `{
                JNIEnv *nit_ffi_jni_env = Sys_jni_env(recv);
 
-               // retreive the implementation Java class
+               // retrieve the implementation Java class
                jclass java_class = (*nit_ffi_jni_env)->FindClass(nit_ffi_jni_env, name);
                if (java_class == NULL) {
                        fprintf(stderr, "Nit FFI with Java error: failed to load class.\\n");
@@ -98,8 +98,6 @@ end
 extern class JavaString in "Java" `{ java.lang.String `}
        super JavaObject
 
-       redef type SELF: JavaString
-
        # Get the string from Java and copy it to Nit memory
        fun to_cstring: NativeString import sys, Sys.jni_env `{
                Sys sys = JavaString_sys(recv);
@@ -135,11 +133,11 @@ redef class NativeString
 end
 
 redef class Text
+       # Get `self` as a `JavaString`
        fun to_java_string: JavaString do return to_cstring.to_java_string
 end
 
 redef extern class JavaObject
-       type SELF: JavaObject
 
        # Returns a global reference to the Java object behind this reference
        #
@@ -167,7 +165,7 @@ redef extern class JavaObject
 
        # Pops the current local reference frame and return a valid reference to self
        #
-       # Similiar to `JavaVM::pop_local_frame` but returns a value.
+       # Similar to `JavaVM::pop_local_frame` but returns a value.
        fun pop_from_local_frame: SELF
        do
                var jni_env = sys.jni_env
@@ -177,4 +175,26 @@ redef extern class JavaObject
        private fun pop_from_local_frame_with_env(jni_env: JniEnv): SELF `{
                return (*jni_env)->PopLocalFrame(jni_env, recv);
        `}
+
+       # Is `self` null in Java?
+       #
+       # Since Java type system doesn't have the same `nullable` concept as Nit's,
+       # the two systems are not directly compatible. Any Nit instances of
+       # `JavaObject` may hold a Java null.
+       #
+       # To benefit from the safer type system of Nit, it is recommended to check
+       # the return of all extern methods implemented in Java to ensure the value
+       # is not a Java null. In case it is, you should replace it by a normal Nit
+       # `null`.
+       fun is_java_null: Bool in "Java" `{ return recv == null; `}
+
+       # `JavaString` representation of `self` using Java's `toString`
+       fun to_java_string: JavaString in "Java" `{ return recv.toString(); `}
+
+       # Use Java's `toString` for any `JavaObject`
+       redef fun to_s
+       do
+               if is_java_null then return super
+               return to_java_string.to_s
+       end
 end