src: cleanup importations
[nit.git] / src / common_ffi / common_ffi.nit
index 2a9e7d4..cb9c244 100644 (file)
 # to wrap foreign code in Nit methods.
 module common_ffi
 
-import parser
 import modelbuilder
 
 import nitni
 
-import ffi_base
+intrude import ffi_base
 import extern_classes
 import header_dependency
 import pkgconfig
@@ -32,6 +31,7 @@ import c_compiler_options
 import c
 import cpp
 import java
+import extra_java_files
 
 redef class MModule
        # Does this module uses the FFI?
@@ -62,6 +62,11 @@ redef class MModule
                ffi_ccu.write_as_impl(self, compdir)
                for filename in ffi_ccu.files do ffi_files.add(new ExternCFile(filename, c_compiler_options))
        end
+
+       # Avoid the compile a ffi propdef more than once
+       # See `AMethPropdef::compile_ffi_method`
+       # FIXME find a better way
+       private var compiled_ffi_methods = new HashSet[AMethPropdef]
 end
 
 redef class AModule
@@ -87,6 +92,13 @@ redef class AModule
 
                ffi_ccu.header_c_base.add( "#include \"{mmodule.name}._nitni.h\"\n" )
 
+               ffi_ccu.body_decl.add("#ifdef ANDROID\n")
+               ffi_ccu.body_decl.add(" #include <android/log.h>\n")
+               ffi_ccu.body_decl.add(" #define PRINT_ERROR(...) (void)__android_log_print(ANDROID_LOG_WARN, \"Nit\", __VA_ARGS__)\n")
+               ffi_ccu.body_decl.add("#else\n")
+               ffi_ccu.body_decl.add(" #define PRINT_ERROR(...) fprintf(stderr, __VA_ARGS__)\n")
+               ffi_ccu.body_decl.add("#endif\n")
+
                for nclassdef in n_classdefs do
                        # Does it declares an extern type?
                        if nclassdef isa AStdClassdef and nclassdef.n_extern_code_block != null then
@@ -101,16 +113,14 @@ redef class AModule
        end
 end
 
-redef class AExternPropdef
-       private var ffi_has_been_compiled = false
-
+redef class AMethPropdef
        # Compile the necessary wrapper around this extern method or constructor
        fun compile_ffi_method(mmodule: MModule)
        do
                assert n_extern_code_block != null
 
-               if ffi_has_been_compiled then return
-               ffi_has_been_compiled = true
+               if mmodule.compiled_ffi_methods.has(self) then return
+               mmodule.compiled_ffi_methods.add self
 
                var language = n_extern_code_block.language
                assert language != null